如何从一组shapely Points创建一个漂亮的多边形Polygon?

47

我想从Shapely点创建一个多边形。

from shapely import geometry
p1 = geometry.Point(0,0)
p2 = geometry.Point(1,0)
p3 = geometry.Point(1,1)
p4 = geometry.Point(0,1)

pointList = [p1, p2, p3, p4, p1]

poly = geometry.Polygon(pointList)

给我一个类型错误:TypeError: object of type 'Point' has no len()

如何从Shapely的Point对象创建一个Polygon


2
我在 GitHub 上提交了一个问题,涉及到这个问题:使用一系列点创建集合时的不一致性。他们说这是一个需要修复的错误。 - Georgy
2
这个问题已经过时了,它不再产生错误。请参考Adam的答案。 - jberrio
使用Shapely 2.0,会出现以下错误:ValueError: Inconsistent coordinate dimensionality - swiss_knight
5个回答

76

如果您想从shapely几何点构建多边形,则可以在列表理解中调用它们的x,y属性。换句话说:

from shapely import geometry

poly = geometry.Polygon([[p.x, p.y] for p in pointList])

print(poly.wkt)  # prints: 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'

请注意,Shapely足够聪明,能够代表您自动关闭多边形,也就是说,您不一定需要在最后再次传入第一个点。


对我来说,它的工作原理是 poly = Polygon([[p[0].x, p[0].y] for p in pointList]])。 - Piyush
听起来你有嵌套点(多点?)或者是一条线? - songololo
@songololo 如果它只有一个x,y位置,它怎么知道如何关闭多边形呢?它怎么知道它有多大?是否有一种方法可以传递x1,y1,x2,y2坐标? - mikey

25

一个Polygon对象需要嵌套的数字列表,而不是Point对象列表。

polygon = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])

10

在版本1.7a2中,他们已经修复了这个问题。

相关的代码将自动生效。

CHANGES.txt链接


4

这个答案已经过时,不再正确 - 请查看Adam的答案。 - jberrio

0
你可以这样做:
p1 = geometry.Point(0,0)
p2 = geometry.Point(1,0)
p3 = geometry.Point(1,1)
p4 = geometry.Point(0,1)

pointList = [p1, p2, p3, p4]
poly = geometry.Polygon([i for i in pointList])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接