Можно ли "упростить" мультиполигон?

Смотрите следующий пример кода:

#!/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

Это не так приятно, потому что это может потребовать больше вычислительных ресурсов, чем необходимо, но, скорее всего, для большинства случаев это не имеет значения.

Другие вопросы по тегам