अवैध ज्यामिति के निहितार्थ क्या हैं


15

मैंने कुछ डेटा पोस्टगिस डेटाबेस में आयात किए हैं और कुछ ज्यामिति अवैध बताई गई हैं (ST_IsValidReason रिपोर्ट आत्म-प्रतिच्छेदन या स्व-प्रतिच्छेदन)।

मेरे द्वारा किए जा रहे प्रश्न इन ज्यामितीयों के अवैध पहलू से प्रभावित नहीं लगते हैं (मैं केवल ST_Distance प्रश्नों का उपयोग कर रहा हूं)।

ज्यामिति अमान्य होने पर कौन सी चीजें टूट जाती हैं?

क्या इन ज्यामितीयों को "स्वचालित रूप से" ठीक करना (बफर (जियोम, 0) या ST_SimplifyPreserveTopology (geom, 0.0001)) एक विकल्प है?

जवाबों:


19

विकृत डेटा रखना एक बुरा विचार है, क्योंकि आप कभी भी यह अनुमान नहीं लगा सकते हैं कि विफलता कब और कहाँ होगी। इसके अलावा, विकृत डेटा , हाइजेनबग्स का कारण बन सकता है , जो कि सबसे शातिर और भ्रामक प्रकार के कीड़े हैं।

मुझे लगता है कि अवैध ज्यामिति के भंडारण के संभावित परिणाम पर चर्चा करना थोड़ा व्यर्थ है। कहा गया है कि, परिणामों में शामिल हो सकते हैं:

  • गलत परिणाम (जो ST_Distanceगलत या सादे गलत आंकड़े लौटाएगा)
  • डेटाबेस प्रदर्शन के मुद्दे: विकृत डेटा रखने से डेटाबेस के प्रदर्शन को गंभीर रूप से नुकसान हो सकता है और विशाल लॉग फ़ाइल बन सकती है, क्योंकि प्रत्येक फ़ंक्शन कॉल लॉग में एक त्रुटि लिख देगा और साधारण डेटाबेस कार्य को बाधित कर देगा।
  • डेटाबेस क्रैश।
  • अनुप्रयोग क्रैश - या तो डेटाबेस से विकृत डेटा प्राप्त करने, या अनुचित परिणाम (उदाहरण के लिए नकारात्मक दूरी) प्राप्त करने के कारण होता है।
  • प्रेत व्यवहार (ऊपर लिंक देखें)। यह सभी का सबसे बुरा परिणाम है। आपको अजीब चीजें हो रही होंगी। धीमेपन, डेटा हानि, क्रैश, अनुचित परिणाम, लंबे समय से रुके हुए, कोई जवाबदेही नहीं और कई अन्य शाप। आप उन्हें स्पॉट नहीं कर सकते या उन्हें पुन: पेश नहीं कर सकते, क्योंकि वे सभी हर दस्तावेज़ में "अपरिभाषित" श्रेणी में आते हैं।

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


क्या आप छोटे बफ़र्स का उपयोग करने पर थोड़ा विस्तार कर सकते हैं? मैं उसको कैसे करू?
दिस्कू

1
ST_Buffer(the_geom, 0.0000001)आत्म चौराहे के लिए चाल हो सकता है। इसका उपयोग केवल तभी करें जब थोड़ी बड़ी ज्यामिति के परिणाम गंभीर न हों।
एडम मटन

1
मेरा अनुभव है कि विकृत डेटा को सही करना काफी एक जांच है। लेकिन भले ही यह समय लेने वाला हो, यह सामान्य रूप से प्रयास के लायक है। ST_Buffer(the_geom, 0.0000001)चाल निश्चित रूप से एक बहुत मदद करता है।
चौ

बात ST_Buffer ज्यामिति को ठीक करता है, लेकिन परिणाम वास्तव में मेरी अपेक्षा के अनुसार नहीं है - यह अमान्य बहुभुज यहाँ ( openstreetmap.org/browse/way/51954364 ) ST_Buffer केवल शीर्ष छोड़ दिया आयत देता है। ST_SimplifyPreserveTopology मुझे जो चाहिए (मान्य ज्यामिति लेकिन अमान्य मूल के जितना करीब हो सके) के करीब लगती है। ST_SimplifyPreserveTopology का उपयोग करने में कोई गिरावट?
diciu

उस ज्यामिति को एक MULTIPOLYGONनहीं बल्कि दो बहुभुजों के रूप में संसाधित किया जाना चाहिए POLYGON। यदि संभव हो तो मूल डब्ल्यूकेटी प्राप्त करने का प्रयास करें।
एडम मटन

13

आप पहले स्थान पर अपने डेटाबेस में प्रवेश करने से अवैध ज्यामिति को रोक सकते हैं। PostgreSQL / PostGIS उपयोगकर्ताओं के लिए, यह चेक बाधाओं के साथ करना आसान है । उदाहरण के लिए, public.my_valid_tableबहुभुज ज्यामितीयों के स्तंभ वाली तालिका पर विचार geomकरें, निम्न SQL / DDL का उपयोग करें:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

नोट: इस तालिका में बाधा को लागू करने से पहले वैध बहुभुज होना आवश्यक है।

यदि आप अमान्य ज्यामिति सम्मिलित / जोड़ने का प्रयास करते हैं, तो आपको एक त्रुटि दिखाई देगी:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.