W mojej bazie danych PostgreSQL mam ulicę (środkową linię drogi) i buduję tabele wielokątów. Przykładowy scenariusz wygląda następująco:
Problem:
Muszę obliczyć równoległe linie wzdłuż ulicy na przecięciu 50 m bufora wokół ulicy i najbliższego wielokąta budynku po obu stronach. Pożądany scenariusz wyjściowy to:
Co próbowałem:
Moje podejście było następujące:
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
Oto moja próba:
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
Problem z powyższym kodem polega na tym, że nie zwraca on równoległych linii zgodnie z pożądanym wyjściem, tj. Generowane są równoległe linie na wszystkich przecięciach wielokątów zamiast na przecięciu najbliższych wielokątów.
EDIT_1:
Rzeczywiste wyjście powyższego kodu to:
Podczas gdy na powyższym wyjściu wymagane są tylko żółte równoległe linie (przesunięcie krzywych do najbliższych wielokątów po obu stronach ulicy):
Czy ktoś może mi zasugerować, jak uzyskać pożądaną wydajność?
źródło
Odpowiedzi:
Jeśli zmodyfikowałeś odległość CTE w następujący sposób:
wówczas dla każdej ulicy zwracana byłaby tylko najkrótsza odległość i w tej odległości generowana byłaby jedna para linii przesunięcia.
źródło