我一直在试图调试这个问题,但无法做到这一点。我正在尝试找到两个对象Polygon
的交集。它大部分时间工作,但对于下列情况,它会产生以下例外情况:多边形交点错误| Python Shapely
P1 area: 13.125721955
P2 area: 1.0
Traceback (most recent call last):
File "geom2d.py", line 235, in <module>
print p1.intersection(p2)
File "/usr/local/lib/python2.7/dist-packages/shapely/geometry/base.py", line 334, in intersection
return geom_factory(self.impl['intersection'](self, other))
File "/usr/local/lib/python2.7/dist-packages/shapely/topology.py", line 47, in __call__
"The operation '%s' produced a null geometry. Likely cause is invalidity of the geometry %s" % (self.fn.__name__, repr(this)))
shapely.geos.TopologicalError: The operation 'GEOSIntersection_r' produced a null geometry. Likely cause is invalidity of the geometry <shapely.geometry.polygon.Polygon object at 0x8e5ad6c>
代码如下。
from shapely.geometry import Point,Polygon,MultiPolygon
poly1 = [(35.0041000000000011, -88.1954999999999956), (34.9917999999999978, -85.6068000000000069), (32.8404000000000025, -85.1756000000000029), (32.2593000000000032, -84.8927000000000049), (32.1535000000000011, -85.0341999999999985), (31.7946999999999989, -85.1358000000000033), (31.5199999999999996, -85.0438000000000045), (31.3384000000000000, -85.0836000000000041), (31.2092999999999989, -85.1069999999999993), (31.0023000000000017, -84.9943999999999988), (30.9953000000000003, -87.6008999999999958), (30.9422999999999995, -87.5926000000000045), (30.8538999999999994, -87.6256000000000057), (30.6744999999999983, -87.4072000000000031), (30.4404000000000003, -87.3687999999999931), (30.1463000000000001, -87.5240000000000009), (30.1545999999999985, -88.3863999999999947), (31.8938999999999986, -88.4742999999999995), (34.8937999999999988, -88.1020999999999930), (34.9478999999999971, -88.1721000000000004), (34.9106999999999985, -88.1461000000000041)]
poly2 = [(34.7998910000000024, -88.2202139999999986), (34.7998910000000024, -87.2202139999999986), (35.7998910000000024, -87.2202139999999986), (35.7998910000000024, -88.2202139999999986)]
p1 = Polygon(poly1)
p2 = Polygon(poly2)
print 'P1 area:',p1.area
print 'P2 area:',p2.area
print p1.intersection(p2)
由于它打印两个多边形的面积,我假设多边形形成正确。我也(不知何故)打印第一个多边形以确保它确实是一个简单的多边形。
任何人都可以请解释为什么我得到这个异常?
编辑:我打印p1.is_valid,结果是False。有一些解释here。搜索字符串is_valid
。它说
有效的多边形可能不具有任何重叠的外部或内部环。
有人能解释一下这是什么意思,如果有可能的解决方法吗? 顺便说一句,我也注意到,如果我从poly1
删除最后一个坐标,整个事情就起作用了。也许整个坐标列表使多边形复杂。
有没有办法处理_complex_多边形? – Nik
理想情况下,您可以将所有多边形定义为正确的开头。既然这是对付美国的一个国家,而不是某种线索,我会认为修正这将是更好的路线。但是,如果这是不可能的,你总是可以使用'p1.convex_hull'而不是'p1'。 'convex_hull'永远是有效的,永不复杂。 –