Calcola linee parallele lungo una linea centrale in PostGIS


10

Ho via (linea centrale stradale) e costruzione di tabelle poligonali nel mio database PostgreSQL. Lo scenario di esempio è il seguente:

Scenario di esempio

Problema:

Devo calcolare le linee parallele lungo la strada all'intersezione di un buffer di 50 metri attorno alla strada e al poligono dell'edificio più vicino su entrambi i lati. Lo scenario di output desiderato è:

Scenario di output desiderato

Cosa ho provato:

Il mio approccio era:

 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

Ecco il mio tentativo:

    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

Il problema con il codice sopra è che non restituisce linee parallele in base all'output desiderato, ovvero, vengono generate linee parallele in tutte le intersezioni dei poligoni anziché nell'intersezione dei poligoni più vicini.

EDIT_1:

L'output effettivo del codice sopra è:

code_output

Mentre, nell'output sopra, sono richieste solo linee parallele gialle (curve di offset ai poligoni più vicini su entrambi i lati della strada):

linee richieste nell'output effettivo

Qualcuno può suggerirmi come ottenere l'output desiderato?


Puoi aggiungere anche un'immagine dell'output effettivo? Aiuta a comprendere il problema.
inclinazione

@tilt: ho modificato la domanda. Ho appena aggiunto l'output effettivo e richiesto linee parallele nell'output effettivo.
khajlk,

Il problema è più complesso di quanto pensi. Devi prima scoprire da che parte della strada si trovano le case. Solo allora puoi trovare il più vicino da entrambi i lati. Ecco un post che ha un codice di esempio per trovare il lato corretto: gis.stackexchange.com/questions/156578/…
tilt

In realtà, ci possono essere casi in cui gli edifici sono solo su un lato (lo definirei eccezioni). Potrei modificare il mio codice per gestire le eccezioni una volta che sono in grado di raggiungere l'output desiderato. In alto, vedi ancora costruire poligoni su entrambi i lati. A questo punto, il mio requisito è quello di ottenere linee parallele su entrambi i lati della strada (come quelle che ho mostrato in figura). Per quanto riguarda il tuo link, potrei usare il codice di esempio per migliorare il mio codice sopra probabilmente più tardi.
khajlk,

Una cosa che vedo è che il buffer è ridondante. Puoi semplicemente usare stdwithin e usare 50 come distanza. (Seleziona strade, edifici in cui st_dwithin (strade, edifici, 50))
jbalk

Risposte:


1

Se hai modificato la distanza CTE in modo che sia la seguente:

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

quindi sarebbe restituita solo la distanza più breve per ogni strada e una coppia di linee offset sarebbe generata a quella distanza.


Grazie per il suggerimento Lo proverò e vedrò se dà il risultato atteso. Ho cercato in giro per risolvere questo problema. Ho scoperto un'idea folle: iniziare con un buffer di 1 m attorno alla strada e incrementare programmaticamente il buffer E cercare edifici su entrambi i lati fino a quando il conteggio degli edifici è 2, quindi restituire questa distanza del buffer come larghezza della strada. L'obiettivo finale di tutto l'esercizio sopra.
khajlk,

È vero che solo una coppia di offset viene generata usando il tuo suggerimento. Tuttavia, mancano ancora le linee gialle di paralle mostrate sopra :(
khajlk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.