Nhận tên trường của shapefiles bằng GDAL


15

Tôi sử dụng GDAL trong Python để nhập shapefile. Tôi muốn biết tên trường cho tệp, cách hiện tại của tôi là:

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

Nhưng theo cách này, tôi nhận được tính năng cho lớp đầu tiên. Có nghĩa là các lớp khác nhau có thể có các tính năng khác nhau?

Nếu không, có thể lấy tên trường ngay lập tức, thay vì đi sâu vào đây không? Nếu có, có cách nào dễ dàng hơn để có được tên trường không?


Shapefile luôn chỉ có một lớp. Tôi cũng tin rằng mỗi tính năng có cùng thuộc tính nên chỉ kiểm tra tính năng đầu tiên là đủ.
dùng49584

Câu trả lời:


24

1) shapefile riêng lẻ: như trong nhận xét, một shapefile chỉ có một lớp. Nếu bạn chỉ muốn tên của các lĩnh vực

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

Bạn có thể sử dụng định dạng GeoJSON với trình tạo Python ( ogr_geulumface.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']

Điều này giới thiệu Fiona (một trình bao bọc Python khác của OGR, Python 2.7.x và 3.x). Tất cả các kết quả là từ điển Python (định dạng 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 + gấu trúc , Python 2.7.x và 3.x). Kết quả là một DataFrame Pandas (= 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)

nhập mô tả hình ảnh ở đây

2) Nhiều shapefile: nếu bạn muốn lặp qua nhiều shapefile trong một thư mục

Với 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

hoặc với một máy phát điện

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()

Với Fiona

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
Đây là một câu trả lời tuyệt vời đầy đủ!
Kersten

11

Sử dụng:

from osgeo import ogr

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

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

Hoàn hảo. Đó là tất cả những gì cần thiết
Ishan Tomar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.