คำนวณเส้นขนานตามแนวเส้นกึ่งกลางใน PostGIS


10

ฉันมีถนน (เส้นกลางถนน) และสร้างตารางหลายเหลี่ยมในฐานข้อมูล PostgreSQL ของฉัน สถานการณ์ตัวอย่างเป็นดังนี้:

สถานการณ์ตัวอย่าง

ปัญหา:

ฉันต้องคำนวณเส้นขนานตามถนนที่จุดตัดของบัฟเฟอร์ 50 เมตรรอบถนนและรูปหลายเหลี่ยมอาคารที่ใกล้ที่สุดทั้งสองด้าน สถานการณ์เอาท์พุทที่ต้องการคือ:

สถานการณ์จำลองผลลัพธ์ที่ต้องการ

สิ่งที่ฉันได้ลอง:

แนวทางของฉันคือ:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

นี่คือความพยายามของฉัน:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

ปัญหาของโค้ดข้างต้นคือมันไม่ได้ส่งคืนเส้นคู่ขนานตามผลลัพธ์ที่ต้องการนั่นคือการสร้างเส้นคู่ขนานที่จุดแยกรูปหลายเหลี่ยมทั้งหมดแทนที่จะเป็นจุดตัดของรูปหลายเหลี่ยมที่ใกล้ที่สุด

EDIT_1:

เอาต์พุตจริงของโค้ดด้านบนคือ:

code_output

ในขณะที่ในการส่งออกข้างต้นจะต้องใช้เส้นขนานสีเหลือง (เส้นโค้งตรงข้ามกับรูปหลายเหลี่ยมที่ใกล้ที่สุดบนถนนทั้งสองด้าน):

บรรทัดที่ต้องการในเอาต์พุตจริง

ใครช่วยแนะนำฉันได้อย่างไรถึงได้ผลลัพธ์ที่ต้องการ?


คุณสามารถเพิ่มภาพของผลผลิตจริงได้หรือไม่? ช่วยในการทำความเข้าใจปัญหา
เอียง

@tilt: ฉันได้แก้ไขคำถาม เพิ่งเพิ่มเอาท์พุทที่เกิดขึ้นจริงและต้องมีเส้นคู่ขนานในเอาท์พุทที่เกิดขึ้นจริง
khajlk

ปัญหาซับซ้อนกว่าที่คุณคิด ความกระหายที่คุณจะต้องรู้ว่าบ้านอยู่ตรงไหน เท่านั้นจากนั้นคุณสามารถค้นหาที่ใกล้เคียงที่สุดทั้งสองด้าน นี่คือโพสต์ที่มีรหัสตัวอย่างสำหรับค้นหาด้านที่ถูกต้อง: gis.stackexchange.com/questions/156578/…
เอียง

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

สิ่งหนึ่งที่ฉันเห็นคือบัฟเฟอร์มีความซ้ำซ้อน คุณสามารถใช้ stdwithin และใช้ 50 เป็นระยะทาง (เลือกถนนอาคารที่ st_dwithin (ถนนอาคาร 50))
jbalk

คำตอบ:


1

หากคุณแก้ไข CTE ระยะทางให้เป็นดังนี้:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

จากนั้นจะส่งคืนเฉพาะระยะทางที่สั้นที่สุดสำหรับถนนแต่ละเส้นและเส้นชดเชยหนึ่งคู่จะถูกสร้างในระยะทางนั้น


ขอบคุณสำหรับคำแนะนำ ฉันจะทดสอบและดูว่ามันจะให้ผลลัพธ์ที่คาดหวัง ฉันขุดไปเรื่อย ๆ เพื่อแก้ไขปัญหานี้ ฉันค้นพบหนึ่งความคิดที่บ้าคลั่ง: เริ่มต้นด้วยบัฟเฟอร์ 1 ม. รอบถนนและเพิ่มบัฟเฟอร์โดยทางโปรแกรมและค้นหาอาคารทั้งสองด้านจนกระทั่งจำนวนอาคารเป็น 2 จากนั้นส่งคืนระยะบัฟเฟอร์นี้เป็นความกว้างของถนน เป้าหมายสูงสุดของการฝึกทั้งหมดข้างต้น
khajlk

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