क्या एक आर्केप लाइसेंस के बिना पाइथन का उपयोग करके शेपफाइल की सामग्री को देखना संभव है?


40

मुझे आश्चर्य हुआ कि क्या बिना और आर्केप के लाइसेंस के बिना पाइथन का उपयोग करके एक आकृति की सामग्री को देखना संभव है। स्थिति यह है कि आप ईएसआरआई सॉफ्टवेयर से ही नहीं, कई अलग-अलग अनुप्रयोगों से आकार-प्रकार बना सकते हैं। मैं एक पायथन स्क्रिप्ट बनाना चाहूंगा जो स्थानिक संदर्भ, फीचर प्रकार, विशेषता नाम और परिभाषाएं और फ़ील्ड्स की सामग्री को एक आकृति में चेक करती है और उनकी तुलना स्वीकार्य मानों के एक सेट से करती है। मैं इस स्क्रिप्ट को काम करना चाहूंगा, भले ही संगठन के पास कोई ईएसआरआई लाइसेंस न हो। इस तरह से कुछ करने के लिए, आपको आर्कपी का उपयोग करना होगा या क्या आप आर्कपी का उपयोग किए बिना एक आकार में खोद सकते हैं?


1
यह इस बात पर निर्भर करता है कि आप इसमें कितना प्रयास करना चाहते हैं .. कई ओपन सोर्स लाइब्रेरी हैं जो मदद करेंगी (मैं हारून के जवाब के अनुसार ओजीआर पसंद करता हूं) लेकिन अगर आप वास्तव में नियंत्रण चाहते हैं (और इसके लिए काम करने के लिए तैयार हैं) (मूल रूप से Esri द्वारा) एक खुला प्रारूप देखें en.wikipedia.org/wiki/Shapefile
माइकल स्टिम्सन

1
हाल ही में (पिछले कुछ वर्षों में) ESRI शेपफाइल्स अपने नए जियोडेटाबेस प्रारूप में छिपे हुए हैं। ऐसा लगता है कि ARCxxx सॉफ्टवेयर के अलावा कुछ भी उन्हें तोड़ नहीं सकता है। कई सार्वजनिक एजेंसियां ​​सार्वजनिक सूचना के लिए इसका इस्तेमाल कर रही हैं ... शर्म की बात है।

जवाबों:


34

मैं वेक्टर और रेखापुंज डेटा दोनों के साथ काम करने के लिए पायथन जीडीएएल / ओजीआर एपीआई से परिचित होने की सलाह दूंगा । GDAL / OGR का उपयोग शुरू करने का सबसे आसान तरीका एक अजगर वितरण के माध्यम से है जैसे कि अजगर (x, y) , एनाकोंडा , या OSGeo4W

अपने विशिष्ट कार्यों के लिए GDAL का उपयोग करने के बारे में अधिक जानकारी:

इसके अतिरिक्त, मैं आपको शुरू करने के लिए USU से निम्नलिखित ट्यूटोरियल की सिफारिश करूंगा।


उपरोक्त उदाहरणों से उधार लेकर, निम्न स्क्रिप्ट 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()


अंतर्दृष्टि @MikeT के लिए धन्यवाद। GDAL / OGR प्रलेखन अपनी रसोई की किताब में 'नष्ट ()' विधि का उपयोग करता है। उस पद्धति के साथ आप क्या मुद्दे देखते हैं?
हारून

1
ऐसी स्थितियां हैं जहां सेगफॉल्ट हो सकता है जब आप नष्ट () का उपयोग करते हैं, और बाइंडिंग में इस पद्धति को उजागर करना एक डिजाइन गलती थी। एक बेहतर तरीका यह है कि GDAL ऑब्जेक्ट को डिफरेंस करें inFeature = None। GDAL / OGR कोरबुक टीम का हिस्सा नहीं है, या GDAL / OGR कोरबुक द्वारा लिखित है।
माइक टी

@ माइक ने आपकी टिप्पणियों को शामिल करने के लिए पोस्ट को संपादित किया है - धन्यवाद।
आरोन

31

पाइथन में शेपफाइल्स को पढ़ने के लिए कई मॉड्यूल हैं, जो आर्कपी से अधिक पुराना है, पाइथन पैकेज इंडेक्स (PyPi) को देखें: शेपफाइल्स । जीआईएस एसई में कई उदाहरण भी हैं (उदाहरण के लिए [पायथन] फियोना की खोज करें )

सभी ज्यामिति, क्षेत्रों और अनुमानों को पढ़ सकते हैं।

लेकिन पायस के रूप में अन्य मॉड्यूल : पायथन स्पेसियल एनालिसिस लाइब्रेरी , कार्टोपी (जो pyshp का उपयोग करते हैं ) या माटप्लोटलिब बेसमैप अन्य चीजों के अलावा शेपफाइल्स भी पढ़ सकते हैं।

फियोना का उपयोग करना सबसे आसान है , लेकिन यदि आप केवल आर्कपी को जानते हैं, तो pyshp का उपयोग करें , क्योंकि ओस्जियो और फियोना को यह आवश्यक है कि GDAL C / C ++ लाइब्रेरी स्थापित हो, 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')])}

Pyshp के साथ (पायथन शब्दकोशों के रूप में)

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}

GeoPandas के साथ (पंडों डेटाफ्रेम के रूप में)

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)

* जियोपान्ड पर ध्यान दें आपको इसके साथ फियोना और जीडीएएल के पुराने संस्करणों का उपयोग करना होगा या यह स्थापित नहीं होगा। GDAL: 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

यदि आप अन्य पुस्तकालयों में रुचि रखते हैं, तो आवश्यक Python Geospatial पुस्तकालयों पर यह पोस्ट एक अच्छी जगह है।


1
Pyshp के लिए +1, उपयोग करने के लिए सुपर आसान और सीधा। ओपी चाहता है कि सब कुछ समायोजित हो जाए।
mr.adam
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.