Calcular líneas paralelas a lo largo de una línea central en PostGIS

10

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:

Escenario de muestra

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:

Escenario de salida deseado

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:

salida_código

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):

líneas requeridas en la salida real

¿Alguien puede sugerirme cómo obtener el resultado deseado?

khajlk
fuente
¿Puedes agregar una imagen de la salida real también? Ayuda a comprender el problema.
inclinación
@tilt: he editado la pregunta. Acabo de agregar la salida real y las líneas paralelas requeridas en la salida real.
khajlk
El problema es más complejo de lo que piensas. Primero tienes que averiguar de qué lado de la calle están las casas. Solo entonces puedes encontrar el más cercano a ambos lados. Aquí hay una publicación que tiene un código de ejemplo para encontrar el lado correcto: gis.stackexchange.com/questions/156578/…
inclinación
En realidad, puede haber casos en los que los edificios estén solo de un lado (lo llamaría excepciones). Podría modificar mi código para manejar excepciones una vez que pueda alcanzar el resultado deseado. En lo anterior, todavía se ven polígonos de construcción en ambos lados. En este punto, mi requisito es obtener líneas paralelas a ambos lados de la calle (como las que mostré en la figura). Con respecto a su enlace, podría usar el código de ejemplo para mejorar mi código anterior probablemente más tarde.
khajlk
Una cosa que veo es que el búfer es redundante. Puede usar stdwithin y usar 50 como la distancia. (Seleccione calles, edificios donde st_dwithin (calles, edificios, 50))
jbalk

Respuestas:

1

Si modificó la distancia CTE para que sea la siguiente:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

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.

Andy Harfoot
fuente
Gracias por la sugerencia. Lo probaré y veré si da el resultado esperado. He estado investigando para resolver este problema. Descubrí una idea loca: comenzar con un búfer de 1 m alrededor de la calle e incrementar el búfer mediante programación Y buscar edificios en ambos lados hasta que el recuento de edificios sea 2, luego devolver esta distancia del búfer como ancho de la calle. El objetivo final de todo el ejercicio anterior.
khajlk
Es cierto que solo se genera un par de desplazamiento utilizando su sugerencia. Sin embargo, todavía faltan las líneas paralelas amarillas que se muestran arriba :(
khajlk