Ich habe eine Straße (Straßenmittellinie) und baue Polygontabellen in meiner PostgreSQL-Datenbank. Das Beispielszenario lautet wie folgt:
Problem:
Ich muss parallele Linien entlang der Straße an der Kreuzung von 50 Metern Puffer um die Straße und dem nächsten Gebäudepolygon auf beiden Seiten berechnen. Das gewünschte Ausgabeszenario ist:
Was ich versucht habe:
Mein Ansatz war:
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
Hier ist mein Versuch:
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
Das Problem mit dem obigen Code besteht darin, dass keine parallelen Linien gemäß der gewünschten Ausgabe zurückgegeben werden, dh parallele Linien an allen Polygonschnittpunkten werden anstelle des Schnittpunkts der nächsten Polygone erzeugt.
EDIT_1:
Die tatsächliche Ausgabe des obigen Codes ist:
Während in der obigen Ausgabe nur gelbe parallele Linien (Versatzkurven zu den nächsten Polygonen auf beiden Straßenseiten) erforderlich sind:
Kann mir jemand vorschlagen, wie ich die gewünschte Ausgabe bekomme?
quelle
Antworten:
Wenn Sie den Abstand CTE wie folgt geändert haben:
dann würde nur die kürzeste Entfernung für jede Straße zurückgegeben, und ein Paar versetzter Linien würde in dieser Entfernung erzeugt.
quelle