เข้าร่วมเส้นตัดกันกับ PostGIS


15

นี่คือสิ่งที่ฉันเกือบจะละอายใจที่จะถาม แต่ฉันดูเหมือนจะไม่สามารถทำงานให้กับชีวิตของฉันได้

ฉันมีเลเยอร์ถนนที่มีเซ็กเมนต์แต่ละเซกเมนต์มีRoad IDและเซกเมนtypeต์

ฉันต้องการที่จะเข้าร่วมทุกภาคส่วนร่วมกันสำหรับแต่ละRoad IDเป็นหนึ่ง LineString แต่เมื่อพวกเขาเป็นเดียวกันtypeและมีการสัมผัส (สายทั้งหมดจะ snaped กัน)

ป้อนคำอธิบายรูปภาพที่นี่

Road ID - Type
   1       L
   1       L
   1       T
   1       L

คำตอบ:


11

ฉันเชื่อว่ารหัสด้านล่างเป็นคำตอบที่สะอาดกว่าคำตอบที่เลือกด้วยเหตุผลสองสามข้อ ก่อนอื่นไม่จำเป็นต้องรวมโต๊ะเข้าด้วยกันดังนั้นจึงไม่จำเป็นต้องเพิ่มภาคผนวกของคำสั่ง 'ON' สำหรับแอตทริบิวต์ถนนแต่ละอันและวิธีที่สองที่กล่าวมาข้างต้นอาจทำให้เกิดการเชื่อมต่อที่หลากหลายหากมีหลายกลุ่มที่ไม่ต่อเนื่องกันของถนน ค่าคุณลักษณะเดียวกันทั้งหมดในขณะที่ ST_Dump ดูแลปัญหานั้นในโซลูชันนี้

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

รูปทรงเรขาคณิตของฉันไม่รวมเข้ากับข้อความค้นหาใด ๆ
Luffydude

@ Luffydude สนใจที่จะให้ข้อมูลเพิ่มเติมหรือไม่ อาจเป็นไปได้ว่ารูปทรงเรขาคณิตที่คุณทำงานด้วยนั้นไม่สอดคล้องกันซึ่งเป็นไปได้ที่จะรวมเข้าด้วยกัน
Grant Humphries

สิ่งนี้ทำงานได้อย่างสวยงามสำหรับฉันที่จะรวมชุดข้อมูลถนนตามรหัสถนน เรื่องนี้จัดการกับถนนด้วยช่องว่างอย่างสวยงาม (ไม่มีเส้นข้ามส่วนช่องว่าง) ฉันไม่ได้เป็น OP แต่เป็นคำตอบที่ดี นี่ควรเป็นคำตอบที่ยอมรับได้ ขอบคุณ
jbalk

นี่คือคำตอบที่ดีที่สุด!
aborruso

6

ดูเหมือนว่างานนี้

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

เพียงแค่ถ่มน้ำลายใส่ลูกบอล แต่ฉันสามารถคิดถึงวิธีแก้ปัญหาอื่น ๆ ฉันไม่รู้ว่าพวกเขาดีขึ้นหรือแย่ลงแค่นั้นพวกเขาเป็นคนอื่น

ก่อนอื่นหากมีประเภทของถนนเพียงไม่กี่ประเภทคุณสามารถไปทีละประเภทได้ดังนี้:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

คุณสามารถใช้ส่วนใหญ่ข้างต้นกับ Road_Type เป็นตัวแปรในการวนรอบ FOR ถ้ามีหลายประเภท

ความคิดสุดท้ายของฉันเกี่ยวข้องกับการรวมรูปทรงเรขาคณิตทั้งหมดจากนั้นเรียกประเภทถนนด้วยฟังก์ชัน ST_Line_Substring ( Link-Link ) แต่มันจะไม่ทำงานเลย

ขอให้โชคดีกับมันนะ Rob

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