Erstellen Sie ein Polygon aus Linien in PostGIS

13

Ich versuche, ein Polygon in kleinere Polygone von einer Linie zu trennen, aber ich glaube, ich kann die Funktion st_split nicht verwenden. Was ich brauche, ist das Erstellen kleiner Polygone in einem großen Polygongitter.

Ich habe einige Möglichkeiten ausprobiert, aber ich kann das Ergebnis nicht erhalten. Was ich versucht habe:

Teilen Sie ein Polygon von einem LineString mit st_split ()

Aus einem Grenzpolygon.

Bildbeschreibung hier eingeben

Und Linestring-Tabelle:

Bildbeschreibung hier eingeben

Ich würde die folgenden Polygone brauchen:

Bildbeschreibung hier eingeben

Problem : Ich kann weder ein Polygon aus mehreren Linien noch ein Polygon aus einer Multilinienfolge teilen.

Die andere Methode, die ich versuche, ist, mit st_polygonize () ein Polygon aus den Zeilen zu erstellen. Die SQL, die ich versucht habe, ist:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Extrahiert aus Erstellen von Polygonen aus Liniensegmenten mit PostgreSQL und PostGIS

Problem : Ich kann nur ein Polygon (die Grenze) erhalten.

Kann mir jemand sagen, was der beste Weg wäre, um die Polygone aus dem Linestring zu holen, oder ob ich etwas vermisse?

Hinweis: Tabellen haben dieselbe SRID und Geometrien werden in ein Raster gefangen. In QGIS kann ich den Polygonisierungsprozess von Linien zu Polygonen perfekt ausführen.

Wie John es verlangt, ist hier die Tabelle mit den Zeilenfolgen. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing

Pablo Pardo
quelle
1
Können Sie die Linienfolgengeometrien irgendwo posten? ST_Polygonize sollte zusammen mit ST_Dump funktionieren.
John Powell
Sicher. Ich habe den Beitrag mit dem Link zur Tabelle bearbeitet.
Pablo Pardo
@ JohnPowellakaBarça kannst du dir das anschauen. Diese Frage ist großartig. ST_Polygonize in seinem Sample-Set gibt ein einzelnes Polygon zurück. Wir müssen im Wesentlichen sein Durcheinander von offenen LINESTRINGS auflösen und alle finden, die Rechtecke bilden können?
Evan Carroll
1
@EvanCarroll. Sicher. Ich bin verrückt beschäftigt atm, also wahrscheinlich nicht für ein paar Tage.
John Powell
1
@ppardoz. Espero que esto te ayude. Mir ist aufgefallen, dass Ihre Tisch-Defs alle auf Spanisch waren :-)
John Powell

Antworten:

4

Ich habe dies funktioniert, indem ich zuerst ST_Node in Verbindung mit ST_Collect verwendet habe , um die Linien in einen Satz von geknoteten Linienfolgen in einem MultiLinestring zu konvertieren .

Wie es in den Dokumenten für heißt ST_Node heißt :

Knotet eine Reihe von Linienfolgen vollständig mit der geringstmöglichen Anzahl von Knoten, während alle eingegebenen beibehalten werden.

Dies bedeutet, dass alle Linienfolgen in allen möglichen Kombinationen kombiniert werden, um das Äquivalent zum äußeren Ring eines Polygons zu bilden. Wobei , wenn Sie versuchen, ST_Polygonize eine Reihe von Linestrings, von denen keine auf sie selbst ist ein Polygon beschreibt, erhalten Sie einfach die Linestrings zurück. Das funktioniert also:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Wenn Sie nur den ersten Teil davon ausführen, dh den CTE multi, sieht die Ausgabe folgendermaßen aus:

MULTILINESTRING ((204.5 69.9000000000004,204.5 69.9000000000004), (204.5 68.9.205.4 68.9), (204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.4.204.5 69.7.204.5 69.6.204.5 69.7.204.5 69.8 204.5 69.9000000000004), (209.5 68.9.209.5 68.8.209.5 68.7.209.5 68.6.209.5 68.5.209.5 68.3.209.5 68.2.209.5 68.1.209.5 68.209.5 67.9.209.5 67.8.209.5 67.7.209.5 67.6.209.5 67.4 209,5 .......

Wenn Sie jetzt diesen MultiLinestring an ST_Polygonize weiterleiten er wie erwartet, z.

POLYGON ((205.4 68.9.204.5 68.9.204.5 69.204.5 69.1.204.5 69.2.204.5 69.4.204.5 69.5.204.5 69.6.204.5 69.7.204.5 69.8.204.5 69.9.205.4 69.3.205.4 68.9)

POLYGON ((204,5 69,9000000000004,204,5 70,204,5 70,1,204,5 70,2,204,5 70,3,204,5 70,4,206,8 70,4,209,5 70,4,209,5 70,3,209,5 70,2,209,5 70,1,209,5 70,209,5 69,9,205,4 69,9,204,5 69,90000000004))

POLYGON ((206,8 70,4, 204,5 70,4, 204,5 70,5, 204,5 70,6, 204,5 70,7, 204,5 70,8, 204,5 70,9, 204,5 71,204,5 71,1, 204,5 71,2, 204,5 71,3, 204,5 71,4, 206,8 71,4, 206,8 70,4))

Offensichtlich dient ST_AsText nur zur Veranschaulichung und Sie müssen Anpassungen vornehmen, wenn Sie auch die Pfad-ID benötigen.

Der Schlüssel zum Mitnehmen ist, dass ST_Polygonize Linienfolgen erwartet, die bereits den Umriss eines Polygons beschreiben .

John Powell
quelle
Das ist wirklich cool, ich kann bestätigen, dass diese Lösung funktioniert! Auf der anderen Seite frage ich mich, warum man ST_Polygonize()sagt, dass es ST_Node()
Evan Carroll,
1
@EvanCarroll. Ich denke, dass die Antwort ist, dass ST_Polygonize Linienfolgen nimmt, die bereits in einer Menge enthalten sind, die ein Polygon darstellt, während die Linienfolgen in dieser Frage mehrere mögliche Polygone bildeten. Mein Verständnis ist, dass dies das ist, was ST_Node tut. Ich werde versuchen weiter zu recherchieren und die Antwort zu aktualisieren.
John Powell