GDAL का उपयोग करके आकार-प्रकार के फ़ील्ड नाम प्राप्त करें


15

मैं शेफाइल आयात करने के लिए पायथन में 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) व्यक्तिगत शेपफाइल: टिप्पणी की तरह, एक शेपफाइल में केवल एक परत होती है। अगर आप केवल खेतों के नाम चाहते हैं

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

आप पायथन जनरेटर ( 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']

यह फियोना (ओजीआर का दूसरा पायथन रैपर, पायथन 2.7.x और 3.x) का परिचय देता है। सभी परिणाम पायथन डिक्शनरी (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)])}

और जियोपांडस (फियोना + पांडा , पायथन 2.7.x और 3.x)। परिणाम एक पंडों 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
यह एक उत्कृष्ट संपूर्ण उत्तर है!
केर्स्टन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.