Descobrindo se dois polígonos se cruzam no Python?

19

Estou procurando um algoritmo, uma solução de alto nível ou mesmo uma biblioteca que possa me ajudar a determinar se dois polígonos se cruzam, em Python.

Eu tenho os vértices dos dois polígonos (estes são polígonos de peça única, sem orifícios) em duas matrizes diferentes. Os polígonos são 2D (ou seja, apenas coordenadas X e Y)

Eu gostaria de criar uma função que retorne um valor booleano indicando se esses dois polígonos se cruzam.

Por favor, note que não posso usar arcpy, ou qualquer arcgiscomponente deste.

Você pode sugerir um algoritmo ou biblioteca para fazer isso?

Devdatta Tengshe
fonte

Respostas:

42

Você pode tentar bem torneado .

Eles descrevem relações espaciais e funcionam no Windows

O modelo de dados espaciais é acompanhado por um grupo de relações de linguagem natural entre objetos geométricos - contém, cruza, sobrepõe, toca etc. - e uma estrutura teórica para compreendê-los usando a matriz 3x3 das interseções mútuas de seus conjuntos de pontos componentes

O código a seguir mostra como você pode testar a interseção:

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))
radouxju
fonte
15

Você pode usar as ligações GDAL / OGR Python para isso.

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()

Retorna Nonese eles não se cruzam. Se eles se cruzarem, ele retornará a geometria.

Além disso, você pode encontrar mais informações no livro de receitas GDAL / OGR .

ustroetz
fonte
Eu adoraria usar isso, mas estou no Windows e nos dois sistemas que tentei, não consigo fazer as ligações do python funcionarem. Eu me deparo com o problema descrito neste post: gis.stackexchange.com/questions/44958/…
Devdatta Tengshe
1
Apenas no caso de alguém tropeça outra pessoa sobre isso, é possível usar GDAL / OGR com Python no Windows (e dentro de ArcGIS, não menos): gis.stackexchange.com/questions/74524/...
Mal Genius
você também pode escrever intersecção = poly1.Intersect (poli2) --- o valor de intersecção será VERDADEIRO ou FALSO, dependendo se os polígonos Intersect
Max
0

Sei que essa é uma pergunta antiga, mas escrevi uma biblioteca python para lidar com colisões entre polígonos côncavos e convexos, além de círculos.

É bem simples de usar, aqui está você!

Exemplo:

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))

Você também pode gerar uma resposta, que inclui:

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

Qwerty
fonte
0

se você quiser saber o nível, você pode usar isso. Como argumento, você pode dar uma lista de polígonos. E como valor de retorno, você obtém uma lista de níveis. Na lista de níveis, existem os polígonos.

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
Tobias K
fonte