GDAL을 사용하여 shapefile의 필드 이름 가져 오기


15

shapefile을 가져 오기 위해 Python에서 GDAL을 사용합니다. 파일의 필드 이름을 알고 싶습니다. 현재 방법은 다음과 같습니다.

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

그러나이 방법으로 첫 번째 레이어의 기능을 얻습니다. 다른 레이어가 다른 기능을 가질 수 있다는 것을 의미합니까?

그렇지 않은 경우이 깊이에 들어 가지 않고 한 번에 필드 이름을 가져올 수 있습니까? 그렇다면 필드 이름을 얻는 더 쉬운 방법이 있습니까?


셰이프 파일에는 항상 하나의 레이어 만 있습니다. 또한 각 기능에는 동일한 속성이 있으므로 첫 번째 기능 만 확인하면 충분합니다.
user30184

답변:


24

1) 개별 shapefile : 주석에서와 같이 shapefile에는 레이어가 하나만 있습니다. 필드 이름 만 원하면

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

Python 생성기 ( ogr_geointerface.py ) 와 함께 GeoJSON 형식을 사용할 수 있습니다

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

이 소개합니다 피오나 (OGR, 파이썬 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 (Fiona + pandas , Python 2.7.x 및 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
이것은 매우 철저한 답변입니다!
Kersten

11

사용하다:

from osgeo import ogr

ds = ogr.Open("file.shp")
lyr = ds.GetLayer()

field_names = [field.name for field in lyr.schema]
print(field_names)

완전한. 그게 전부입니다
Ishan Tomar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.