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)
30
demandé sur ryanjdillon 2013-12-09 19:40:34

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, matplotlibbasemap, 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
41
répondu ryanjdillon 2014-01-30 10:41:42

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)),)}
9
répondu Ikar Pohorský 2016-11-16 11:34:14

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].

3
répondu pnklein 2018-08-08 20:18:59

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)]
2
répondu Anton vBR 2017-11-27 20:14:55

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)
2
répondu Rick Teachey 2018-05-27 04:45:32

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]]
1
répondu mkosmala 2016-04-27 01:00:26

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]))
1
répondu Jayanth 2018-01-08 17:56:09

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)    
0
répondu s.k 2017-06-09 21:13:21