PostGIS का उपयोग करके चौराहे के आधार पर अलग बहुभुज


36

मेरे पास पॉलीगनों की एक पोस्टजीआईएस तालिका है जहां कुछ एक दूसरे के साथ प्रतिच्छेद करते हैं। यही मैं करने की कोशिश कर रहा हूँ:

  • आईडी द्वारा चयनित दिए गए बहुभुज के लिए, मुझे उन सभी बहुभुजों को दें जो प्रतिच्छेद करते हैं। मूल रूप से,select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
  • इन बहुभुजों से, मुझे एक नया बहुभुज बनाने की जरूरत है, जिससे प्रतिच्छेदन एक नया बहुभुज बन जाए। इसलिए यदि बहुभुज A बहुभुज B के साथ प्रतिच्छेद करता है, तो मुझे 3 नए बहुभुज मिलेंगे: एक ऋण AB, AB और B ऋण AB।

कोई विचार?


1
हम्म, मुझे लगता है कि तुम क्या देख रहे हो, लेकिन एक साधारण ग्राफिक मेरी मदद करने के लिए चमत्कार कर सकता है (और अन्य) ठीक वही देखें जो आप चाहते हैं।
जेसन

मेरे उत्तर में कुछ जोड़ा गया।
एडम मटन

जवाबों:


29

चूंकि आपने कहा था कि आप जिस बहुभुज में रूचि रखते हैं, उसके लिए बहुभुजों को प्रतिच्छेद करने का एक समूह मिलता है, आप चाहते हैं कि जिसे "बहुभुज उपरिशायी" कहा जाए।

यह ठीक नहीं है कि आदम का समाधान क्या कर रहा है। अंतर देखने के लिए, एबीसी चौराहे की इस तस्वीर पर एक नज़र डालें:

एबीसी चौराहा

मेरा मानना ​​है कि एडम का समाधान एक "एबी" बहुभुज बनाएगा जो "एबी! सी" और "एबीसी" दोनों के क्षेत्र को कवर करता है, साथ ही साथ "एसी" बहुभुज जो "एसी! बी" और "एबीसी" को कवर करता है, और एक "ए" बीसी "बहुभुज जो कि" बीसी! ए "और" एबीसी "है। तो "एबी", "एसी", और "बीसी" आउटपुट बहुभुज सभी "एबीसी" क्षेत्र को ओवरलैप करेंगे।

एक बहुभुज उपरिशायी गैर-अतिव्यापी बहुभुज का उत्पादन करती है, इसलिए AB! C एक बहुभुज होगा और ABC एक बहुभुज होगा।

PostGIS में बहुभुज ओवरले बनाना वास्तव में बहुत सीधा है।

मूल रूप से तीन चरण हैं।

चरण 1 लाइनवर्क निकाल रहा है [ध्यान दें कि मैं बहुभुज की बाहरी रिंग का उपयोग कर रहा हूं , यदि आप छेदों को सही ढंग से संभालना चाहते हैं तो यह थोड़ा अधिक जटिल हो जाता है]:

SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines

चरण 2 लाइनवर्क "नोड" करने के लिए है (प्रत्येक चौराहे पर एक नोड का उत्पादन करें)। जेटीएस जैसे कुछ पुस्तकालयों में "नोडर" कक्षाएं हैं जिनका उपयोग आप ऐसा करने के लिए कर सकते हैं, लेकिन पोस्टजीआईएस में ST_Union फ़ंक्शन आपके लिए यह करता है:

SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines

चरण 3 सभी संभव गैर-अतिव्यापी बहुभुज बनाने के लिए है जो उन सभी लाइनों से आ सकते हैं, जो ST_Polygon फ़ंक्शन द्वारा किए गए हैं :

SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)

आप उन सभी चरणों के आउटपुट को एक अस्थायी तालिका में सहेज सकते हैं, या आप उन सभी को एक एकल विवरण में जोड़ सकते हैं:

CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
    SELECT ST_Polygonize(the_geom) AS the_geom FROM (
        SELECT ST_Union(the_geom) AS the_geom FROM (
            SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
        ) AS noded_lines
    )
)

मैं ST_Dump का उपयोग कर रहा हूं क्योंकि ST_Polygonize का आउटपुट एक ज्यामिति संग्रह है, और यह (आमतौर पर) एक तालिका है जहां प्रत्येक पंक्ति बहुभुज ओवरले बनाने वाले बहुभुज में से एक है, के लिए अधिक सुविधाजनक है।


ध्यान दें कि ST_ExteriorRingकिसी भी छेद को गिराता है। ST_Boundaryआंतरिक रिंगों को संरक्षित करेगा, लेकिन यह उनके अंदर एक बहुभुज भी बनाएगा।
jpmc26

जब बहुत सारे बहुभुज होते हैं तो बाहरी छल्लों का मिलन दुर्घटनाग्रस्त हो जाता है। दुर्भाग्य से यह "सीधा" समाधान केवल छोटे आवरणों के लिए काम करता है।
पियरे रैसीन

13

अगर मैं सही ढंग से समझूं, तो आप लेना चाहते हैं (ए बाईं ज्यामिति है, बी दाएं है):

AagesB की छवि http://img838.imageshack.us/img838/3996/intersectab1.png

और निकालें:

एक ∖ एबी

A of AB की छवि http://img830.imageshack.us/img830/273/intersectab2.png

एबी

AB की छवि http://img828.imageshack.us/img828/7413/intersectab3.png

और बी ∖ एबी

B of AB की छवि http://img839.imageshack.us/img839/5458/intersectab4.png

वह है - प्रत्येक अन्तर्विभाजक जोड़ी के लिए तीन अलग-अलग ज्यामिति।

सबसे पहले, आइए सभी इंटरसेक्टिंग ज्यामितीयों का एक दृश्य बनाएं। मान लें कि आपकी तालिका का नाम है polygons_table, हम उपयोग करेंगे:

CREATE OR REPLACE VIEW p_intersections AS    -- Create a view with the 
SELECT t1.the_geom as t1_geom,               -- intersecting geoms. Each pair
       t2.the_geom as t2_geom                -- appears once (t2.id<t2.id)
    FROM polygons_table t1, polygons_table t2  
         WHERE t1.id<t2.id AND t1.the_geom && t2.the_geom 
                           AND intersects t1.the_geom, t2.the_geom;

अब हमारे पास एक दृश्य (व्यावहारिक रूप से, केवल-पढ़ने के लिए तालिका) है जो एक दूसरे को जोड़ने वाले युग्मों को रखता है, जहां प्रत्येक जोड़ी केवल एक बार t1.id<t2.idस्थिति के कारण दिखाई देती है ।

अब तीनों प्रश्नों पर SQL का प्रयोग करते हुए A∖AB, अपने चौराहों को इकट्ठा करें - ABऔर :B∖ABUNION

--AB:
SELECT ST_intersection(t1.the_geom, t2.the_geom) 
    AS geom 
    FROM p_intersections

UNION 

--AAB:
SELECT ST_Difference(t1.the_geom, t2.the_geom) 
    AS geom 
    FROM p_intersections

UNION

--BAB:
SELECT ST_Difference(t2.the_geom, t1.the_geom) 
    AS geom 
    FROM p_intersections;

टिप्पणियाँ:

  1. &&ऑपरेटर से पहले एक फिल्टर के रूप में किया जाता है intersectsप्रदर्शन में सुधार करने, ऑपरेटर।
  2. मैंने VIEWएक विशाल क्वेरी के बजाय बनाने के लिए चुना है ; यह केवल सुविधा के लिए है।
  3. यदि आपका मतलब ABसंघ है, तो चौराहे का नहीं, Aऔर B- UNIONउपयुक्त स्थानों में क्वेरी पर st_intersection के बजाय ST_Union का उपयोग करें ।
  4. संकेत सेट अंतर के लिए एक यूनिकोड संकेत है; यदि यह आपके डेटाबेस को भ्रमित करता है तो इसे कोड से हटा दें।
  5. चित्र के सौजन्य से विकिमीडिया कॉमन्स 'अच्छा सेट सिद्धांत श्रेणी

मेटा पर मेरा बग टिकट: meta.gis.stackexchange.com/questions/79/…
एडम मटन

अच्छी व्याख्या! परिणाम एसडब्ल्यू समाधान के समान हैं, लेकिन उसका रास्ता तेज होना चाहिए (ए और बी के अतिरिक्त चौराहों की गणना / या स्टोर नहीं करता है)
stachu

धन्यवाद! मुझे लगता है कि मैं किसी भी अतिरिक्त जानकारी को संग्रहीत नहीं करता हूं, क्योंकि मैं केवल एसक्यूएल व्यू बनाता हूं, टेबल नहीं।
एडम मटन

हां, यह सच है, लेकिन आप A और B के अतिरिक्त अंतःकरण की गणना करते हैं, जो आवश्यक नहीं है
stachu

5
इस उत्तर में छवियां अब काम नहीं करती हैं।
Fezter

8

आप जो वर्णन कर रहे हैं, वह तरीका है कि संघ संचालक आर्कगिस में काम करता है, लेकिन यह जीईओएस दुनिया में यूनियन या इंटरसेक्शन की तुलना में थोड़ा अलग है। शेपली मैनुअल में उदाहरण दिया गया है कि GEOS में कैसे काम होता है । हालाँकि, PostGIS विकी के पास लाइनवर्क का उपयोग करके एक अच्छा उदाहरण है जो आपके लिए चाल करना चाहिए।

वैकल्पिक रूप से, आप तीन चीजों की गणना कर सकते हैं:

  1. ST_Intersection (geom_a, geom_b)
  2. ST_Difference (geom_a, geom_b)
  3. ST_Difference (geom_b, geom_a)

उन तीन बहुभुजों को होना चाहिए जिनका आपने अपने दूसरे बुलेट पॉइंट में उल्लेख किया है।


2
PostGIS विकी का उदाहरण अच्छा है
चिह्नित करें

ST_Intersects बूलियन नहीं लौटाएंगे यदि वे इंटरसेक्ट करते हैं या नहीं? मुझे लगता है कि ST_Intersection काम करेगा।
जेसन

हाँ, मेरी ओर से टाइपो - मूल में अब तय, धन्यवाद जेसन!
SCW

-2

कुछ इस तरह:

नया परिचय करें

संपादित करें: आपको बहुभुज के वास्तविक चौराहे की आवश्यकता है।

INSERT INTO new_table मान ((id, ST_Intersection (the_geom, (पुराने से id_ 123 चुनें) id चुनें जहां 123))

देखें कि क्या काम करता है।

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