Можно ли "упростить" мультиполигон?
Смотрите следующий пример кода:
#!/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 ответ
Простое рабочее решение:
def is_point_in_multipolygon(point, multi):
for polygon in multi:
if polygon.contains(point):
return True
return False
Это не так приятно, потому что это может потребовать больше вычислительных ресурсов, чем необходимо, но, скорее всего, для большинства случаев это не имеет значения.