У меня есть улица (осевая линия дороги) и таблицы многоугольников в моей базе данных 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:
Фактический результат вышеприведенного кода:
Хотя в приведенном выше выводе требуются только желтые параллельные линии (кривые смещения до ближайших многоугольников по обе стороны улицы):
Кто-нибудь может подсказать, как получить желаемый результат?
источник
Ответы:
Если вы изменили расстояние CTE следующим образом:
тогда для каждой улицы будет возвращено только самое короткое расстояние, и на этом расстоянии будет сгенерирована одна пара линий смещения.
источник