Extraire les points / coordonnées du polygone en forme de Python
Comment Obtenir / Extraire les points qui définissent un shapely
polygone?
Merci!
Exemple d'un galbe polygone
from shapely.geometry import Polygon
# Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]
polygon = Polygon(x,y)
8 réponses
Donc, j'ai découvert l'astuce est d'utiliser une combinaison de l' Polygon
méthodes de classe pour atteindre cet objectif.
si vous voulez des coordonnées géodésiques, vous devez les transformer en WGS84 (via pyproj
, matplotlib
basemap
, ou de quelque chose).
from shapely.geometry import Polygon
#Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]
some_poly = Polygon(x,y)
# Extract the point values that define the perimeter of the polygon
x, y = some_poly.exterior.coords.xy
Vous pouvez utiliser le galbe mapping
fonction:
>>> 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)),)}
il m'a fallu un certain temps pour apprendre qu'un polygone a une limite extérieure et peut-être plusieurs limites intérieures. Je poste ici parce que certaines des réponses ne reflètent pas cette distinction, bien que pour être juste le poste original n'a pas utilisé comme exemple un polygone avec des limites intérieures.
les points formant la limite extérieure sont disposés de façon coordonnée, ce qui peut être obtenu par
polygon.exterior.coords
Vous pouvez trouver la longueur de cet objet à l'aide len(polygon.exterior.coords)
et peut indexer l'objet comme une liste. Pour obtenir le premier sommet, par exemple, utiliser polygon.exterior.coords[0]
. Notez que le premier et le dernier points sont les mêmes; si vous voulez une liste composée des sommets sans ce point répété, utilisez polygon.exterior.coords[:-1]
.
vous pouvez convertir la suite de la coordination (y compris le vertex répété) en une liste de points ainsi:
list(polygon.exterior.coords)
polygon.interiors[0].coords, et la liste de ces sommets (sans le point répété) est obtenue comme polygon.interiors[0].coords[:-1]
.
j'ai utilisé ceci:
list(zip(*p.exterior.coords.xy))
Polygone créé avec: p = Polygon([(0,0),(1,1),(1,0),(0,0)])
renvoie:
[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
Si vous voulez vraiment bien faite objets qui composent le polygone, et pas seulement des tuples de coordonnées, vous pouvez le faire de cette façon:
points = MultiPoint(polygon.boundary.coords)
Vous pouvez convertir un polygone en un tableau NumPy en utilisant NumPy.tableau. Je trouve l'utilisation de tableaux NumPy plus utile que les tableaux retournés par coords.xy, car les coordonnées sont associés, plutôt que dans deux tableaux unidimensionnels. Utilisez celle qui est la plus utile à votre application.
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]]
Vous pouvez utiliser une des deux méthodes suivantes.
1)
p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
print(x,y)
le code ci-dessus imprime ce qui suit. Notez que (1,0) est imprimé deux fois, depuis l'extérieur.coords renvoie une séquence ordonnée qui complète le polygone.
1.0 0.0
1.0 1.0
0.0 1.0
0.0 0.0
1.0 0.0
2)
p.exterior.coords.xy
il produit les
(array('d', [1.0, 1.0, 0.0, 0.0, 1.0]), array('d', [0.0, 1.0, 1.0, 0.0, 0.0]))
mise à Jour (2017-06-09):
comme la dernière réponse semble ne plus fonctionner avec la nouvelle version de shapely, je propose cette mise à jour.
fournit l'interface de Numpy array (comme le dit le doc:http://toblerity.org/shapely/project.html)
Alors, laissez -poly
être un galbe géométrie de polygone:
In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon
cette commande fera la conversion vers un numpy tableau:
In [3]: coordinates_array = np.asarray(poly.exterior.coords)
Indice:
On doit la nécessité de donner à l'extérieur.coords pour un polygone parce que donner le direct de la géométrie semble ne pas fonctionner:
In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)