97

您如何获取/提取定义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)
4

8 回答 8

104

所以,我发现诀窍是使用Polygon类方法的组合来实现这一点。

如果您想要测地坐标,则需要将它们转换回 WGS84(通过pyprojmatplotlib'sbasemap或其他方式)。

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
于 2013-12-09T16:56:05.133 回答
53

我花了一段时间才知道多边形有一个外部边界,也可能有几个内部边界。我在这里发帖是因为一些答案没有反映这种区别,尽管公平地说,原始帖子没有使用具有内部边界的多边形作为示例。

形成外边界的点排列在一个 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]

于 2018-08-08T20:00:49.263 回答
31

您可以使用 shapelymapping函数:

>>> 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)),)}
于 2016-11-16T11:34:14.153 回答
8

我用这个:

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)]
于 2017-11-27T20:14:55.173 回答
5

如果你真的想要构成多边形的形状点对象,而不仅仅是坐标元组,你可以这样做:

points = MultiPoint(polygon.boundary.coords)
于 2018-05-27T04:45:32.250 回答
2

您可以使用 NumPy.array 将形状优美的多边形转换为 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]]
于 2016-04-27T01:00:26.740 回答
2

您可以使用以下两种方法中的任何一种。

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]))
于 2018-01-08T17:56:09.423 回答
1

更新(2017-06-09):

由于最后一个答案似乎不再适用于最新版本的 shapely,因此我建议进行此更新。

shapely 提供了 Numpy 数组接口(如文档所述: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)

提示:
必须需要为多边形提供 external.coords,因为提供直接几何图形似乎也不起作用:

In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)    
于 2017-06-09T21:13:21.910 回答