PostGIS बहुभुज ज्यामिति के साथ मदद करें - गैर-बंद छल्ले


10

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

मेरी समस्या यह है: जब मैं GSHHS डेटा को PostGIS में आयात करने की कोशिश करता हूं, तो यह समुद्र तट के बहुभुज को 'वैध' नहीं माना जाने के कारण खारिज कर दिया जाता है। विशेष रूप से, मुझे तट रेखा बहुभुजों के कुछ (लेकिन सभी नहीं) वर्णित एक त्रुटि संदेश दिया जाता है जिसे 'गैर-बंद छल्ले' कहा जाता है।

मैं समझता हूं कि यह त्रुटि मुझे यह बताने की कोशिश कर रही है कि बहुभुज के पहले और अंतिम बिंदु समान नहीं हैं। हालाँकि, यह केवल सच नहीं है। मैंने कई बहुभुजों के डब्ल्यूकेटी प्रतिनिधित्व की जांच की है, और वे सही हैं। वे निश्चित रूप से एक ही समन्वय के साथ शुरू और समाप्त होते हैं।

बहुभुज को OGR लाइब्रेरी का उपयोग करके शेपफाइल्स से निकाला जाता है, और प्रत्येक बहुभुज सुविधा को WKT को निर्यात किया जाता है। मैंने शापली के माध्यम से बहुभुज को पुनर्गठित करने की कोशिश की है, और डब्ल्यूकेबी के साथ प्रयोग किया है, लेकिन कोई फायदा नहीं हुआ। मैं है , एक MULTIPOLYGON तालिका के रूप में PostGIS में एक ही डेटा लोड करने के shp2pgsql लोडर का उपयोग कर कर पाए।

मैं सोच रहा था कि क्या कोई बाहर था:
(ए) शायद एक ही किताब का इस्तेमाल किया, उसी समस्या पर अटक गया, और मेरे लिए जवाब है?
(बी) ने एक समान समस्या का सामना किया है, और एक समाधान पाया है?
(ग) यह विफल हो रहा है, कि PostGIS में लोड करने से पहले वैध ज्यामिति सुनिश्चित करने के लिए कुछ 'सर्वोत्तम अभ्यास' सलाह है?

अद्यतन: एक सहकर्मी ने सुझाव दिया है कि 'गैर-बंद छल्ले' समस्या सिर्फ एक और समस्या का लक्षण हो सकती है। यह संभव है कि मेरे PostGIS / PostgreSQL कॉन्फ़िगरेशन में आकार सीमाएं (सम्मिलित लेन-देन, पैकेट प्राप्त, पाठ स्ट्रिंग, आदि) हैं।

जैसा कि मैं इनपुट के रूप में बहुत लंबे WKT बहुभुज का उपयोग कर रहा हूं, PostGIS उन्हें बहुत जल्दी काट सकता है ताकि प्रत्येक बहुभुज को पूरा करने की अनुमति मिल सके। मैं कल इसका परीक्षण करूंगा, लेकिन यह संभव नहीं है। देश की सीमाओं से मेरा जुड़ाव केवल कुछ रिकॉर्डों को स्वीकार कर रहा था और दूसरों को नहीं। स्मृति से, स्वीकृत ज्यामिति एंटीगुआ जैसे छोटे द्वीप राष्ट्रों के लिए थे (और शायद इसलिए डब्ल्यूकेटी का प्रतिनिधित्व कम था)।

तो यह एक अवैध ज्यामिति धागे के बजाय एक PostGIS डेटाबेस व्यवस्थापक थ्रेड के अधिक होने का अंत हो सकता है।


क्या आप एक नमूना shp फ़ाइल प्रदान कर सकते हैं?
मारियो मिलर

कोई चिंता नहीं। GSHHS मैं जो डेटा इस्तेमाल कर रहा हूं, वह यहां से 96mb डाउनलोड है । विश्व सीमा डेटा जो मैं उपयोग कर रहा हूं वह है विषयगत
टाइमई

जवाबों:


6

मैंने आपके डेटा और पुस्तक के उदाहरण को देखा है, समस्या यह है कि डेटा में तीन अमान्य बहुभुज हैं जिन्हें पुस्तक में संसाधित किया गया है:

GSHHS_l_L1.shp

आईडी = 92-डब्ल्यू

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

आईडी = 486-डब्ल्यू

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

आईडी = 7333-डब्ल्यू

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

क्योंकि यह एक उदाहरण है कि उन बहुभुजों को डेटासेट से हटाना आसान होगा या यदि आप कोड में बयान करते हैं तो केवल एक जोड़ें

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

धन्यवाद मारियो, ऐसा लगता है कि मैं अपने तरीके से आगे बढ़ रहा था, बजाय मेरे सभी इनपुट पॉलीगनों को ठीक से सत्यापित करने के। आपका उत्तर सही था - इन बहुभुजों को OGR के साथ परीक्षण करने पर अमान्य दिखाया गया। दिलचस्प बात यह है कि QGis में ठीक लग रहा था, लेकिन ArcMap ने उन्हें पूरी अंगूठी की कमी के रूप में दिखाया। ये तीन बहुभुज सभी डेटलाइन पर गिर गए, और मुझे लगता है कि आकार-प्रकार ज्यामिति ने डेटलाइन के साथ बहुभुज किनारे की गिनती नहीं की। आपका समाधान अमान्य बहुभुजों का पता लगाने का एक अच्छा और आसान तरीका है। मैं उत्तर के रूप में पद चिन्हित करूंगा।
टिम्मी

यदि आप धर्मार्थ महसूस कर रहे हैं, तो क्या आपके पास प्रक्रिया के अगले चरण के लिए कोई अच्छा समाधान है, जो कि अवैध बहुभुजों को सही कर रहा है? मैंने OGR's .CloseRing () फ़ंक्शन का उपयोग करने की कोशिश की, लेकिन कोई फायदा नहीं हुआ। मुझे लगता है कि यह फंक्शन कॉल को नजरअंदाज करता है।
टिम्मी

मैंने "बफर ट्रिक" ( कार्यशालाओं .opengeo.org/postgis-intro/validity.html) को सुडौल और ओगर के साथ प्रयोग करने की कोशिश की लेकिन कोई सफलता नहीं मिली। अवैध रूप से बहुभुज और ऑगर अभ्यस्त बफ़र ऑपरेशन न करें, वर्तमान में मुझे नहीं पता कि क्यों। अगर मैं जवाब पर अड़ गया, तो मैं आपको बता दूंगा। हो सकता है कि किसी और को इस समस्या के साथ अधिक सफलता मिले। माफ़ करना।
मारियो मिलर

मुझे लगता है कि मुझे अपना बहुभुज सत्यापन अब काम कर रहा है। मुझे लगता है कि मैं गलत तरीके से OGR's .CloseRings () फ़ंक्शन का उपयोग कर रहा था। मुझे इसे बहुभुज की विधि के रूप में कहा जाता था (जैसे कि poly.CloseRings ())। इसके बजाय, मुझे बहुभुज से रैखिक अंगूठी निकालना था, और फिर इसे उस पर चलाना (यानी lr = poly.GetGeometryRef (0); lr.CloseRings ())। परिणाम सफलतापूर्वक PostGIS में डाले जा रहे हैं, और मैं QGis witj में 3 समस्या बहुभुज का उपयोग कर सकते हैं कोई चिंता नहीं है। हर एक बहुभुज की वैधता की जाँच में एक कम्प्यूटेशनल लागत का एक सा है।
टिम्मी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.