Saya memiliki jalan (garis tengah jalan) dan membangun tabel poligon di basis data PostgreSQL saya. Skenario sampel adalah sebagai berikut:
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:
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:
Sementara, dalam output di atas hanya garis paralel kuning (kurva offset ke poligon terdekat di kedua sisi jalan) yang diperlukan:
Adakah yang bisa menyarankan saya cara mendapatkan output yang diinginkan?
sumber
Jawaban:
Jika Anda mengubah jarak CTE menjadi sebagai berikut:
maka hanya jarak terdekat yang akan dikembalikan untuk setiap jalan, dan sepasang garis offset akan dihasilkan pada jarak itu.
sumber