Виявлення, чи перетинаються два багатокутники в Python?


19

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

Я маю вершини двох многокутників (Це однокутні багатокутники без жодних отворів) у двох різних масивах. Полігони 2D (тобто просто координати 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

Для цього можна використовувати прив'язки Python GDAL / OGR .

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 .


Мені б хотілося це використовувати, але я в Windows, і в обох системах, які я намагався, я не можу примусити прив'язки пітона до роботи. Я стикаюся
Devdatta Tengshe

1
На всякий випадок, якщо хтось інший натикається на це, можна використовувати GDAL / OGR з Python у Windows (і не менше ArcGIS): gis.stackexchange.com/questions/74524/…
Evil Genius

Ви також можете записати перехрестя = poly1.Intersect (poly2) --- значення перетину буде ІСТИЧНИМ чи ЛІЖНИМ залежно від того, чи перетинаються багатокутники
Макс


0

Я знаю, що це старе питання, але я написав бібліотеку пітонів для обробки зіткнень між увігнутими та опуклими багатокутниками, а також колами.

Це досить просто у використанні, ось ви йдете!

Приклад:

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.