Es hat eine Weile gedauert, bis ich herausgefunden habe, dass ein Polygon eine Außengrenze und möglicherweise mehrere Innengrenzen hat. Ich poste hier, weil einige der Antworten diese Unterscheidung nicht widerspiegeln, obwohl der ursprüngliche Beitrag fairerweise kein Polygon mit inneren Grenzen als Beispiel verwendet hat.
Die Punkte, die die Außengrenze bilden, sind in einer Koordinatenfolge angeordnet, die als erhalten werden kann
polygon.exterior.coords
Sie können die Länge dieses Objekts mithilfe von ermitteln len(polygon.exterior.coords)
und das Objekt wie eine Liste indizieren. Verwenden Sie zum Beispiel, um den ersten Scheitelpunkt zu erhalten polygon.exterior.coords[0]
. Beachten Sie, dass der erste und der letzte Punkt gleich sind. Wenn Sie eine Liste mit den Eckpunkten ohne diesen wiederholten Punkt wünschen, verwenden Sie polygon.exterior.coords[:-1]
.
Sie können die CoordinateSequence (einschließlich des wiederholten Scheitelpunkts) in eine Liste von Punkten konvertieren:
list(polygon.exterior.coords)
In ähnlicher Weise wird die Koordinatenfolge, die aus den Eckpunkten besteht, die die erste innere Grenze bilden, als erhalten polygon.interiors[0].coords
, und die Liste dieser Eckpunkte (ohne den wiederholten Punkt) wird als erhalten polygon.interiors[0].coords[:-1]
.
Sie können die formschöne
mapping
Funktion verwenden:>>> from shapely.geometry import Polygon, mapping >>> sh_polygon = Polygon(((0,0), (1,1), (0,1))) >>> mapping(sh_polygon) {'type': 'Polygon', 'coordinates': (((0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)),)}
quelle
Ich habe das benutzt:
list(zip(*p.exterior.coords.xy))
Polygon erstellt mit: gibt
p = Polygon([(0,0),(1,1),(1,0),(0,0)])
zurück:[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
quelle
Wenn Sie wirklich die wohlgeformten wollen Punktobjekte , die das Polygon bilden, und zwar nicht nur Tupel von Koordinaten, können Sie , dass auf diese Weise tun:
quelle
Mit NumPy.array können Sie ein formschönes Polygon in ein NumPy-Array konvertieren. Ich finde die Verwendung von NumPy-Arrays nützlicher als die von coords.xy zurückgegebenen Arrays, da die Koordinaten gepaart sind und nicht in zwei eindimensionalen Arrays. Verwenden Sie das, was für Ihre Anwendung nützlicher ist.
import numpy as np x = [1, 2, 3, 4] y = [9, 8, 7, 6] polygon = Polygon(x,y) points = np.array(polygon) # points is: [[ 1 9] [ 2 8] [ 3 7] [ 4 6]]
quelle
coords.xy
dieser konnte ich eine geordnete Liste externer Punkte oder vielleicht die externen Punkte eines Gitters herausziehen ... Ich werde damit spielen wenn ich Zeit habe und mich wieder melde :)Polygon(x,y)
wird nicht akzeptiert.np.array(some_actual_polygon)
verhält sich auch nicht wie gezeigt.Sie können eine der beiden folgenden Methoden verwenden.
1)
p = Polygon([(1,0),(1,1),(0,1),(0,0)]) for x,y in p.exterior.coords: print(x,y)
Der obige Code gibt Folgendes aus. Beachten Sie, dass (1,0) zweimal gedruckt wird, da external.coords eine geordnete Sequenz zurückgibt, die das Polygon vervollständigt.
1.0 0.0 1.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0
2)
Es wird Folgendes ausgegeben
(array('d', [1.0, 1.0, 0.0, 0.0, 1.0]), array('d', [0.0, 1.0, 1.0, 0.0, 0.0]))
quelle
Update (09.06.2017):
Da die letzte Antwort mit der neuesten Version von Shapely nicht mehr zu funktionieren scheint, schlage ich dieses Update vor.
Shapely bietet die Numpy-Array-Schnittstelle (wie im Dokument angegeben: http://toblerity.org/shapely/project.html )
Sei
poly
also eine formschöne Polygongeometrie:In [2]: type(poly) Out[2]: shapely.geometry.polygon.Polygon
Dieser Befehl führt die Konvertierung in ein Numpy-Array durch:
In [3]: coordinates_array = np.asarray(poly.exterior.coords)
Hinweis:
Für ein Polygon müssen die äußeren Koordinaten angegeben werden, da die Angabe der direkten Geometrie ebenfalls nicht zu funktionieren scheint:
In [4]: coordinates_array = np.asarray(poly) Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)
quelle