แบบสอบถามแบบเรียกซ้ำ PostGIS ตามการเชื่อมต่อสาย


9

ฉันมีปัญหาในการค้นหา ฉันมีเครือข่ายของ 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.geom และ b.geom ในส่วนคำสั่งที่คุณเลือก คุณอาจจะต้องแน่ใจว่าคุณไม่ได้ลองและเข้าร่วมไลน์กับตัวเองด้วยa.pk_uid != b.pk_uid
MickyT

@MickyT ขอบคุณ ฉันควรจะกล่าวว่าฉันสามารถทำสหภาพในส่วนคำสั่ง SELECT สุดท้าย แต่สำหรับเวลาที่เลือก * เพื่อให้เห็นผลลัพธ์ทั้งหมด ฉันจะแก้ไขข้อมูลโค้ดของฉันเพื่อแสดงสิ่งที่ควรจะเป็นในที่สุด
spencerrecneps

ข้อความค้นหาแบบเรียกซ้ำเป็นเรื่องยาก Lol และ +1
John Powell

ดูอย่างรวดเร็วแนะนำให้คุณอาจมีปัญหากับแบบสอบถามฐาน / ยึดของคุณ คุณจะต้องเลือกจุดเริ่มต้นสำหรับแต่ละบรรทัด A, B, C ฯลฯ ซึ่งคุณจะต้องสร้างในส่วนวนซ้ำ อาจเป็นไปได้ว่าคุณต้องเพิ่มการเรียงลำดับลงในคิวรีการสืบค้น (อาจเป็นใน x หรือ y, ทิศทาง - ยากที่จะรู้โดยไม่เห็นข้อมูล) ฉันจะทำลายมันลงและให้แน่ใจว่าฉันได้รับจุดเริ่มต้นที่เหมาะสมก่อนที่จะดำเนินการต่อกับส่วนที่เรียกซ้ำ ฉันใช้ข้อความค้นหาแบบเรียกซ้ำเพื่อค้นหาลายเส้นในอนุกรมเวลาเมื่อเร็ว ๆ นี้และเมื่อฉันมีจุดยึดที่ระบุอย่างถูกต้องส่วนที่เหลือเป็นเรื่องง่าย (ish)
John Powell

@dbaston จุดที่ดี แต่คุณสามารถทำได้ด้วยแบบสอบถามแบบเรียกซ้ำและทุกคนยังไม่ได้ติดตั้ง
John Powell

คำตอบ:


1

อย่างน้อยวิธีแก้ปัญหาของคุณก็คือการขาดการสั่งซื้อล่วงหน้าของส่วนประกอบบรรทัดตามที่ John Barçaกล่าว

แบบสอบถามแบบเรียกซ้ำมีความยากมากในการค้นหา

คุณต้องพยายามจำลอง ST_Linemerge ลักษณะการทำงานในฟังก์ชันฐานข้อมูลใหม่ ฉันจะลองดูที่แหล่งที่มาของการใช้งาน ST_Linemerge และทำซ้ำโดยดัดแปลงเป็นมุมบิด 30 องศา

หากต้องการละทิ้งการรวมกลุ่มที่ไม่อยู่ในมุม <30 องศาคุณจะต้องเปรียบเทียบพวกเขาภายในวงวนการรวมกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.