У мене в базі даних 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:
Фактичний вихід вищевказаного коду:
Тоді як у наведеному вище висновку потрібні лише жовті паралельні лінії (зміщення кривих до найближчих багатокутників по обидва боки вулиці):
Хто-небудь може підказати мені, як отримати бажаний вихід?