是否可以“简化”MultiPolygon?

时间:2018-03-07 13:37:52

标签: shapely.geometry

请参阅以下示例代码:

#!/usr/bin/env python

from shapely.geometry import MultiPolygon, Point

# (1) Is valid

hulls = [[(0, 0), (10, 0), (10, 10), (0, 10)],
         [(10.000001, 5), (20, 5), (20, 10), (10.000001, 10)]]  #

area = MultiPolygon([(hulls[0], []),
                     (hulls[1], [])])

print(area.is_valid)
print(area.contains(Point(5, 5)))

# (2) Crashes

hulls = [[(0, 0), (10, 0), (10, 10), (0, 10)],
         [(5, 5), (20, 5), (20, 10), (5, 10)]]

area = MultiPolygon([(hulls[0], []),
                     (hulls[1], [])])
print(area.is_valid)
print(area.contains(Point(5, 5)))

(2)崩溃和(1)工作的原因是因为(1)中的多个多边形是完全排他的;它们根本不重叠。在(2)中,它们重叠。

我并不关心潜在的表现形式。在这种情况下,是否可以自动使MultiPolygon有效?

我找到了什么

simplify(self, tolerance, preserve_topology=True)
 |      Returns a simplified geometry produced by the Douglas-Peucker
 |      algorithm

这不起作用。我希望得到完全相同的包含结果......只是没有重叠的多边形。

1 个答案:

答案 0 :(得分:0)

一个简单的工作解决方案是:

def is_point_in_multipolygon(point, multi):
    for polygon in multi:
        if polygon.contains(point):
            return True
    return False

它不是那么好,因为它可能比必要的计算密集程度更高,但可能对大多数情况并不重要。