'NoneType' nesnesinin özelliği yok


10

Python jeo-uzamsal programlamasında yeniyim. Aşağıdaki komut dosyasını çalıştırdım ve ilgili hata mesajını aldım

>>> 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'

Kodunuzu yerel olarak denedim ve çalışıyor. Peki, hangi GDAL sürümünü yüklediniz?
Crischan

Komut dosyası, şekil dosyası verilerinize erişemedi. Lütfen python komut dosyasını verilerinizi içeren klasöre, yani tl_2009_us_state.shpdosyayı kaydedin .
CalebJ

Yanıtlar:


17

Temel olarak, Python'da bunun söylediği şey, şekil dosyasını açma girişiminizin başarısız olmasıdır. Osgeo.ogr.Open () gibi bir şey başarısız olduğunda, genellikle sizin durumunuzda değişken "shapefile" değişkeninize atanan None değerini döndürür. Daha sonra şekil dosyasına erişmeye çalıştığınızda, şekil dosyasının "NoneType" (osgeo'nun oluşturacağı nesne türü yerine) olduğunu ve NoneType nesnelerinin GetLayerCount yöntemine sahip olmadığını söyler.

Bunu nasıl düzeltirsiniz? İlk olarak, kodunuzdaki hataları test edin - size daha iyi mesajlar verecektir. Gibi bir şey:

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

Şimdi, şekil dosyanızın neden yüklenmediği sorusunu yanıtlamamız gerekiyor. Tahminimce osgeo şu anda sağlanan yolla şekil dosyanızı bulamadığı için tam yol (örneğin, "C: \ Kullanıcılar ... \ tl_2009_us_state.shp") sağlamanız gerekiyor. Yine de bu bir önsezi.


1
Hayır, bu "Python speak" değil. Mike'ın dediği gibi, Hiçbiri döndürmek yerine, osgeo.ogr bunu yapmalıdır: "IOError [kısa açıklama]".
sgillies

Maalesef, söylemeye çalıştığım şey, "'NoneType' nesnesinin 'GetLayerCount' niteliği yok", herhangi bir nedenle, herhangi bir nedenle atanmamış bir nesnenin atanmasını beklediğinizde ortaya çıkan oldukça standart bir Python hata iletisidir. atandı. Üzgünüm bu belli değildi.
nicksan

7

@ Nick'in yanıtı doğrudur: "NoneType", veri kaynağının açılamadığı anlamına gelir. OGR (ve GDAL) normalde olması gereken yerlerde istisnalar oluşturmaz ve maalesef ogr.UseExceptions()yararlı bir şey yapmıyor gibi görünüyor. İşte aslında uygun istisnaları yükseltmek için her zamanki kod bloğum:

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

Daha önce bu hatayla karşılaştım ve uzun süredir onunla sıkışıp kaldım. Farklı bir şekil dosyası kullanarak işe aldım. ABD Tiger şekil dosyası bozulmuş veya başka bir şey olmalıdır. Burada gdal1.6 kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.