Extraer puntos/coordenadas de Python shapely polygon
polygons (8)
¿Cómo obtienes / extraes los puntos que definen un polígono shapely
formado? ¡Gracias!
Ejemplo de un polígono bien formado.
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)
Actualización (2017-06-09):
Como la última respuesta parece no funcionar más con la versión más nueva de shapely, propongo esta actualización.
bien proporcionado proporciona la interfaz de matriz Numpy (como dice el documento: http://toblerity.org/shapely/project.html )
Entonces, sea poly
una geometría bien formada de polígonos:
In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon
Este comando hará la conversión a una matriz numpy:
In [3]: coordinates_array = np.asarray(poly.exterior.coords)
Insinuación:
Uno debe necesitar dar los polos exteriores para un polígono porque la geometría directa tampoco parece funcionar:
In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)
Entonces, descubrí que el truco es usar una combinación de los métodos de la clase Polygon
para lograr esto.
Si desea coordenadas geodésicas, necesita transformarlas de nuevo a WGS84 (a través de pyproj
, el basemap
matplotlib
, o algo así).
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
Me tomó un tiempo aprender que un polígono tiene un límite exterior y posiblemente varios límites interiores. Estoy publicando aquí porque algunas de las respuestas no reflejan esa distinción, aunque para ser justos, la publicación original no usó como ejemplo un polígono con límites interiores.
Los puntos que forman el límite exterior están dispuestos en una secuencia de coordenadas, que se puede obtener como
polygon.exterior.coords
Puede encontrar la longitud de este objeto utilizando len(polygon.exterior.coords)
y puede indexar el objeto como una lista. Para obtener el primer vértice, por ejemplo, use polygon.exterior.coords[0]
. Tenga en cuenta que el primero y el último punto son iguales; Si desea una lista que polygon.exterior.coords[:-1]
los vértices sin ese punto repetido, use polygon.exterior.coords[:-1]
.
Puede convertir la secuencia de coordenadas (incluido el vértice repetido) en una lista de puntos así:
list(polygon.exterior.coords)
De manera similar, la polygon.interiors[0].coords
coordenadas que consiste en los vértices que forman el primer límite interior se obtiene como polygon.interiors[0].coords
, y la lista de esos vértices (sin el punto repetido) se obtiene como polygon.interiors[0].coords[:-1]
.
Puede convertir un Polígono bien proporcionado en una matriz NumPy usando NumPy.array. Encuentro que usar matrices NumPy es más útil que las matrices devueltas por coords.xy, ya que las coordenadas están emparejadas, en lugar de en dos matrices unidimensionales. Use el que sea más útil para su aplicación.
[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
Puede usar cualquiera de los dos métodos siguientes.
1)
p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
print(x,y)
El código anterior imprime lo siguiente. Tenga en cuenta que (1,0) se imprime dos veces, ya que exterior.coords devuelve una secuencia ordenada que completa el polígono.
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
Emite lo siguiente
(array(''d'', [1.0, 1.0, 0.0, 0.0, 1.0]), array(''d'', [0.0, 1.0, 1.0, 0.0, 0.0]))
Puedes usar la función de mapping
bien formada:
>>> 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)),)}
Si realmente desea los objetos puntuales bien formados que forman el polígono, y no solo tuplas de coordenadas, puede hacerlo de esta manera:
list(zip(*p.exterior.coords.xy))
Usé esto:
points = MultiPoint(polygon.boundary.coords)
Polígono creado con: p = Polygon([(0,0),(1,1),(1,0),(0,0)])
devuelve:
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]]