Подтвердить что ты не робот

Извлечение точек/координат из многоугольника в 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)
4b9b3361

Ответ 1

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

Если вам нужны геодезические координаты, вам необходимо преобразовать их обратно в WGS84 (через pyproj, matplotlib 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

Ответ 2

Вы можете использовать стройную функцию mapping:

>>> 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)),)}

Ответ 3

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

Точки, формирующие внешнюю границу, расположены в 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].

Ответ 4

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

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

Ответ 5

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

points = MultiPoint(polygon.boundary.coords)

Ответ 6

Вы можете преобразовать фигурный многоугольник в массив NumPy, используя NumPy.array. Я нахожу, что массивы 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]]

Ответ 7

Вы можете использовать любой из двух следующих методов.

1)

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

Приведенный выше код печатает следующее. Обратите внимание, что (1,0) печатается дважды, так как external.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]))

Ответ 8

Обновление (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)

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

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