सुडौल रूप से उपयोग करना: पॉलीगॉन और मल्टीपॉलीगोन के बीच अनुवाद करना


12

[संपादित करें: इसका समाधान केवल ओजीआर का उपयोग शेपफाइल्स को पढ़ने के लिए करना था। जियोग्राफिका का उदाहरण देखें।]

ESRI शेपफाइल में, Polygons और MultiPolygons के बीच कोई अंतर नहीं होता है। इसके अलावा, आंतरिक छेद और बाहरी रिंगों के बीच कोई स्पष्ट अंतर नहीं है (एक दिए गए बहुभुज के "सौम्यता" के अलावा)।

इसलिए शेपफाइल पढ़ने के बाद, मेरे पास रिंगों का वर्णन करने वाले समन्वय अनुक्रमों की एक सूची है, लेकिन कुछ अधिक गहन प्रसंस्करण के बिना, मैं यह भेद नहीं कर सकता कि इनमें से कौन सी रिंग्स बाहरी रिंग्स, आंतरिक छेद या अतिरिक्त बहुभुज हैं।

ऐसा लगता है कि के लिए सुडौल के बहुभुज और MultiPolygon कंस्ट्रक्टर्स, वहाँ बाहरी और आंतरिक के छल्ले के बीच स्पष्ट अंतर होना चाहिए, इसलिए मैं कैसे अलग बहुभुज की एक आदेश दिया सेट करने के लिए के छल्ले के एक अस्पष्ट सूची से बढ़ना चाहिए, स्पष्ट रूप से नामित आंतरिक और बाहरी छल्ले के साथ ?

संक्षेप में: यदि मेरे पास बहुभुज के छल्ले की एक सूची है, लेकिन मुझे नहीं पता कि कौन से छल्ले इंटीरियर में छेद हैं या अलग-अलग बहुभुज हैं, तो मुझे निर्दिष्ट आंतरिक छेद के साथ अलग-अलग बहुभुज में उन्हें कैसे सॉर्ट करना चाहिए?

मैं एक सरल एल्गोरिदम समाधान की तलाश कर रहा हूं जिसे मैं अजगर में लागू कर सकता हूं, ~ एक मिनट या उससे कम समय में सैकड़ों बहुभुज को संसाधित करने के लिए इस्तेमाल किया जा सकता है, और मैं बड़ी संख्या में चौराहों का प्रदर्शन करने के लिए ऐसा कर रहा हूं।


यह सवाल महत्वपूर्ण जानकारी को याद कर रहा है कि आप शेपफाइल को पढ़ने के लिए क्या उपयोग करते हैं।
inc42

@ inc42 मैं फ़ाइल को सीधे पढ़ने के लिए अजगर का उपयोग कर रहा था।
बेंजामिनगोल्डर

आह, तो Shapely बिट भ्रामक है। आपकी वास्तविक समस्या यह पता लगा रही थी कि शेपफाइल प्रारूप में रिंग के "प्रकार" को कैसे निर्धारित किया जाए। :)
inc42 17

जवाबों:


10

अलग-अलग बहुभुज प्राप्त करने के तरीके पर उत्तर देने के लिए आगे, आप छेद बनाने के लिए सभी बहुभुज पर एक चौराहा चला सकते हैं। यदि आपके डेटासेट में बहुभुज हैं, हालांकि आप भाग्य से बाहर हैं।

फिर से बताएं कि मौजूदा आकार के पाठकों के साथ क्या गलत है?

क्या आकृति आईडी से फीचर आईडी और एम वैल्यू को एक्सपोर्ट करना आसान नहीं होगा और फिर मौजूदा शेपफाइल रीडर का उपयोग करने के बाद उन्हें पॉलीगॉन में वापस शामिल करना होगा?

बहुचर्चित के लिए आप बहुभुज आईडी को "पैच आईडी" में निर्दिष्ट करने की एक ही तकनीक का उपयोग कर सकते हैं और फिर इस विशेषता को सुविधाओं में जोड़ सकते हैं।

संपादित करें: जब भी आप कहते हैं कि आप OGR का उपयोग नहीं करना चाहते हैं, बस अगर आप अपना मन बदल लेते हैं ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

ज्यामिति इस प्रकार आउटपुट होनी चाहिए:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

पहले ब्रैकेट में बाहरी रिंग के कोर्ड होते हैं, बाद में ब्रैकेट आंतरिक रिंग के कोर्ड होते हैं। यदि आपके पास Z मान अंक हैं, तो प्रारूप 79285 57742 10 (जहां अंतिम समन्वय एक ऊंचाई है) में होना चाहिए।

अन्यथा आप प्रत्येक बहुभुज का उपयोग एक दूसरे के साथ करने के लिए Shapely Contains और भीतर कार्यों का उपयोग कर सकते हैं और पहले से ही एक स्थानिक सूचकांक लागू कर सकते हैं - http://pypi.python.org/pypi/Rtree/


धन्यवाद, यह वह नहीं है जिसकी मुझे तलाश है, लेकिन मैंने कुछ और स्पष्टीकरण देखे जो मैं अपने प्रश्न के लिए कर सकता था। आपके प्रश्नों का उत्तर देने के लिए: 1, क्योंकि मैं उन्हें पहले स्थान पर टन करने के लिए छाँट रहा हूँ। 2, कुछ भी नहीं, मुझे बस एक की जरूरत है जो हल्का है और मैं अजगर से आसानी से उपयोग कर सकता हूं, और मैंने ओगर सीखा नहीं है। 3, नहीं, यह इस मामले में आसान नहीं होगा।
बेंजामिनगोल्डर

1
वाह! धन्यवाद जियोग्राफिका! मैं अब 90% आश्वस्त हूं कि ogr यहां समाधान है। मैं ogr के साथ कुछ इंस्टॉलेशन मुद्दों में भाग गया, लेकिन ऐसा लगता है कि वे काम करने लायक हैं। तो ogr अपने wkt आउटपुट में रिंग्स का आयोजन करता है? और यह 3 डी आकार के साथ ठीक है (मैं 3 डी का एक बहुत उपयोग)?
बेंजामिनगोल्डर

ऐसा लगता है कि मेरे सवालों के जवाब हां और हां में हैं। और मुझे rtree से मिलवाने के लिए धन्यवाद। ओजीआर मेरी समस्या को पूरी तरह से हल करने के लिए प्रकट होता है - जब तक मैं इस बार स्थापना को सही ढंग से कॉन्फ़िगर कर सकता हूं।
बेंजामिनगोल्डर

OGR की पुनः स्थापना - याद रखें कि आपको विंडोज और मिलान पायथन बाइंडिंग के लिए बायनेरिज़ की आवश्यकता होगी।
जियोग्राफिका

9

सबसे पहले, आकृति को खोलने के लिए ओगर का उपयोग करें:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

शेपफाइल जियोमेट्रियों को सुडौल जियोमेट्री में बदल दें

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

बहुभुज में बहुभुज के लिए:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

और अब, आप सुडौल ( सुडौल ) के सभी कार्यों का उपयोग कर सकते हैं


1

मैं इस बात से भी परिचित नहीं हूं कि पॉलीगॉन वास्तव में आकार की फाइलों में कैसे संग्रहीत किए जाते हैं, लेकिन - क्या बहुभुज की अंगूठी एक बंद लूप नहीं होनी चाहिए अगर और केवल अगर समन्वय समन्वय दोहराया जाता है? इसलिए यदि आप प्रत्येक बाद के तालमेल की शुरुआत समन्वय से करते हैं तो आपको पहला बिंदु मिलेगा जहां एक बहुभुज बंद है। यदि वह बहुभुज का अंतिम समन्वय है, तो यह एक साधारण बहुभुज है, यदि नहीं, तो यह एक बहुभुज है और दूसरे छोरों को संसाधित करने की आवश्यकता है।

यह 'अधिक गहन प्रसंस्करण' हो सकता है जिसे आप बचना चाहते हैं, लेकिन यह वास्तव में समन्वय के माध्यम से वास्तव में सिर्फ एक पुनरावृत्ति है जो आपको किसी भी तरह से पढ़ना होगा।


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

समझा। मुझे यह देखकर भी खुशी हुई कि आपको ओगर का रास्ता मिल गया। ;)
relet

-2

जैसा कि @ inc42 द्वारा इंगित किया गया है , ESRI शेपफाइल तकनीकी के पेज 8 पर : एक ESRI श्वेत पत्र - जुलाई 1998 (पीडीएफ में 34 का पृष्ठ 12) बहुभुज रिकॉर्ड सामग्री की चर्चा है जो आपके बाद हो सकती है:

बहुभुज में कई बाहरी रिंग हो सकते हैं। एक अंगूठी के लिए कोने या अभिविन्यास का क्रम इंगित करता है कि अंगूठी के किस तरफ बहुभुज का आंतरिक भाग है।


p.10 में यह है "एक बहुभुज में कई बाहरी रिंग हो सकते हैं। एक रिंग के लिए वर्टीकल या ओरिएंटेशन का क्रम बताता है कि रिंग के किस हिस्से में पॉलीगॉन का इंटीरियर है।"
inc42

@ inc42 ने तदनुसार अपडेट किया, हालांकि मुझे लगता है कि पृष्ठ संख्या 8 (या 34 का 12) होनी चाहिए।
PolyGeo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.