Hitung garis paralel di sepanjang garis tengah di PostGIS

10

Saya memiliki jalan (garis tengah jalan) dan membangun tabel poligon di basis data PostgreSQL saya. Skenario sampel adalah sebagai berikut:

Skenario sampel

Masalah:

Saya perlu menghitung garis paralel di sepanjang jalan di persimpangan penyangga 50 meter di sekitar jalan dan poligon bangunan terdekat di kedua sisi. Skenario keluaran yang diinginkan adalah:

Skenario keluaran yang diinginkan

Apa yang saya coba:

Pendekatan saya adalah:

 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

Ini usaha saya:

    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

Masalah dengan kode di atas adalah bahwa ia tidak mengembalikan garis paralel sesuai dengan output yang diinginkan yaitu, garis paralel di semua persimpangan poligon yang dihasilkan daripada di persimpangan poligon terdekat.

EDIT_1:

Output aktual dari kode di atas adalah:

code_output

Sementara, dalam output di atas hanya garis paralel kuning (kurva offset ke poligon terdekat di kedua sisi jalan) yang diperlukan:

baris yang diperlukan dalam output aktual

Adakah yang bisa menyarankan saya cara mendapatkan output yang diinginkan?

khajlk
sumber
Bisakah Anda menambahkan gambar dari output aktual juga? Ini membantu dalam memahami masalah.
miringkan
@ miring: Saya telah mengedit pertanyaan. Baru saja menambahkan output aktual dan garis paralel yang diperlukan dalam output aktual.
khajlk
Masalahnya lebih kompleks dari yang Anda pikirkan. Haus Anda harus mencari tahu di sisi jalan mana rumah-rumah berada. Hanya dengan begitu Anda dapat menemukan yang paling dekat di kedua sisi. Berikut adalah pos yang memiliki kode contoh untuk menemukan sisi yang benar: gis.stackexchange.com/questions/156578/…
tilt
Pada kenyataannya, mungkin ada kasus di mana bangunan hanya di satu sisi (saya akan menyebutnya pengecualian). Saya dapat memodifikasi kode saya untuk menangani pengecualian begitu saya dapat mencapai hasil yang diinginkan. Di atas, Anda masih melihat poligon bangunan di kedua sisi. Pada titik ini, persyaratan saya adalah untuk mendapatkan garis paralel di kedua sisi jalan (seperti yang saya tunjukkan pada gambar). Mengenai tautan Anda, saya dapat menggunakan kode contoh untuk meningkatkan kode saya di atas mungkin nanti.
khajlk
Satu hal yang saya lihat adalah buffer itu berlebihan. Anda bisa menggunakan stdwithin dan menggunakan 50 sebagai jarak. (Pilih jalan, bangunan tempat st_dwithin (jalan, bangunan, 50))
jbalk

Jawaban:

1

Jika Anda mengubah jarak CTE menjadi sebagai berikut:

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

maka hanya jarak terdekat yang akan dikembalikan untuk setiap jalan, dan sepasang garis offset akan dihasilkan pada jarak itu.

Andy Harfoot
sumber
Terima kasih atas sarannya. Saya akan mengujinya dan melihat apakah itu memberikan hasil yang diharapkan. Saya telah menggali sekitar untuk menyelesaikan masalah ini. Saya menemukan satu ide gila: Untuk memulai dengan 1 m penyangga di sekitar jalan dan secara terprogram menambah penyangga DAN mencari bangunan di kedua sisi hingga jumlah bangunan 2, lalu kembalikan jarak penyangga ini sebagai lebar jalan. Tujuan akhir dari semua latihan di atas.
khajlk
Benar bahwa hanya satu pasang offset yang dihasilkan menggunakan saran Anda. Namun, garis paralle kuning yang ditunjukkan di atas masih hilang :(
khajlk