「NoneType」オブジェクトには属性がありません


10

私はpython地理空間プログラミングを初めて使用します。次のスクリプトを実行して、対応するエラーメッセージを取得しました

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

ローカルでコードを試してみましたが、機能します。では、GDALのどのバージョンをインストールしましたか?
クリスチャン

スクリプトはシェープファイルデータにアクセスできませんでした。データ、つまりtl_2009_us_state.shpファイルを含むフォルダー内にPythonスクリプトを保存してください。
CalebJ 2018

回答:


17

つまり、基本的に、これはPythonで言うと、シェープファイルを開く試みが失敗したということです。osgeo.ogr.Open()のようなものが失敗すると、通常はNoneを返します。この場合、Noneが変数「シェイプファイル」に割り当てられます。その後、シェープファイルにアクセスしようとすると、シェープファイルは(osgeoが作成するオブジェクトのタイプではなく)「NoneType」であり、NoneTypeオブジェクトにはメソッドGetLayerCountがないことがわかります。

これをどのように修正しますか?まず、コードのエラーをテストします。これにより、より適切なメッセージが得られます。何かのようなもの:

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

したがって、シェープファイルがロードされない理由についての質問に答える必要があります。osgeoは現在提供されているパスでシェープファイルを見つけることができないため、完全修飾パス(つまり、「C:\ Users ... \ tl_2009_us_state.shp」)を指定する必要があると思います。でもそれは直感です。


1
いいえ、それは「Pythonが話す」ことではありません。Mikeが以下に述べるように、Noneを返す代わりに、これはosgeo.ogrがすべきことです: "IOError [簡単な説明]"。
sgillies

申し訳ありませんが、「 'NoneType'オブジェクトには属性 'GetLayerCount'がありません」は、標準的なPythonエラーメッセージであり、何らかの理由でオブジェクトに割り当てられていると思われる場合によく発生します。割り当てられます。すみません、はっきりしていませんでした。
-nicksan

7

@Nickの答えは正しいです。「NoneType」は、データソースを開けなかったことを意味します。OGR(およびGDAL)は、通常必要な場所で例外を発生さogr.UseExceptions()せません。残念ながら、有用なことは何もしていません。これが実際に適切な例外を発生させるための通常のコードブロックです。

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

私は以前にこのエラーに遭遇し、長い間このエラーに悩まされてきました。別のシェープファイルを使用して機能させました。US Tigerシェープファイルが破損しているか、何かが必要です。ここではgdal1.6を使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.