জিডিএল ব্যবহার করে শেফফিলের ফিল্ডের নাম পান


15

আমি শেফফাইল আমদানির জন্য পাইথনে জিডিএল ব্যবহার করি। আমি ফাইলটির ক্ষেত্রের নামগুলি জানতে চাই, আমার বর্তমান উপায়টি হ'ল:

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

তবে এইভাবে, আমি প্রথম স্তরের জন্য বৈশিষ্ট্যটি পাচ্ছি। এর অর্থ কি এটি সম্ভব যে বিভিন্ন স্তরের বিভিন্ন বৈশিষ্ট্য থাকতে পারে?

যদি তা না হয় তবে এই গভীরতায় যাওয়ার পরিবর্তে মাঠের নামগুলি একবারে পাওয়া কি সম্ভব? যদি হ্যাঁ, তবে ক্ষেত্রের নাম পাওয়ার কোনও সহজ উপায় আছে?


শেপফাইলে সর্বদা একটি মাত্র স্তর থাকে। আমি আরও বিশ্বাস করি যে প্রতিটি বৈশিষ্ট্যের একই বৈশিষ্ট্য রয়েছে তাই কেবলমাত্র প্রথম বৈশিষ্ট্যটি পরীক্ষা করা যথেষ্ট।
ব্যবহারকারী 30184

উত্তর:


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 )

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

এটি ফিওনা (ওজিআরের আর একটি পাইথন মোড়ক, পাইথন ২.7.x এবং ৩.x) উপস্থাপন করে। সমস্ত ফলাফল পাইথন অভিধান (জিওজেএসএন ফর্ম্যাট)।

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, + + পান্ডাস , পাইথন 2.7.x এবং 3.x)। ফলাফলটি একটি পান্ডাস ডেটা ফ্রেম (= জিওডাটাফ্রেম)।

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.