Извлечение точек / координат из многоугольника Python shapely

Как вы получаете / извлекаете точки, которые определяют shapely полигон? Спасибо!

пример стройного многоугольника

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 ответов


Итак, я обнаружил, что трюк заключается в использовании комбинации Polygon методы класса для достижения этого.

если вы хотите геодезические координаты, вам нужно преобразовать их обратно в WGS84 (через pyproj, matplotlib ' s basemap, или что-то).

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

вы можете использовать shapely


мне потребовалось некоторое время, чтобы узнать, что полигон имеет внешнюю границу и, возможно, несколько внутренних границ. Я публикую здесь, потому что некоторые ответы не отражают этого различия, хотя, честно говоря, исходный пост не использовал в качестве примера многоугольник с внутренними границами.

пунктов, образующих внешние границы располагаются в CoordinateSequence, которые могут быть получены как

polygon.exterior.coords

вы можете найти длину этого объекта, используя len(polygon.exterior.coords) и может индексировать объект как список. Чтобы получить первую вершину, например, используйте polygon.exterior.coords[0]. Обратите внимание, что первая и последняя точки совпадают; если вы хотите список, состоящий из вершин без повторных, используйте polygon.exterior.coords[:-1].

вы можете преобразовать CoordinateSequence (включая повторяющуюся вершину) в список точек таким образом:

list(polygon.exterior.coords)

аналогично, CoordinateSequence, состоящая из вершин, образующих первую внутреннюю границу, получается как polygon.interiors[0].coords, а список этих вершин (без повторной точки) получается как polygon.interiors[0].coords[:-1].


я использовал этот:

list(zip(*p.exterior.coords.xy))

полигон, созданный с помощью:p = Polygon([(0,0),(1,1),(1,0),(0,0)]) возвращает:

[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]

Если вы действительно хотите shapely объекты которые составляют многоугольник, а не только кортежи координат, вы можете сделать это следующим образом:

points = MultiPoint(polygon.boundary.coords)

вы можете преобразовать фигурный многоугольник в массив NumPy с помощью NumPy.матрица. Я нахожу использование массивов NumPy более полезным, чем массивы, возвращаемые coords.xy, так как координаты спарены, а не в двух одномерных массивах. Используйте то, что более полезно для вашего приложения.

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)

p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
   print(x,y)

приведенный выше код печатает следующие. Обратите внимание, что (1,0) печатается дважды, начиная с внешнего.coords возвращает упорядоченную последовательность, которая завершает полигон.

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

Он выдает следующее

(array('d', [1.0, 1.0, 0.0, 0.0, 1.0]), array('d', [0.0, 1.0, 1.0, 0.0, 0.0]))

обновление (2017-06-09):

поскольку последний ответ, похоже, больше не работает с новейшей версией shapely, я предлагаю это обновление.

shapely предоставляет интерфейс массива Numpy (как говорит doc:http://toblerity.org/shapely/project.html)

Итак, давайте poly быть стройной геометрией многоугольника:

In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon

эта команда будет выполнять преобразование в numpy массив:

In [3]: coordinates_array = np.asarray(poly.exterior.coords)

подсказка:
Нужно отдавать внешность.координаты для многоугольника, потому что прямая геометрия, похоже, тоже не работает:

In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)