Извлечение точек / координат из правильного многоугольника Python
Как вы получаете / извлекаете точки, которые определяют 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)
9 ответов
Итак, я обнаружил, что хитрость заключается в использовании комбинации 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]
,
Вы можете использовать стройные 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)),)}
Я использовал это:
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)]
Если вам действительно нужны точечные точечные объекты, составляющие многоугольник, а не просто наборы координат, вы можете сделать это следующим образом:
points = MultiPoint(polygon.boundary.coords)
Вы можете использовать любой из двух следующих методов.
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]))
Вы можете преобразовать корректный Polygon в массив NumPy, используя NumPy.array. Я считаю, что использование массивов NumPy более полезно, чем массивов, возвращаемых ords.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]]
Обновление (2017-06-09):
Поскольку последний ответ, похоже, больше не работает с новейшей версией shapely, я предлагаю это обновление.
shapely предоставляет интерфейс массива Numpy (как сказано в документе: http://toblerity.org/shapely/project.html)
Так что давайте poly
быть стройной геометрией многоугольника:
In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon
Эта команда выполнит преобразование в пустой массив:
In [3]: coordinates_array = np.asarray(poly.exterior.coords)
Подсказка:
Нужно дать external.coords для многоугольника, потому что задание прямой геометрии тоже не работает:
In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)
d0=[]
for n in range(0,len(gdf1['geometry'])):
try:
k=(len(gdf1['geometry'][n].geoms))
ce+=1
except:
d0.append(n)