আর্কম্যাপ লাইসেন্স ব্যতীত পাইথন ব্যবহার করে শেফিলের বিষয়বস্তুগুলি কি সন্ধান করা সম্ভব?


40

আমি অবাক হয়েছি আর আর্কম্যাপ লাইসেন্স ছাড়াই পাইথন ব্যবহার করে কোনও শেফফিলের বিষয়বস্তুগুলি খুঁজে পাওয়া সম্ভব কিনা। পরিস্থিতিটি হ'ল আপনি কেবল ইএসআরআই সফ্টওয়্যার থেকে নয়, অনেকগুলি বিভিন্ন অ্যাপ্লিকেশন থেকে শেফফাইল তৈরি করতে পারেন। আমি একটি পাইথন স্ক্রিপ্ট তৈরি করতে চাই যা স্থানিক রেফারেন্স, বৈশিষ্ট্য প্রকার, বৈশিষ্ট্য নাম এবং সংজ্ঞা এবং ক্ষেত্রের বিষয়বস্তুগুলিকে একটি শেফফাইলে পরীক্ষা করে এবং গ্রহণযোগ্য মানের একটি সেটের সাথে তুলনা করে। প্রতিষ্ঠানের কোনও ESRI লাইসেন্স না থাকলেও আমি এই স্ক্রিপ্টটি কাজ করতে চাই। এরকম কিছু করার জন্য, আপনার কি আরকিপি ব্যবহার করতে হবে বা আপনি আরকিপাই ব্যবহার না করে কোনও শেফফাইলে খনন করতে পারেন?


1
এটি এর মধ্যে আপনি কতটা প্রচেষ্টা রাখতে চান তার উপর নির্ভর করে .. বেশ কয়েকটি ওপেন সোর্স লাইব্রেরি রয়েছে যা সাহায্য করবে (আ্যারোনসের উত্তর অনুসারে আমি ওজিআর পছন্দ করি) তবে আপনি যদি সত্যই নিয়ন্ত্রণ চান (এবং এটির জন্য কাজ করার জন্য প্রস্তুত) শেপফিল (মূলত এসরি দ্বারা) একটি উন্মুক্ত ফর্ম্যাট দেখুন en.wikedia.org/wiki/Shapefile
মাইকেল সিসটেমন

1
সাম্প্রতিক (শেষ কয়েক বছর) ইএসআরআই শেফফাইলগুলি তাদের নতুন জিওডাটাবেস ফর্ম্যাটে লুকানো রয়েছে। দেখে মনে হচ্ছে এআরসিএক্সএক্সএক্স সফ্টওয়্যার ব্যতীত তাদের কিছুই ভাঙতে পারে না। অনেক সরকারী সংস্থা এটি জনসাধারণের তথ্যের জন্য ব্যবহার করছে ... লজ্জাজনক।

উত্তর:


34

আমি ভেক্টর এবং রাস্টার উভয় ডেটার সাথেই কাজ করার জন্য পাইথন জিডিএল / ওজিআর এপিআইয়ের সাথে পরিচিত হওয়ার পরামর্শ দেব । জিডিএল / ওজিআর ব্যবহার শুরু করার সবচেয়ে সহজ উপায় হল পাইথন (x, y) , অ্যানাকোন্ডা বা ওএসজিও 4 ডাব্লুয়ের মতো পাইথন বিতরণ ।

আপনার নির্দিষ্ট কাজের জন্য জিডিএল ব্যবহারের বিষয়ে আরও বিশদ:

অতিরিক্তভাবে, আমি আপনাকে শুরু করতে ইউএসইউ থেকে নিম্নলিখিত টিউটোরিয়াল সুপারিশ করব।


উপরের উদাহরণগুলি থেকে ধার করে, নিম্নলিখিত স্ক্রিপ্টটি নিম্নলিখিত ক্রিয়া সম্পাদন করতে FOSS সরঞ্জামগুলি ব্যবহার করে:

  1. স্থানিক রেফারেন্স পরীক্ষা করুন
  2. শেফফিল ক্ষেত্র এবং প্রকারগুলি পান
  3. ব্যবহারকারী-সংজ্ঞায়িত ক্ষেত্রের সারিগুলিতে কিছু মান রয়েছে কিনা তা পরীক্ষা করুন

# Import the necessary modules
from  osgeo import ogr, osr

driver = ogr.GetDriverByName('ESRI Shapefile')
shp = driver.Open(r'C:\your\shapefile.shp')

# Get Projection from layer
layer = shp.GetLayer()
spatialRef = layer.GetSpatialRef()
print spatialRef

# Get Shapefile Fields and Types
layerDefinition = layer.GetLayerDefn()

print "Name  -  Type  Width  Precision"
for i in range(layerDefinition.GetFieldCount()):
    fieldName =  layerDefinition.GetFieldDefn(i).GetName()
    fieldTypeCode = layerDefinition.GetFieldDefn(i).GetType()
    fieldType = layerDefinition.GetFieldDefn(i).GetFieldTypeName(fieldTypeCode)
    fieldWidth = layerDefinition.GetFieldDefn(i).GetWidth()
    GetPrecision = layerDefinition.GetFieldDefn(i).GetPrecision()
    print fieldName + " - " + fieldType+ " " + str(fieldWidth) + " " + str(GetPrecision)

# Check if rows in attribute table meet some condition
inFeature = layer.GetNextFeature()
while inFeature:

    # get the cover attribute for the input feature
    cover = inFeature.GetField('cover')

    # check to see if cover == grass
    if cover == 'trees':
        print "Do some action..."

    # destroy the input feature and get a new one
    inFeature = None
    inFeature = inLayer.GetNextFeature()


অন্তর্দৃষ্টি @ মাইকটি জন্য ধন্যবাদ। জিডিএল / ওজিআর ডকুমেন্টেশনগুলি তাদের কুকবুক জুড়ে 'ধ্বংস ()' পদ্ধতি ব্যবহার করে। এই পদ্ধতিটি দিয়ে আপনি কোন বিষয়গুলি দেখছেন?
হারুন

1
এমন পরিস্থিতিতে রয়েছে যখন আপনি ডাস্ট্রয় () ব্যবহার করার সময় সেগফোল্টস হতে পারে এবং বাইন্ডিংগুলিতে এই পদ্ধতিটি প্রকাশ করার জন্য এটি একটি ডিজাইনের ভুল ছিল। আরও ভাল পদ্ধতি হ'ল জিডিএল অবজেক্টের মতো ডিফারেন্স করা inFeature = None। জিডিএল / ওজিআর কুকবুক অংশ নয়, বা জিডিএল / ওজিআর কোর দল দ্বারা লিখিত নয়।
মাইক টি

@ মাইকটি আমি আপনার মন্তব্যগুলি অন্তর্ভুক্ত করতে পোস্টটি সম্পাদনা করেছি - ধন্যবাদ।
হারুন

31

পাইথনে আকৃতির ফাইলগুলি পড়ার জন্য অনেকগুলি মডিউল রয়েছে, আরকিপির চেয়ে পুরানো, পাইথন প্যাকেজ সূচক (পাইপিআই): শেফফায়ালগুলি দেখুন । জিআইএস এসইতেও অনেকগুলি উদাহরণ রয়েছে ( উদাহরণস্বরূপ [পাইথন] ফিয়োনার সন্ধান করুন )

সমস্ত জ্যামিতি, ক্ষেত্রগুলি এবং অনুমানগুলি পড়তে পারে।

তবে পাইসএল হিসাবে অন্যান্য মডিউলগুলি : পাইথন স্পেসিয়াল অ্যানালাইসিস লাইব্রেরি , কার্টোপি (যা পাইশপ ব্যবহার করে ) বা ম্যাটপ্ল্লোলিব বেসম্যাপ অন্যান্য জিনিসগুলির মধ্যেও শেফফাইলগুলি পড়তে পারে।

ব্যবহারের সবচেয়ে সহজ পদ্ধিতি হল Fiona, তবে যদি আপনি শুধুমাত্র ArcPy, ব্যবহার জানেন pyshp , কারণ osgeo এবং Fiona, প্রয়োজন যে GDAL সি / সি ++ লাইব্রেরি ইনস্টল করা, GeoPandas প্রয়োজন পান্ডাস মডিউল এবং PySAL অত্যন্ত বড় (অনেক, অনেক অন্যদের চিকিত্সা)

আপনি যদি কেবল শেফফিলের বিষয়বস্তু পড়তে চান তবে আপনার জটিল জিনিসগুলির দরকার নেই, কেবল জিপ ইন্টারফেস প্রোটোকল ( জিওজেএসএন ) ব্যবহার করুন আরকিপিতে ( অর্কিপাই: অ্যাশপ )

ফিওনা (পাইথন অভিধান হিসাবে) সহ:

import fiona
with fiona.open('a_shape.shp') as shp:
     # schema of the shapefile
     print shp.schema
     {'geometry': 'Point', 'properties': OrderedDict([(u'DIP', 'int:2'), (u'DIP_DIR', 'int:3'), (u'TYPE', 'str:10')])}
     # projection
     print shp.crs
     {u'lon_0': 4.367486666666666, u'ellps': u'intl', u'y_0': 5400088.438, u'no_defs': True, u'proj': u'lcc', u'x_0': 150000.013, u'units': u'm', u'lat_2': 49.8333339, u'lat_1': 51.16666723333333, u'lat_0': 90}
     for feature in shp:
        print feature              
{'geometry': {'type': 'Point', 'coordinates': (272070.600041, 155389.38792)}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'DIP', 30), (u'DIP_DIR', 130), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (271066.032148, 154475.631377)}, 'type': 'Feature', 'id': '1', 'properties': OrderedDict([(u'DIP', 55), (u'DIP_DIR', 145), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (273481.498868, 153923.492988)}, 'type': 'Feature', 'id': '2', 'properties': OrderedDict([(u'DIP', 40), (u'DIP_DIR', 155), (u'TYPE', u'incl')])}

পাইশপ সহ (পাইথন অভিধান হিসাবে)

import shapefile
reader= shapefile.Reader("a_shape.shp")
# schema of the shapefile
print dict((d[0],d[1:]) for d in reader.fields[1:])
{'DIP_DIR': ['N', 3, 0], 'DIP': ['N', 2, 0], 'TYPE': ['C', 10, 0]}
fields = [field[0] for field in reader.fields[1:]]
for feature in reader.shapeRecords():
    geom = feature.shape.__geo_interface__
    atr = dict(zip(fields, feature.record))
    print geom, atr
{'type': 'Point', 'coordinates': (272070.600041, 155389.38792)} {'DIP_DIR': 130, 'DIP': 30, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (271066.032148, 154475.631377)} {'DIP_DIR': 145, 'DIP': 55, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (273481.498868, 153923.492988)} {'DIP_DIR': 155, 'DIP': 40, 'TYPE': 'incl'}

অসজিও / ওগারের সাথে (পাইথন অভিধান হিসাবে)

from osgeo import ogr
reader = ogr.Open("a_shape.shp")
layer = reader.GetLayer(0)
for i in range(layer.GetFeatureCount()):
    feature = layer.GetFeature(i)
    print feature.ExportToJson()
{"geometry": {"type": "Point", "coordinates": [272070.60004, 155389.38792]}, "type": "Feature", "properties": {"DIP_DIR": 130, "DIP": 30, "TYPE": "incl"}, "id": 0}
{"geometry": {"type": "Point", "coordinates": [271066.032148, 154475.631377]}, "type": "Feature", "properties": {"DIP_DIR": 145, "DIP": 55, "TYPE": "incl"}, "id": 1}
{"geometry": {"type": "Point", "coordinates": [273481.49887, 153923.492988]}, "type": "Feature", "properties": {"DIP_DIR": 155, "DIP": 40, "TYPE": "incl"}, "id": 2}

জিওপ্যান্ডাস (প্যান্ডাস ডেটাফ্রেম হিসাবে) সহ

import geopandas as gp
shp = gp.GeoDataFrame.from_file('a_shape.shp')
print shp
        DIP_DIR    DIP  TYPE                       geometry
0         130       30  incl          POINT (272070.600041 155389.38792)
1         145       55  incl          POINT (271066.032148 154475.631377)
2         155       40  incl          POINT (273481.498868 153923.492988)

জিওপ্যান্ডাসে নোট করুন আপনার সাথে এটিতে ফিওনা এবং জিডিএল এর পুরানো সংস্করণ ব্যবহার করতে হবে বা এটি ইনস্টল হবে না। জিডিএল: 1.11.2 ফিয়োনা: 1.6.0 জিওপ্যান্ডাস: 0.1.0.dev-

ওয়েবে এবং এমনকি বইগুলিতে অনেকগুলি টিউটোরিয়াল রয়েছে ( পাইথন জিওপ্যাটিয়াল ডেভলপমেন্ট , পাইথনের সাথে জিওপ্যাটিয়াল বিশ্লেষণ শেখা এবং পাইথনের সাথে জিওপ্রসেসিং , প্রেসে)

আরও সাধারণভাবে, আপনি যদি আরকপাই ছাড়াই পাইথন ব্যবহার করতে চান তবে পাইথন ব্যবহার করে শেফফিলের সাধারণ থিম্যাটিক ম্যাপিংটি দেখুন ?


নোট করুন যে The kinds of data in GIS are roughly divided into rasters representing continuous scalar fields (land surface temperature or elevation, for example) and vectors representing discrete entities like roads and administrative boundaries. Fiona is concerned exclusively with the latter
ফিয়োনার

2
স্পষ্টতই, প্রশ্নটি শেফফায়ালদের সম্পর্কে, না রাস্টারদের। এগুলি রাস্টার ফাইলগুলির জন্য অন্যান্য মডিউল।
জিন

দুর্দান্ত উত্তর! 2017 এ আপডেট করার মতো কিছু?
মাইকেল

11

আর্কপাই ছাড়াও জিওপ্যাটিয়াল পাইথন লাইব্রেরি রয়েছে যা আপনাকে এই দক্ষতা দেবে। এখানে দুটি উদাহরণ দেওয়া হল:

পাইথন শেফিল লাইব্রেরি (pyshp)

GeoPandas

আপনি যদি অন্য লাইব্রেরিতে আগ্রহী হন তবে প্রয়োজনীয় পাইথন জিওস্প্যাটিয়াল লাইব্রেরিতে এই পোস্টটি দেখার জন্য ভাল জায়গা।


1
Pyshp এর জন্য +1, ব্যবহার করা সহজ এবং সহজ। ওপি যা চায় তার সবথেকে ভালো লাগবে।
মিঃআডাম 4'15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.