Я хотел бы получить пересечение нескольких полигонов. Используя shapely
пакет Python , я могу найти пересечение двух полигонов, используя intersection
функцию. Существует ли подобная эффективная функция для получения пересечения нескольких многоугольников?
Вот фрагмент кода, чтобы понять, что я имею в виду:
from shapely.geometry import Point
coord1 = ( 0,0 )
point1 = Point(coord1)
circle1 = point1.buffer(1)
coord2 = ( 1,1 )
point2 = Point(coord2)
circle2 = point2.buffer(1)
coord3 = ( 1,0 )
point3 = Point(coord3)
circle3 = point3.buffer(1)
Пересечение двух кругов можно найти с помощью circle1.intersection(circle2)
. Я могу найти пересечение всех трех кругов circle1.intersection(circle2).intersection(circle3)
. Однако этот подход не подходит для большого числа полигонов, так как требует все больше кода. Я хотел бы функцию, которая принимает произвольное количество многоугольников и возвращает их пересечение.
Ответы:
Одним из возможных подходов может быть рассмотрение комбинации пар многоугольников, их пересечений и, наконец, объединение всех пересечений посредством каскадного объединения (как предложено здесь ):
Более эффективный подход должен использовать пространственный индекс, такой как Rtree , для работы с множеством геометрий (не в случае трех окружностей):
источник
Почему бы не использовать итерацию или рекурсивность? что-то типа :
источник
Дайте этот код выстрел. это довольно просто в концепции, и я верю, что вы получите то, что ищете.
и если вы хотите, чтобы вывод был сохранен как шейп-файл, используйте fiona:
это выводит -
источник
k
иv
плохой выбор для имен переменных в вашемdict
понимании. Каждая из этих переменных относится к разным элементамdic.items()
, а не к паре ключ-значение. Нечто подобноеa, b
будет менее обманчивым.