Python Shapely - найти, если части двух многоугольников перекрываются - PullRequest
0 голосов
/ 04 октября 2018

Из документации Shapely - есть ли какая-нибудь функция, которая может дать мне знать, что красный мультиполигон справа перекрывает некоторые части желтого мультиполигона справа?enter image description here

1 Ответ

0 голосов
/ 04 октября 2018

Полезно знать:

Вы можете применять те же методы «Предикаты и взаимосвязи» к многополигонам, которые вы можете применять к любому другому геометрическому объекту в форме ( см. Документацию ).

Проверка на перекрытие:

Чтобы проверить, перекрываются ли два мультиполигона, вы можете использовать object.intersects(other).Посмотрите этот пример (но не мультиполигоны с вашей картинки):

from shapely.geometry import MultiPolygon
a = [(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]
b = [(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)]

multi1 = MultiPolygon([[a, []], [b, []]])

c = [(0, 1.5), (1.5, 1.5), (1.5, 3), (0, 3), (1.5, 3)]
d = [(1.5, 1.5), (1.5, 0), (3, 0), (3, 1.5), (1.5, 1.5)]

multi2 = MultiPolygon([[c, []], [d, []]])

print(multi1.intersects(multi2))
print(multi2.intersects(multi1))

Возвращает

>>>True
>>>True

Редактировать:

Очевидно, что OPне заинтересован в наложении, но "пытается выяснить, имеет ли красный [мульти] многоугольник те же координаты, что и части желтого".

В этом случае вы можете перебирать отдельные полигоны и проверятьесли они равны одному из целевых полигонов:

from shapely.geometry import MultiPolygon
#target multipolygon
a = [(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]
b = [(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)]
c = [(2, 1), (3, 1), (3, 0), (2, 0), (2, 1)]
multi_target = MultiPolygon([[a, []], [b, []], [c, []]])

#test multipolygon with two polygons that match a target polygon
a = [(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]
b = [(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)]
multi_test1 = MultiPolygon([[a, []], [b, []]])

#test multipolygon where one polygon does not exactly match a target polygon.
a = [(0, 0.5), (0, 1), (1, 1), (1, 0.5), (0, 0.5)]
b = [(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)]
multi_test2 = MultiPolygon([[a, []], [b, []]])

def check_multipolys(test, target):
    for test_poly in test:
        exists = False
        for target_poly in target:
            if test_poly.equals(target_poly):
                exists = True
                break
        if not exists:
            return False
    return True

>>>check_multipolys(multi_test1, multi_target)
>>>True
>>>check_multipolys(multi_test2, multi_target)
>>>False

На будущее: исходный код был бы более полезным для ответа на ваш вопрос, чем скриншот документации.

...