Находить, пересекаются ли два многоугольника в Python?


19

Я ищу алгоритм, решение высокого уровня или даже библиотеку, которая может помочь мне определить, пересекаются ли два полигона в Python.

У меня есть вершины двух полигонов (это одночастные многоугольники без дырок) в двух разных массивах. Полигоны являются двумерными (т.е. только координаты X и Y)

Я хотел бы сделать функцию, которая будет возвращать логическое значение, указывающее, пересекаются ли эти два многоугольника.

Обратите внимание, что я не могу использовать arcpy, или какие-либо arcgisкомпоненты в этом.

Можете ли вы предложить алгоритм или библиотеку для этого?

Ответы:


42

Вы могли бы попробовать стройную .

Они описывают пространственные отношения, и это работает на окнах

Модель пространственных данных сопровождается группой естественных языковых связей между геометрическими объектами - содержит, пересекается, перекрывается, касается и т. Д. - и теоретической основой для их понимания с использованием матрицы 3x3 взаимных пересечений их наборов точечных компонентов.

Следующий код показывает, как вы можете проверить на пересечение:

from shapely.geometry import Polygon
p1 = Polygon([(0,0), (1,1), (1,0)])
p2 = Polygon([(0,1), (1,0), (1,1)])
print(p1.intersects(p2))

15

Для этого вы можете использовать привязки GDAL / OGR Python .

from osgeo import ogr

wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874, 1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917, 1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)

intersection = poly1.Intersection(poly2)

print intersection.ExportToWkt()

Возвращается, Noneесли они не пересекаются. Если они пересекаются, возвращается, что геометрия была пересечена.

Также вы можете найти дополнительную информацию в GDAL / OGR Cookbook .


Я хотел бы использовать это, но у меня Windows, и в обеих системах, которые я пробовал, я не могу заставить работать привязки Python. Я сталкиваюсь с проблемой, описанной в этом посте: gis.stackexchange.com/questions/44958/…
Devdatta Tengshe

1
На случай, если кто-то еще наткнется на это, можно использовать GDAL / OGR с Python в Windows (и не менее в ArcGIS): gis.stackexchange.com/questions/74524/…
Evil Genius

Вы также можете написать intersection = poly1.Intersect (poly2) --- значение пересечения будет TRUE или FALSE, в зависимости от того, пересекаются ли полигоны
Макс.


0

Я знаю, что это старый вопрос, но я написал библиотеку Python для обработки столкновений между вогнутыми и выпуклыми многоугольниками, а также окружностями.

Это довольно просто в использовании, вот и все!

Пример:

from collision import *
from collision import Vector as v

p0 = Concave_Poly(v(0,0), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])
p1 = Concave_Poly(v(20,20), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])

print(collide(p0,p1))

Вы также можете получить ответ, который включает в себя:

overlap (how much they overlap)
overlap vector (when subtracted from second shapes position, the shapes will no longer be colliding)
overlap vector normalized (vector direction of collision)
a in b (whether the first shape is fully inside the second)
b in a (whether the second shape is fully inside the first)

https://github.com/QwekoDev/collision


0

если вы хотите знать уровень, вы можете использовать это. В качестве аргумента вы можете привести список полигонов. И в качестве возвращаемого значения вы получите список уровней. В списке уровней есть полигоны.

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
def isPolygonInPolygon(poly1,poly2):
    poly2 = Polygon(poly2)
    for poi in poly1:
        poi = Point(poi)
        if(poly2.contains(poi)):
            return True

def polygonTransformHierarchy(polygon_list):
    polygon_list_hierarchy = []
    for polygon1 in polygon_list:
        level = 0
        for polygon2 in polygon_list:
            if(isPolygonInPolygon(polygon1, polygon2)):
                level += 1
        if(level > len(polygon_list_hierarchy)-1):
            dif = (level+1)- len(polygon_list_hierarchy)
            for _ in range(dif):
                polygon_list_hierarchy.append([])   
        polygon_list_hierarchy[level].append(polygon1)
    return polygon_list_hierarchy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.