Tengo la calle (línea central del camino) y la construcción de tablas de polígonos en mi base de datos PostgreSQL. El escenario de muestra es el siguiente:
Problema:
Necesito calcular líneas paralelas a lo largo de la calle en la intersección del búfer de 50 metros alrededor de la calle y el polígono del edificio más cercano a ambos lados. El escenario de salida deseado es:
Lo que he intentado:
Mi enfoque fue:
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
Aquí está mi intento:
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
El problema con el código anterior es que no devuelve líneas paralelas de acuerdo con la salida deseada, es decir, se generan líneas paralelas en todas las intersecciones de polígonos en lugar de en la intersección de los polígonos más cercanos.
EDIT_1:
La salida real del código anterior es:
Mientras que en la salida anterior solo se requieren líneas paralelas amarillas (curvas de desplazamiento a los polígonos más cercanos a ambos lados de la calle):
¿Alguien puede sugerirme cómo obtener el resultado deseado?
fuente
Respuestas:
Si modificó la distancia CTE para que sea la siguiente:
entonces solo se devolvería la distancia más corta para cada calle, y se generaría un par de líneas de desplazamiento a esa distancia.
fuente