Исправить неверный многоугольник в Shapely

Shapely определяет многоугольник как недопустимый, если какой-либо из его сегментов пересекается, включая сегменты, которые являются коллинеарными. Многие программные пакеты создают область или область с «вырезом», как показано здесь, с коллинеарными сегментами:

введите описание изображения здесь

>>> pp = Polygon([(0,0), (0,3), (3,3), (3,0), (2,0), 
                  (2,2), (1,2), (1,1), (2,1), (2,0), (0,0)])
>>> pp.is_valid
WARNING:shapely.geos:Self-intersection at or near point 2 0
False

Естественно, вырез может быть реализован изначально в Shapely, или та же самая геометрия может быть реализована как два действительных многоугольника, но если у меня есть только список точек, показанный выше, можно ли это легко «исправить» (создать правильную геометрию из этого список точек)?


person jpcgt    schedule 30.12.2013    source источник


Ответы (2)


Я нашел решение, которое работает для конкретного случая:

>>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]
person jpcgt    schedule 01.01.2014
comment
Я обнаружил, что этот метод buffer (0) в целом работает для фиксации многоугольников с совпадающими линиями среди подполигонов. Это очень полезно. Вы знаете место, где этот трюк официально рекомендован / санкционирован? - person M Katz; 24.03.2014
comment
Этот метод не устранил мою проблему: у меня были несколько самопересекающихся мультиполигонов. - person Rutger Hofste; 15.09.2017
comment
Вам нужно быть немного осторожнее с техникой buffer(0). У нас были случаи, когда галстук-бабочка разрушал большую часть многоугольника и оставлял только небольшой изогнутый угол. YMMV. - person Aidan Kane; 06.12.2017
comment
Для меня он создал действительный многоугольник, но у него больше не было никаких .exterior.coords, поэтому он все еще не работал для анализа .within (многоугольника). - person Casivio; 12.02.2021
comment
Кто-нибудь знает, существует ли решение для этого сейчас? Насколько я понимаю, @AidanKane не рекомендовал buffer(0). - person José Rojas; 03.07.2021
comment
@ JoséRojas Это ... сложно. Решение, которое мы в итоге использовали, - разбить недопустимые многоугольники на карту действительных многоугольников с помощью shapely.ops.polygonize. Затем мы повторили каждый из них и решили, находится ли он внутри или снаружи, используя правила обмотки. Затем мы объединяем включенные в комплект. - person Aidan Kane; 09.07.2021
comment
@ JoséRojas Посмотрите мой новый ответ, похоже, что shapely добавили функцию для этого! shapely.readthedocs.io/en/latest/ - person Aidan Kane; 09.07.2021

Не тестировалось, но похоже, что Shapely добавили функцию для поддержки этого сейчас.

https://shapely.readthedocs.io/en/latest/manual.html#validation.make_valid

person Aidan Kane    schedule 08.07.2021