PostGIS के साथ "लंबे और संकीर्ण" बहुभुज की पहचान करना


10

मेरे पास बड़े क्षेत्रों का प्रतिनिधित्व करने वाले बहुभुज का एक सेट है, शहर के पड़ोस कहते हैं। मैं उनके बीच बड़े अतिव्यापी क्षेत्रों की पहचान करना चाहता हूं।

लेकिन एक समस्या है: कभी-कभी ये पॉलीगॉन अपने परिधि के साथ ओवरलैप हो जाएंगे (क्योंकि वे थोड़ी सटीकता के साथ खींचे गए थे)। यह लंबे और संकीर्ण ओवरलैप उत्पन्न करेगा जिनकी मुझे परवाह नहीं है।

लेकिन अन्य समय में मजबूत पॉलीगोन के बड़े ओवरलैप होंगे, जिसका अर्थ है बड़े क्षेत्र जहां एक पड़ोस का बहुभुज दूसरे को ओवरलैप करता है। मैं केवल इन का चयन करना चाहता हूं।

बस ओवरलैप के नीचे की तस्वीर देखें। कल्पना कीजिए कि मैं निचले बाएँ कोने में केवल नीले बहुभुज का चयन करना चाहता था।

ओवरलैप

मैं क्षेत्रों को देख सकता था, लेकिन कभी-कभी संकीर्ण लोग इतने लंबे होते हैं कि वे नीले बहुभुज के रूप में बड़े होते हैं। मैंने क्षेत्र / परिधि का अनुपात करने की कोशिश की है, लेकिन मिश्रित परिणाम भी मिले हैं।

मैंने भी उपयोग करने की कोशिश की है ST_MinimumClearance, लेकिन कभी-कभी बड़े क्षेत्रों में एक संकीर्ण भाग जुड़ा होता है, या दो बहुत करीब कोने होते हैं।

अन्य दृष्टिकोणों का कोई विचार?


अंत में मेरे लिए सबसे अच्छा काम करने वाला एक नकारात्मक बफर का उपयोग कर रहा था, जैसा कि नीचे @Cyril और @FGreg द्वारा सुझाया गया है।

मैंने कुछ इस तरह इस्तेमाल किया:

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

मेरे मामले में, इकाइयां मीटर थीं, इसलिए 10 मीटर नकारात्मक बफर।

संकीर्ण बहुभुजों के लिए, यह क्षेत्र शून्य लौट आया (भी, ज्यामिति खाली होगी)। फिर मैंने इस कॉलम का इस्तेमाल संकीर्ण बहुभुजों को छानने के लिए किया।


4
निश्चित रूप से इसके लिए क्षेत्र / परिधि अनुपात का उपयोग किया जा सकता है।
विंस

यह बताना मुश्किल है कि अलग-अलग बहुभुज छवि से कहां हैं, लेकिन कुछ ऐसा करना gis.stackexchange.com/a/265233/64838 काम कर सकता है? न्यूनतम घुमा बाउंडिंग बॉक्स की गणना करें, फिर छोटी चौड़ाई या ऊंचाई वाले लोगों को छोड़ दें।
FGreg

आप यहाँ वर्णित के रूप में एक नकारात्मक बफर का उपयोग करने का भी प्रयास कर सकते
FGreg

जवाबों:


5

मैं एक नकारात्मक बफर बनाने की कोशिश करूंगा, अगर यह पतले बहुभुज खाता है, तो यह अच्छा है, अगर यह बहुभुज नहीं खाता है, तो यह मेरा है ... :-)

इस स्क्रिप्ट को चलाने के लिए, पहले 2/3 रैखिक बहुभुजों की चौड़ाई सेट करें ...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

OS: -) ...


अंत में आपका सुझाव मेरे लिए सबसे अच्छा काम है। मैंने ST_Area(ST_Buffer(geom, -10))अपने मामले में -10 जा रहा -10 मीटर, जैसे कुछ का उपयोग कर समाप्त कर दिया । अगर उस अभिव्यक्ति से कुछ भी 0 लौटा तो मैं उसे फ़िल्टर कर सकता हूं।
bplmp

9

क्षेत्र / परिधि के बजाय, परिधि के वर्ग (या इसके व्युत्क्रम) से विभाजित क्षेत्र का उपयोग करना बेहतर है।

इसे "आकार सूचकांक" भी कहा जाता है। क्षेत्र से विभाजित परिधि के वर्ग का न्यूनतम मान 4 * Pi () है (डिस्क के मामले में, जो सबसे कॉम्पैक्ट 2D ज्यामिति है), इसलिए इसे 4 * Pi () के लिए एक सामान्य से सामान्य किया जा सकता है। व्याख्या (1 के करीब सामान्यीकृत मान तो इसका मतलब है कि आपके पास बहुत कॉम्पैक्ट ऑब्जेक्ट हैं और वर्गों में लगभग 1.27 का मान है)।

EDIT: बहुत छोटी कलाकृतियों को हटाने के लिए क्षेत्र की एक सीमा उपयोगी होगी, जो कॉम्पैक्ट हो सकती है। फिर आकृति सूचकांक बेहतर विपरीत दिखाएगा। EDIT: इस उत्तर के अलावा, ST_Snap का उपयोग आपको समस्या को हल करने में मदद कर सकता है।


धन्यवाद! लेकिन मैं अनिश्चित हूं कि ST_Snap इस मामले में कैसे मदद कर सकता है ... अगर मुझे यह सही लगा, तो आप कुछ सुझाव दे रहे हैं (o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratio? यह सिर्फ क्षेत्र / परिधि की तुलना में मेरे लिए बदतर परिणाम है।
bplmp

अभी सेवा का उपयोग o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratioइस पत्र, लेकिन अभी भी बदतर परिणाम के अनुसार (हालांकि कि अंदाजा है कि मैं क्या बदतर मतलब मुश्किल है) isprs-ann-photogramm-remote-sens-spatial-inf-sci.net/I-7/135/... , पेज 183.
bplmp 16

2
इसके लिए धन्यवाद, मैंने कभी "आकार सूचकांक" के बारे में नहीं सुना था। मैंने हमेशा सोचा था कि इस तरह के प्रश्न का उत्तर देने के लिए न्यूनतम बाउंडिंग आयत का उपयोग करना सबसे अच्छा तरीका है। मुझे यह मिला, repository.asu.edu/attachments/111230/content/… , जो दिलचस्प है।
जॉन पॉवेल

@ जॉनपोवेल इंटरस्टिंग पेपर, धन्यवाद। मैं देखता हूं कि जिसे मैं एक आकृति सूचकांक के रूप में जानता हूं, उसे कागज में परिपत्रता सूचकांक कहा जाता है। न्यूनतम बाउंडिंग आयतों के साथ मेरी समस्या यह है कि यह बहुत अवतल वस्तुओं (जैसे यू-आकार) के साथ काम नहीं करता है
radouxju

@bplmp ST_Snap आपको "लगभग" आसन्न बहुभुज के कोने को स्नैप करने में मदद करेगा ताकि वे अब और ओवरलैप न करें। आपके आंकड़ों पर कोई पैमाना नहीं है, लेकिन आपकी कलाकृतियां रेखाओं की तरह दिखती हैं, इसलिए मुझे लगता है कि आप एक सहिष्णुता मान का उपयोग कर सकते हैं जो कि आर्टिफैक्ट्स से बचने के लिए पर्याप्त है लेकिन बड़े बहुभुजों को प्रभावित नहीं करता है।
राडोक्सु

5

एक विकल्प बहुभुज के क्षेत्र के अनुपात का उपयोग सबसे लंबी रेखा के लिए किया जा सकता है जो अपने चरम सीमाओं का उपयोग करके तैयार किया जा सकता है। लंबे संकीर्ण बहुभुज की पहचान करना।

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

यह स्लिवर पॉलीगन्स के लिए बहुत अच्छा काम करता है। आप अपनी आवश्यकताओं और प्रक्षेपण के अनुरूप क्या अनुपात (आप किस क्षेत्र से गुणा करते हैं) को समायोजित कर सकते हैं।


1

ऐसा लगता है कि यह आपके उपयोग के मामले से मेल खा सकता है: चयनित बहुभुजों को हटा दें

कुछ समान आसन्न बहुभुजों के साथ इनपुट लेयर के चयनित बहुभुजों को उनकी सामान्य सीमा को मिटाकर संयोजित करता है। आसन्न बहुभुज या तो सबसे बड़े या सबसे छोटे क्षेत्र के साथ हो सकता है या एक बहुभुज के साथ सबसे बड़ी आम सीमा को समाप्त करने वाला हो सकता है।

एलिमिनेट का उपयोग आम तौर पर स्लिवर पॉलीगॉन से छुटकारा पाने के लिए किया जाता है, यानी छोटे बहुभुज जो बहुभुज चौराहे प्रक्रियाओं का एक परिणाम होते हैं जहां इनपुट की सीमाएं समान होती हैं लेकिन समान नहीं होती हैं।

ऐसा लगता है कि आप "सबसे बड़ी सामान्य सीमा" विकल्प आज़माना चाहते हैं।


मुझे लगता है कि अब आप पोस्टगिस समाधान नहीं क्यूगी समाधान के लिए पूछ रहे थे। मेरी क्षमायाचना, मुझे नहीं लगता कि पोस्टगिस का कोई समतुल्य कार्य है, लेकिन मैं इसे पश्चाताप के लिए छोड़ दूंगा।
FGreg

0

यह मुझे PostGIS टोपोलॉजी विस्तार के लिए एक सही उपयोग के मामले की तरह लगता है । टोपोलॉजी की सहिष्णुता पैरामीटर यह निर्धारित करेगा कि आप स्रोत डेटा की कम परिशुद्धता के साथ सामना करने और इसे साफ करने के लिए अन्य मौजूदा बहुभुजों को स्नैप करने की अनुमति देते हैं।

संक्षेप में, रणनीति यह है:

1. टोपोलॉजी विस्तार सक्षम करें

CREATE EXTENSION postgis_topology;

2. एक नया खाली टोपोलॉजी बनाएं

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

तीसरा पैरामीटर सीआरएस की इकाइयों में सहिष्णुता है; इसे बुद्धिमानी से चुनें। आदर्श रूप से, आप एक सीआरएस चाहते हैं जहां इकाई मीटर है। यदि सीआरएस इकाई मीटर नहीं है, तो डब्ल्यूजीएस 84 उर्फ ​​4326 के साथ, ST_Transformअपने बहुभुज को फिर से लागू करने के लिए उपयोग करें।

3. बहुभुज तालिका में एक TopoGeometry कॉलम जोड़ें

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

यह एक नया रिटर्न देता है layer_id। इसे बचाएं, बाद में इसकी आवश्यकता होगी। यह परत होगी 1यदि आपकी शुरुआत खरोंच से होती है, और हर नए कॉल में वृद्धि होती है।

4. टोपोलॉजी में सभी बहुभुज जोड़ें

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

एक बड़े डेटासेट के लिए कई घंटे लग सकते हैं, धैर्य रखें। 1लेयर_ड पहले लौट आया है।

5. कई मोहल्लों में दिखने वाले चेहरे खोजें

टोपोलॉजी के उन सभी चेहरों को खोजें जो 2 या अधिक टोपोगेमेट्री में मौजूद हैं। मैं एक अभ्यास के रूप में क्वेरी छोड़ दूंगा। सबसे आसान शायद GetTopoGeomElementsफ़ंक्शन के साथ है , फिर फेस आईडी द्वारा समूह, और 2 या अधिक की गिनती के साथ लोगों को देखें। वैकल्पिक रूप से, आप topogeom कॉलम से साफ ज्यामिति के साथ एक नई तालिका बना सकते हैं, बस इसे मानक ज्यामिति में डाल दें topogeom::geometry, और जो आपके पास पहले से है उसे अब दोहराएं, लेकिन अब स्लिपर ओवरलैप के बिना एक साफ डेटासेट के साथ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.