Objek 'NoneType' tidak memiliki atribut


10

Saya baru mengenal pemrograman geospasial python. saya menjalankan skrip berikut dan mendapatkan pesan kesalahan yang sesuai

>>> import osgeo
>>> import osgeo.ogr
>>> shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")
>>> numLayers = shapefile.GetLayerCount()

Traceback (most recent call last):   
    File "<pyshell#5>", line 1, in <module>
    numLayers = shapefile.GetLayerCount() AttributeError: 'NoneType' object has no attribute 'GetLayerCount'

Mencoba kode Anda secara lokal dan berfungsi. Jadi, versi GDAL mana yang sudah Anda instal?
Crischan

Skrip tidak dapat mengakses data shapefile Anda. Mohon simpan skrip python dalam folder yang berisi data Anda, yaitu tl_2009_us_state.shpfile.
CalebJ

Jawaban:


17

Jadi pada dasarnya, apa yang dikatakannya, dengan Python, adalah bahwa usaha Anda untuk membuka shapefile gagal. Ketika sesuatu seperti osgeo.ogr.Open () gagal, biasanya mengembalikan None, yang, dalam kasus Anda, akan ditugaskan ke variabel "shapefile" Anda. Saat Anda mencoba mengakses shapefile nanti, ia memberi tahu Anda bahwa shapefile adalah "NoneType" (bukan tipe objek yang akan dibuat osgeo) dan bahwa objek NoneType tidak memiliki metode GetLayerCount.

Bagaimana kamu memperbaiki ini? Pertama, uji kesalahan dalam kode Anda - itu akan memberi Anda pesan yang lebih baik. Sesuatu seperti:

import osgeo
import osgeo.ogr
try:
    shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")

    if shapefile: # checks to see if shapefile was successfully defined
        numLayers = shapefile.GetLayerCount()
    else: # if it's not successfully defined
        print "Couldn't load shapefile"
except: # Seems redundant, but if an exception is raised in the Open() call,
    #   # you get a message
    print "Exception raised during shapefile loading"

    # if you want to see the full stacktrace - like you are currently getting,
    # then you can add the following:
    raise

Jadi, sekarang kita perlu menjawab pertanyaan mengapa shapefile Anda tidak dimuat. Dugaan saya adalah bahwa Anda perlu memberikan path yang sepenuhnya memenuhi syarat (yaitu, "C: \ Users ... \ tl_2009_us_state.shp") karena osgeo tidak dapat menemukan shapefile Anda dengan path yang saat ini disediakan. Tapi itu firasat.


1
Tidak, itu sama sekali bukan "Python speak". Seperti kata Mike di bawah ini, alih-alih mengembalikan Tidak ada, inilah yang harus dilakukan osgeo.ogr: "IOError [deskripsi singkat]".
sgillies

Maaf, apa yang saya coba katakan adalah bahwa "objek 'NoneType' tidak memiliki atribut 'GetLayerCount'" adalah pesan kesalahan Python standar yang cukup sering terjadi ketika Anda mengharapkan suatu objek telah ditetapkan bahwa, untuk alasan apa pun, tidak ditugaskan. Maaf itu tidak jelas.
nicksan

7

@Jawaban Nick benar: "NoneType" berarti bahwa sumber data tidak dapat dibuka. OGR (dan GDAL) tidak menaikkan pengecualian di mana mereka biasanya harus, dan sayangnya ogr.UseExceptions()tampaknya tidak melakukan sesuatu yang berguna. Ini adalah blok kode saya yang biasa untuk benar-benar meningkatkan pengecualian yang tepat:

from osgeo import ogr

# Change this to your OGR data source
ds_fname = r'C:\temp\tl_2009_us_state.shp'

ds = ogr.Open(ds_fname)
if not ds:
    raise IOError("Could not open '%s'"%ds_fname)

numLayers = ds.GetLayerCount()
...

1

Saya telah menemukan kesalahan ini sebelumnya dan telah terjebak dengannya begitu lama. Saya membuatnya bekerja dengan menggunakan shapefile yang berbeda. Shapefile US Tiger pasti rusak atau apalah. Saya menggunakan gdal1.6 di sini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.