从Shapely中的多边形中提取点/坐标


72

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

Answers:


79

因此,我发现诀窍是使用Polygon类方法的组合来实现。

如果你想测地坐标,然后需要转换(通过这些回WGS84 pyprojmatplotlibbasemap,或东西)。

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

33

我花了一段时间才知道多边形有一个外部边界,可能还有几个内部边界。我在这里发布内容是因为某些答案并未反映出这种区别,尽管为了公平起见,原始文章并未使用具有内部边界的多边形作为示例。

形成外部边界的点按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]


您将如何获得该多边形对接的所有坐标?那么,位于多边形内部的任何点如何获取这些坐标?
Will.Evo

23

您可以使用匀称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)),)}

2
真好 这很好,因为它可以轻松地概括需要此程序的例程。
ryanjdillon

6

我用这个:

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

3

如果您确实需要构成多边形的匀称点对象,而不仅仅是坐标元组,则可以通过以下方式实现:

points = MultiPoint(polygon.boundary.coords)

2

您可以使用NumPy.array将形状良好的Polygon转换为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]]

好想法。谢谢!我认为当我有一组无序点时,我正在使用此函数,并且通过使用该函数,coords.xy我可以提取一个有序的外部点列表,或者也许是网格的外部点...我将使用它当我有时间报告的时候:)
ryanjdillon '16

12
上面的代码不适用于shapely = 1.5.13 = py35_0。Polygon(x,y)不被接受。np.array(some_actual_polygon)也表现不出如图所示。
Masterfool

2

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

1)

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

上面的代码显示以下内容。请注意(1,0)被打印两次,因为exterior.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]))

1
这两种方法是相同的,并且与在2013-12-09中的回答相同。
ryanjdillon'1

@ryanjdillon是的,第二个与您的相同。我觉得第一个是解开xy对包装的更直观的方法。
Roomba '18

1
问题是如何获取坐标,而不是如何拆开元组。我正在对此做出回应,因为此答案并不会添加有关如何获取坐标的其他信息,而且它不是第一个重复已存在的答案(如此答案)的。您的建议最好以对现有答案的评论形式提出。这样的回答会给人们带来不必要的麻烦,使他们无法找到关键信息。
ryanjdillon

1

更新(2017-06-09):

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

整齐地提供了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)    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.