Berechnen Sie in PostGIS parallele Linien entlang einer Mittellinie

10

Ich habe eine Straße (Straßenmittellinie) und baue Polygontabellen in meiner PostgreSQL-Datenbank. Das Beispielszenario lautet wie folgt:

Beispielszenario

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:

Gewünschtes Ausgabeszenario

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:

code_output

Während in der obigen Ausgabe nur gelbe parallele Linien (Versatzkurven zu den nächsten Polygonen auf beiden Straßenseiten) erforderlich sind:

erforderliche Zeilen in der tatsächlichen Ausgabe

Kann mir jemand vorschlagen, wie ich die gewünschte Ausgabe bekomme?

khajlk
quelle
Können Sie auch ein Bild der tatsächlichen Ausgabe hinzufügen? Es hilft beim Verständnis des Problems.
Neigung
@tilt: Ich habe die Frage bearbeitet. Fügen Sie einfach die tatsächliche Ausgabe und die erforderlichen parallelen Linien zur tatsächlichen Ausgabe hinzu.
Khajlk
Das Problem ist komplexer als Sie denken. Durst muss man herausfinden, auf welcher Straßenseite sich die Häuser befinden. Nur dann finden Sie auf beiden Seiten den nächstgelegenen . Hier ist ein Beitrag, der Beispielcode zum Finden der richtigen Seite enthält: gis.stackexchange.com/questions/156578/…
Tilt
In der Realität kann es Fälle geben, in denen Gebäude nur auf einer Seite stehen (ich würde es Ausnahmen nennen). Ich könnte meinen Code ändern, um Ausnahmen zu behandeln, sobald ich meine gewünschte Ausgabe erreichen kann. Oben sehen Sie immer noch das Erstellen von Polygonen auf beiden Seiten. An diesem Punkt ist es meine Anforderung, parallele Linien auf beiden Seiten der Straße zu erhalten (wie die, die ich in der Abbildung gezeigt habe). In Bezug auf Ihren Link könnte ich den Beispielcode verwenden, um meinen obigen Code wahrscheinlich später zu verbessern.
Khajlk
Eine Sache, die ich sehe, ist, dass der Puffer redundant ist. Sie können einfach stdwithin und 50 als Abstand verwenden. (Wählen Sie Straßen, Gebäude, in denen st_dwithin (Straßen, Gebäude, 50))
jbalk

Antworten:

1

Wenn Sie den Abstand CTE wie folgt geändert haben:

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

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.

Andy Harfoot
quelle
Vielen Dank für den Vorschlag. Ich werde es testen und sehen, ob es das erwartete Ergebnis liefert. Ich habe herumgegraben, um dieses Problem zu lösen. Ich entdeckte eine verrückte Idee: Beginnen Sie mit 1 m Puffer um die Straße und erhöhen Sie den Puffer programmgesteuert UND suchen Sie nach Gebäuden auf beiden Seiten, bis die Anzahl der Gebäude 2 beträgt. Geben Sie dann diesen Pufferabstand als Straßenbreite zurück. Das ultimative Ziel aller oben genannten Übungen.
Khajlk
Es ist wahr, dass mit Ihrem Vorschlag nur ein Offset-Paar generiert wird. Die oben gezeigten gelben Paralle-Linien fehlen jedoch noch :(
khajlk