如何解决Shapely的ʻalmost_equals`函数如何处理起点和错误?
这里的多边形具有相同的点集,但起点/舍入误差不同,但方向仍相同。
poly1 = Polygon([(0,0),(0,1),(1,0)])
poly2 = Polygon([(0,0)])
poly3 = Polygon([(0,1.00000001),0)])
poly4 = Polygon([(0,0)])
问题1:poly1.almost_equals(poly2)
返回False
,但是poly1.equals(poly2)
返回True
。因此equals
可以处理不同的起点,但是almost_equals
不能。
问题2:poly1.almost_equals(poly3)
返回False
,但是poly1.almost_equals(poly4)
返回True
。因此almost_equals
可以处理舍入错误,但起点仍然不同。
almost_equals
函数应如何表现?我认为起点不同的多边形仍然是相同的多边形,应该这样对待。有解决此问题的简便方法吗?我有一个复杂的自定义解决方案,但想知道是否已在Shapely中实现了该操作。
解决方法
是的,这是预期的行为。 the documentation中没有明确说明,但是您可以在函数的docstring中找到它:
def almost_equals(self,other,decimal=6): """Returns True if geometries are equal at all coordinates to a specified decimal place Refers to approximate coordinate equality,which requires coordinates be approximately equal and in the same order for all components of a geometry. """ return self.equals_exact(other,0.5 * 10**(-decimal))
当前,没有任何其他功能可用于解决问题。 GitHub上有一个open issue,讨论了almost_equals
的未来。因此,很可能很快就会引入新的便捷功能。同时,您可以使用几种解决方法:
- 计算两个多边形的
symmetric_difference
,并将结果区域与某个最小阈值进行比较。
例如。:def almost_equals(polygon,threshold): # or (polygon ^ other).area < threshold return polygon.symmetric_difference(other).area < threshold almost_equals(poly1,poly3,1e-6) # True
- 先对两个多边形进行归一化,然后使用
almost_equals
。要对其进行归一化,例如,可以orient
逆时针旋转边界的顶点,然后对这些顶点进行排序,以使每个多边形的第一个顶点与其他顶点相比是最低的,并且是最左边的。
例如。:from shapely.geometry.polygon import orient def normalize(polygon): def normalize_ring(ring): coords = ring.coords[:-1] start_index = min(range(len(coords)),key=coords.__getitem__) return coords[start_index:] + coords[:start_index] polygon = orient(polygon) normalized_exterior = normalize_ring(polygon.exterior) normalized_interiors = list(map(normalize_ring,polygon.interiors)) return Polygon(normalized_exterior,normalized_interiors) normalize(poly1).almost_equals(normalize(poly3)) # True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。