GDALを使用してシェープファイルのフィールド名を取得する


15

シェープファイルをインポートするためにPythonでGDALを使用します。ファイルのフィールド名を知りたいのですが、現在の方法は次のとおりです。

fields = []
for i in range(1, layer.GetFeature(0).GetFieldCount()):
    field = layer.GetFeature(0).GetDefnRef().GetFieldDefn(i).GetName()
    fields.append(field)

しかし、この方法で、最初のレイヤーの機能を取得しています。レイヤーごとに機能が異なる可能性があるということですか?

そうでない場合、これほど深くに入る代わりに、フィールド名を一度に取得することは可能ですか?はいの場合、フィールド名を取得する簡単な方法はありますか?


シェープファイルには常に1つのレイヤーのみがあります。また、各機能には同じ属性があるため、最初の機能だけをチェックすれば十分だと思います。
user30184 16

回答:


24

1)個々のシェープファイル:コメントのように、シェープファイルには1つのレイヤーしかありません。フィールドの名前のみが必要な場合

from osgeo import ogr
source = ogr.Open("a_shapefile.shp")
layer = source.GetLayer()
schema = []
ldefn = layer.GetLayerDefn()
for n in range(ldefn.GetFieldCount()):
    fdefn = ldefn.GetFieldDefn(n)
    schema.append(fdefn.name)
print schema
['dip_dir', 'dip', 'cosa', 'sina']

GeoJSON形式をPythonジェネレーター(ogr_geointerface.py)で使用できます

def records(layer):  
    # generator 
    for i in range(layer.GetFeatureCount()):
        feature = layer.GetFeature(i)
        yield json.loads(feature.ExportToJson())
features = record(layer)
first_feat = features.next()
print first_feat
{u'geometry': {u'type': u'Point', u'coordinates': [272070.600041, 155389.38792]}, u'type': u'Feature', u'properties': {u'dip_dir': 130, u'dip': 30, u'cosa': -0.6428, u'sina': -0.6428}, u'id': 0}
print first_feat['properties'].keys()
[u'dip', u'dip_dir', u'cosa', u'sina']

これにより、Fiona(OGRの別のPythonラッパー、Python 2.7.xおよび3.x)が導入されます。結果はすべてPython辞書(GeoJSON形式)です。

import fiona
shapes = fiona.open("a_shapefile.shp")
shapes.schema
{'geometry': 'Point', 'properties': OrderedDict([(u'dip_dir', 'int:3'), (u'dip', 'int:2'), (u'cosa', 'float:11.4'), (u'sina', 'float:11.4')])}
shapes.schema['properties'].keys()
[u'dip', u'dip_dir', u'cosa', u'sina']
# first feature
shapes.next()
{'geometry': {'type': 'Point', 'coordinates': (272070.600041, 155389.38792)}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'dip_dir', 130), (u'dip', 30), (u'cosa', -0.6428), (u'sina', -0.6428)])}

そしてGeoPandas(フィオナ+ パンダ、Pythonの2.7.35および3.x)。結果はPandas DataFrame(= GeoDataFrame)です。

import geopandas as gpd
shapes = gpd.read_file("a_shapefile.shp")
list(shapes.columns.values)
[u'dip', u'dip_dir', u'cosa', u'sina', 'geometry']
# first features
shapes.head(3)

ここに画像の説明を入力してください

2)複数のシェープファイル:フォルダー内の複数のシェープファイルを反復処理する場合

osgeo.ogrを使用

for subdir, dirs, files in os.walk(rootdir):
     for file in files:
        if file.endswith(".shp"):
           source = ogr.Open(os.path.join(rootdir, file))
           layer = source.GetLayer()
           ldefn = layer.GetLayerDefn()
           schema = [ldefn.GetFieldDefn(n).name  for n in range(ldefn.GetFieldCount())]
           print schema

またはジェネレーター付き

def records(shapefile):  
    # generator 
    reader = ogr.Open(shapefile)
    layer = reader.GetLayer(0)
    for i in range(layer.GetFeatureCount()):
        feature = layer.GetFeature(i)
        yield json.loads(feature.ExportToJson())

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
       if file.endswith(".shp"):
          layer = records(os.path.join(rootdir, file))
          print layer.next()['properties'].keys()

フィオナと

import fiona
for subdir, dirs, files in os.walk(rootdir):
   for file in files:
      if file.endswith(".shp"):
          layer = fiona.open(os.path.join(rootdir, file))
          print layer.schema['properties'].keys()

1
これは非常に網羅的な答えです!
カーステン

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