Извлечение точек / координат из многоугольника 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
мне потребовалось некоторое время, чтобы узнать, что полигон имеет внешнюю границу и, возможно, несколько внутренних границ. Я публикую здесь, потому что некоторые ответы не отражают этого различия, хотя, честно говоря, исходный пост не использовал в качестве примера многоугольник с внутренними границами.
пунктов, образующих внешние границы располагаются в 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)