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:
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:
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:
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:
Quelqu'un peut-il me suggérer comment obtenir la sortie souhaitée?
la source
Réponses:
Si vous avez modifié la distance CTE comme suit:
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.
la source