Calculer des lignes parallèles le long d'une ligne centrale dans PostGIS

10

J'ai une rue (ligne centrale de la route) et je crée des tables de polygones dans ma base de données PostgreSQL. L'exemple de scénario est le suivant:

Exemple de scénario

Problème:

J'ai besoin de calculer des lignes parallèles le long de la rue à l'intersection de 50 mètres de tampon autour de la rue et du polygone du bâtiment le plus proche des deux côtés. Le scénario de sortie souhaité est:

Scénario de sortie souhaité

Ce que j'ai essayé:

Mon approche était:

 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

Voici ma tentative:

    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

Le problème avec le code ci-dessus est qu'il ne renvoie pas de lignes parallèles en fonction de la sortie souhaitée, c'est-à-dire que des lignes parallèles à toutes les intersections de polygones sont générées plutôt qu'à l'intersection des polygones les plus proches.

EDIT_1:

La sortie réelle du code ci-dessus est:

code_output

Alors que dans la sortie ci-dessus, seules les lignes parallèles jaunes (courbes de décalage par rapport aux polygones les plus proches des deux côtés de la rue) sont requises:

lignes requises en sortie réelle

Quelqu'un peut-il me suggérer comment obtenir la sortie souhaitée?

khajlk
la source
Pouvez-vous également ajouter une image de la sortie réelle? Cela aide à comprendre le problème.
tilt
@tilt: J'ai édité la question. Juste ajouté la sortie réelle et les lignes parallèles requises dans la sortie réelle.
khajlk
La question est plus complexe que vous ne le pensez. Soif, il faut savoir de quel côté de la rue se trouvent les maisons. Ce n'est qu'alors que vous pouvez trouver le plus proche des deux côtés. Voici un article qui contient un exemple de code pour trouver le bon côté: gis.stackexchange.com/questions/156578/…
tilt
En réalité, il peut y avoir des cas où les bâtiments ne sont que d'un côté (j'appellerais cela des exceptions). Je pourrais modifier mon code pour gérer les exceptions une fois que je serai en mesure d'atteindre la sortie souhaitée. En haut, vous voyez toujours des polygones de construction des deux côtés. À ce stade, mon exigence est d'obtenir des lignes parallèles des deux côtés de la rue (comme celles que j'ai montrées sur la figure). Concernant votre lien, je pourrais utiliser l'exemple de code pour améliorer mon code ci-dessus probablement plus tard.
khajlk
Une chose que je vois est que le tampon est redondant. Vous pouvez simplement utiliser stdwithin et utiliser 50 comme distance. (Sélectionnez les rues, bâtiments où st_dwithin (rues, bâtiments, 50))
jbalk

Réponses:

1

Si vous avez modifié la distance CTE comme suit:

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

alors seule la distance la plus courte serait renvoyée pour chaque rue et une paire de lignes décalées serait générée à cette distance.

Andy Harfoot
la source
Merci pour la suggestion. Je vais le tester et voir s'il donne le résultat attendu. J'ai fouillé pour résoudre ce problème. J'ai découvert une idée folle: commencer avec 1 m de tampon autour de la rue et incrémenter par programme le tampon ET rechercher des bâtiments des deux côtés jusqu'à ce que le nombre de bâtiments soit de 2, puis renvoyer cette distance de tampon comme largeur de rue. Le but ultime de tous les exercices ci-dessus.
khajlk
Il est vrai qu'une seule paire de décalage est générée à l'aide de votre suggestion. Cependant, les lignes jaunes de paralle ci-dessus sont toujours manquantes :(
khajlk