[EDIT: Die Lösung hierfür bestand einfach darin, OGR zum Lesen von Shapefiles zu verwenden. Siehe das Beispiel von geographika.]
In einem ESRI-Shapefile gibt es keinen Unterschied zwischen Polygonen und MultiPolygonen. Darüber hinaus gibt es keine explizite Unterscheidung zwischen Innenlöchern und Außenringen (abgesehen von der "Händigkeit" eines bestimmten Polygons).
Nachdem ich ein Shapefile gelesen habe, habe ich eine Liste von Koordinatensequenzen, die Ringe beschreiben, aber ohne eine intensivere Verarbeitung kann ich nicht unterscheiden, welche dieser Ringe Außenringe, Innenlöcher oder zusätzliche Polygone sind.
Es scheint , dass für wohlgeformte ‚s Polygon und Multipolygon Bauer, es muss eine klare Unterscheidung zwischen Außen- und Innenringen sein, so wie soll ich bewege sich von einer unklaren Liste der Ringe zu einem geordneten Satz von getrennten Polygone mit klar bezeichneten Innen- und Außenringe ?
Zusammenfassend: Wenn ich eine Liste von Polygonringen habe, aber nicht weiß, welche Ringe Löcher im Inneren oder separate Polygone sind, wie sollte ich sie am besten in separate Polygone mit bestimmten inneren Löchern sortieren?
Ich suche nach einer einfachen algorithmischen Lösung, die ich in Python implementieren kann, mit der Hunderte von Polygonen in einer Minute oder weniger verarbeitet werden können, und ich mache dies, um eine große Anzahl von Schnittpunkten auszuführen.
Antworten:
Um die Antwort von relet zu erhalten, wie einzelne Polygone erhalten werden, können Sie dann einen Schnittpunkt für alle Polygone ausführen, um die Löcher zu erstellen. Wenn Ihr Datensatz überlappende Polygone enthält, haben Sie kein Glück.
Erklären Sie noch einmal, was mit vorhandenen Shapefile-Lesern nicht stimmt.
Wäre es nicht einfacher, Feature-IDs und M-Werte aus dem Shapefile zu exportieren und sie dann nach Verwendung eines vorhandenen Shapefile-Readers wieder mit den Polygonen zu verbinden?
Für Multipatches können Sie dieselbe Technik verwenden, um einer "Patch-ID" Polygon-IDs zuzuweisen und dieses Attribut dann wieder zu den Features hinzuzufügen.
Bearbeiten: Während Sie sagen, dass Sie OGR nicht verwenden möchten, nur für den Fall, dass Sie Ihre Meinung ändern ..
Die Geometrie sollte wie folgt ausgegeben werden:
Die erste Klammer enthält die Koordinaten des Außenrings, die nachfolgenden Klammern die Koordinaten der Innenringe. Wenn Sie Z-Werte haben, sollten Punkte das Format 79285 57742 10 haben (wobei die letzte Koordinate eine Höhe ist).
Andernfalls können Sie die Funktionen Shapely Contains und Within verwenden, um jedes Polygon miteinander zu bewerten und zuvor einen räumlichen Index anzuwenden - http://pypi.python.org/pypi/Rtree/ , um die Verarbeitung zu beschleunigen.
quelle
Verwenden Sie zuerst ogr, um das Shapefile zu öffnen:
Shapefile-Geometrien in formschöne Geometrien umwandeln
Für die Polygone im Multipolygon:
Und jetzt können Sie alle Funktionen von Shapely ( Shapely ) nutzen.
quelle
Ich bin nicht allzu vertraut damit, wie Polygone tatsächlich in Formdateien gespeichert werden, aber - sollte ein Polygonring nicht genau dann eine geschlossene Schleife sein, wenn die Startkoordinate wiederholt wird? Wenn Sie also jede nachfolgende Koordinate mit der Startkoordinate vergleichen, finden Sie den ersten Punkt, an dem ein Polygon geschlossen wird. Wenn dies die letzte Koordinate des Polygons ist, handelt es sich um ein einfaches Polygon. Wenn nicht, handelt es sich um ein Multipolygon, für das die anderen Schleifen verarbeitet werden müssen.
Das ist vielleicht die "intensivere Verarbeitung", die Sie vermeiden möchten, aber es ist wirklich nur eine Iteration durch die Koordinaten, die kostenlos ist, wenn Sie sie trotzdem einlesen müssen.
quelle
Wie durch @ inc42 angegeben , finden Sie auf Seite 8 der Technischen Beschreibung des ESRI-Shapefiles: Ein ESRI-Weißbuch - Juli 1998 (Seite 12 von 34 im PDF) eine Diskussion über den Inhalt von Polygondatensätzen , nach denen Sie möglicherweise suchen :
quelle