Einseitige Puffer oder parallele Linien in PostGIS erstellen?


19

Ich suche nach einer Möglichkeit, sogenannte einseitige Puffer oder parallele Linien in PostGIS zu erstellen. Beispiel: 1. Puffer, 2. einseitig, 3. beidseitig

Alt-Text

Ich habe einige Diskussionen über die Mailingliste von 2009 und Informationen darüber, dass sie in GEOS implementiert wurde , gefunden, aber nichts über den aktuellen PostGIS-Status.

Kennen Sie Problemumgehungen, falls die Funktion noch nicht implementiert ist? Ist es möglich, eine Seite eines normalen Puffers abzuschneiden?


Suchen Sie nach einem Äquivalent zu "Offset" in AutoCAD?
Dassouki

@dassouki: Entschuldigung, ich kenne AutoCAD nicht. Aber ich denke, UMN Mapserver hat eine "Offset" -Option, die genau das macht, wonach ich suche.
Underdunkel

Wie erstelle ich einseitige Puffer oder parallele Linien aus einer Tabelle mit 600 Zeilen?

Willkommen auf der Seite. Wenn die aktuellen Antworten Ihr Problem nicht lösen, sollten Sie dies als neue Frage öffnen (und angeben, warum diese Frage Ihr Problem nicht beantwortet). Innerhalb des Formats der Site ist dies kein geeigneter Ort, um diese Aussage zu treffen, da dies keine Antwort auf die Frage ist.
Andy W

Wie kann ich parallele Linien in einer MULTILINESTRING-Tabelle erstellen?
Felipe Costa

Antworten:


13

Richtige einseitige Puffer sollten in 1.5 gelandet sein , aber es scheint mir, dass Sidedness es nicht geschafft hat, während die Stile gelandet sind . Es gibt jedoch ein aktuelles Patchset, das GEOSSingleSidedBufferden einseitigen Puffer wie erwartet verfügbar macht und ausführt unter dem Namen ST_OffsetCurve; Weitere Hintergründe finden Sie in Ticket Nr. 413 . In Benutzung:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Hallo, ich versuche, diese Lösung zu verwenden, benutze aber nicht oft Postgis. Ich habe diese Abfrage getestet und erhalte einige Ausgabewerte. Aber wie übersetze ich diese in Features? Ich möchte nur die Zeilen am Ende, entweder als Teil der ursprünglichen Tabelle oder als eine neue. Dies ist meine Abfrage: select ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0') von test_data_;
Kflaw

@kflaw - Sie haben dies wahrscheinlich bereits herausgefunden, müssen jedoch nur am Anfang der Abfrage Folgendes hinzufügen: "create newtable as" oder für eine Ansicht "create or replace view newview as", gefolgt von der select-Anweisung.
Jbalk

4

In diesem Beispiel werden zwei Polygone auf beiden Seiten einer Linienfolge erstellt. Es erfordert PostGIS 1.5 oder höher. Ich bin mir nicht sicher, wie gut es mit sich kreuzenden Linien umgehen wird.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Es gibt aus:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

Der Code funktioniert folgendermaßen:

  1. Puffern Sie die Linienfolge mit ST_Buffer. Wir nutzen die PostGIS 1.5-Funktion, die benutzerdefinierte Endkappen unterstützt, um überhaupt keine Endkappe festzulegen. Siehe folgendes Beispiel.
  2. Teilen Sie das gepufferte Polygon mithilfe der im Wiki dokumentierten Methode in zwei Teile, wobei Sie die ursprüngliche Linie verwenden .

Dies könnte verbessert werden, um künftig mit sich selbst kreuzenden Leitungen fertig zu werden.

Ein gepufferter Linestring mit einer flachen Endkappe


3

Diese Änderung erstellt zwei parallele Linienfolgen. Es erfordert PostGIS 1.5 oder höher.

erforderliche Geometrie oder Wkt und Abstand im Puffer


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- ERGEBNISSE

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

Da ich hier immer noch keinen Kommentar abgeben kann, füge ich diese Antwort hinzu

SCW geben die beste Antwort,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Sieht aber so aus, als hätte die Funktion http://postgis.refractions.net/docs/ST_OffsetCurve.html geändert

Jetzt ist der 'right'Parameter nicht notwendig. Bei Verwendung des positiven Abstands wird die linke Seite und bei Verwendung des negativen Abstands die rechte Seite erstellt

Auch kein Patch mit meinem Postgis nötig

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.