ฉันมีปัญหาในการค้นหา ฉันมีเครือข่ายของ linestrings แต่ละอันมีค่าในคอลัมน์ n_type นี่อาจเป็นหนึ่งในตัวเลือกมากมาย ฉันต้องการสร้างตารางใหม่ที่จัดกลุ่ม linestrings ใด ๆ ที่เป็นประเภทเดียวกันและสร้างบรรทัดต่อเนื่อง
ก่อน:
หลังจาก:
นี่คือสิ่งที่ฉันได้รับจนถึง มันส่งคืนผลลัพธ์ แต่ไม่สมเหตุสมผล - ประเภทไม่ตรงกันและส่งคืนคุณสมบัติมากเกินไป
โปรดทราบว่าฉันได้กำหนด "ต่อเนื่อง" เป็นบรรทัดใด ๆ ที่อยู่ในระยะ 5 ฟุตจากเพื่อนบ้านและพบกันที่มุมต่ำกว่า 30 องศา
WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
SELECT 1 AS i,
pk_uid,
n_type,
geom
FROM network
WHERE n_type != 'none'
UNION ALL
SELECT a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
ฉันคิดว่าแบบสอบถามแบบเรียกซ้ำเป็นวิธีที่จะไป แต่ฉันยินดีที่จะพิสูจน์ว่าผิด ผู้เรียกซ้ำเป็นเรื่องยากนิดหน่อย
แก้ไข: ฉันควรเพิ่มว่าฉันได้ลองรวบรวมโดยใช้ ST_Union และ ST_Linemerge แล้วจึงทิ้งผลลัพธ์ ชนิดนี้ใช้งานได้ แต่ไม่ได้หมายถึงจุดตัด> 30 องศาและยังไม่สามารถให้เกียรติกับการเชื่อมต่อห้าฟุต
a.pk_uid != b.pk_uid