ฉันต้องการทดสอบ adjacency บนเลเยอร์พัสดุ (รูปหลายเหลี่ยม) และรวมเข้าด้วยกันหากพวกเขาเหมาะสมกับเกณฑ์บางอย่าง (อาจเป็นขนาด) ตามภาพด้านล่างฉันต้องการรวมรูปหลายเหลี่ยม 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))) |
+-----+---------+-------------------------------------------------------------------------------+
โปรดทราบว่ารูปหลายเหลี่ยม id = 3 แบ่งปันจุดที่มี id = 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