मैं एक पार्सल (बहुभुज) परत पर आसन्न परीक्षण करना चाहता हूं और उन्हें विलय कर दूंगा यदि वे कुछ मानदंडों को फिट करते हैं (आकार हो सकता है)। नीचे दी गई तस्वीर के अनुसार, मैं पॉलीगन्स 1,2,3 और 4 का विलय करना चाहूंगा, लेकिन 5 नहीं ।
मुझे दो समस्याएं हैं:
ST_TOUCHES
TRUE लौटाता है यदि केवल कोने स्पर्श करते हैं, रेखा खंड नहीं। मुझे लगता है कि मुझे साझा लाइन सेगमेंट की जाँच करने के लिए ST_RELATE की आवश्यकता है।- आदर्श रूप से, मैं सभी आसन्न बहुभुजों को एक में मिलाना चाहूंगा, लेकिन मुझे यकीन नहीं है कि कैसे दो से परे पैमाने पर - जैसे, एक दौर में 1,2,3 और 4 (और संभवतः वास्तविक डेटा पर अधिक) मर्ज करें।
मेरे पास अब जो संरचना है वह एक स्व-जुड़ाव पर आधारित है ST_TOUCHES
।
खिलौना डेटा
CREATE TABLE testpoly AS
SELECT
1 AS id, ST_PolyFromText('POLYGON ((0 0, 10 0, 10 20, 00 20, 0 0 ))') AS geom UNION SELECT
2 AS id, ST_PolyFromText('POLYGON ((10 0, 20 0, 20 20, 10 20, 10 0 ))') AS geom UNION SELECT
3 AS id, ST_PolyFromText('POLYGON ((10 -20, 20 -20, 20 0, 10 0, 10 -20 ))') AS geom UNION SELECT
4 AS id, ST_PolyFromText('POLYGON ((20 -20, 30 -20, 30 0, 20 0, 20 -20 ))') AS geom UNION SELECT
5 AS id, ST_PolyFromText('POLYGON ((30 0, 40 0, 40 20, 30 20, 30 0 ))') AS geom ;
चयन
SELECT
gid, adj_gid,
st_AStext(st_union(l2.g1,l2.g2)) AS geo_combo
from (
--level 2
SELECT
t1.id AS gid,
t1.geom AS g1,
t2.id AS adj_gid,
t2.geom AS g2
from
testpoly t1,
testpoly t2
where
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
)
l2
यहाँ उत्पादन है:
+-----+---------+-------------------------------------------------------------------------------+
| gid | adj_gid | geo_combo |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 2 | POLYGON((10 0,0 0,0 20,10 20,20 20,20 0,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 3 | MULTIPOLYGON(((10 0,0 0,0 20,10 20,10 0)),((10 0,20 0,20 -20,10 -20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 1 | POLYGON((10 20,20 20,20 0,10 0,0 0,0 20,10 20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 3 | POLYGON((10 0,10 20,20 20,20 0,20 -20,10 -20,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 4 | MULTIPOLYGON(((20 0,10 0,10 20,20 20,20 0)),((20 0,30 0,30 -20,20 -20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 1 | MULTIPOLYGON(((10 0,20 0,20 -20,10 -20,10 0)),((10 0,0 0,0 20,10 20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 2 | POLYGON((20 0,20 -20,10 -20,10 0,10 20,20 20,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 4 | POLYGON((20 -20,10 -20,10 0,20 0,30 0,30 -20,20 -20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 2 | MULTIPOLYGON(((20 0,30 0,30 -20,20 -20,20 0)),((20 0,10 0,10 20,20 20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 3 | POLYGON((20 0,30 0,30 -20,20 -20,10 -20,10 0,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 5 | MULTIPOLYGON(((30 0,30 -20,20 -20,20 0,30 0)),((30 0,30 20,40 20,40 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 5 | 4 | MULTIPOLYGON(((30 0,30 20,40 20,40 0,30 0)),((30 0,30 -20,20 -20,20 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
ध्यान दें कि बहुभुज आईडी = 3 आईडी = 1 के साथ एक बिंदु साझा करता है और इस प्रकार एक सकारात्मक परिणाम के रूप में वापस किया जाता है। अगर मैं WHERE क्लॉज को बदल देता हूं तो मुझे ST_Touches( t1.geom, t2.geom ) AND t1.geom && t2.geom AND ST_Relate(t1.geom, t2.geom ,'T*T***T**');
कोई रिकॉर्ड नहीं मिलता है।
तो सबसे पहले , मैं यह सुनिश्चित करने के लिए ST_Relate निर्दिष्ट करता हूं कि केवल पार्सल एक पंक्ति खंड साझा करने पर विचार किया जाता है।
और फिर, मैं एक दौर में बहुभुज 1,2,3,4 को कैसे विलीन करूंगा, उपरोक्त कॉल से परिणाम को ध्वस्त करते हुए, सभी आसन्न 1 से 2 को पहचानते हुए रिवर्स के समान है?
अद्यतन करें
यदि मैं इसे where
क्लॉज में जोड़ता हूं तो मुझे स्पष्ट रूप से केवल बहुभुज मिलते हैं, न कि मल्टीप्लगॉन, इस प्रकार मेरे उद्देश्यों के लिए झूठी सकारात्मकता को बाहर निकालते हुए - कोने के स्पर्शों को नजरअंदाज कर दिया जाएगा।
GeometryType(st_union(t1.geom,t2.geom)) != 'MULTIPOLYGON'
हालांकि यह आदर्श नहीं है (मैं ST_RELATE
अधिक सामान्य समाधान के रूप में टोपोलॉजी जांच का उपयोग करूंगा ), यह एक रास्ता है। फिर इन्हें डी-डुइंग और यूनियन करने की बात बनी हुई है। संभवतः, यदि मैं केवल बहुभुज को छूने के लिए एक अनुक्रम उत्पन्न कर सकता था, तो मैं उस पर संघ कर सकता था।
अपडेट II
यह एक बहुभुज साझाकरण लाइनों (लेकिन कोनों नहीं) का चयन करने के लिए काम करता है और इस प्रकार उपरोक्त MULTIPOLYGON
परीक्षण से अधिक सामान्य समाधान है । मेरा जहां खंड अब इस तरह दिखता है:
WHERE
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
-- 'overlap' relation
AND ST_Relate(t1.geom, t2.geom)='FF2F11212') t2
अब जो बचा हुआ है वह अभी भी बहुपत्नी की जोड़ी से अधिक के लिए मर्ज कैसे किया जा सकता है, लेकिन एक मनमाना संख्या के लिए मानदंड फिटिंग, एक बार में।
ST_IntersectionArray
: [समारोह] [1] ST_Union [1] के साथ काम करने के लिए gis.stackexchange.com/a/60295/36886