¿Encontrar si dos polígonos se cruzan en Python?

19

Estoy buscando un algoritmo, una solución de alto nivel o incluso una biblioteca que pueda ayudarme a determinar si dos polígonos se cruzan, en Python.

Tengo los vértices de los dos polígonos (estos son polígonos de una sola parte sin agujeros) en dos matrices diferentes. Los polígonos son 2D (es decir, solo coordenadas X e Y)

Me gustaría hacer una función que devuelva un valor booleano que indique si estos dos polígonos se cruzan.

Tenga en cuenta que no puedo usar arcpyninguno de los arcgiscomponentes de este.

¿Puedes sugerir un algoritmo o biblioteca para hacer esto?

Devdatta Tengshe
fuente

Respuestas:

42

Podrías intentarlo bien .

Describen relaciones espaciales y funcionan en ventanas

El modelo de datos espaciales está acompañado por un grupo de relaciones de lenguaje natural entre objetos geométricos (contiene, intersecta, solapa, toca, etc.) y un marco teórico para comprenderlos utilizando la matriz 3x3 de las intersecciones mutuas de sus conjuntos de puntos componentes.

El siguiente código muestra cómo puede probar la intersección:

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
fuente
15

Puede usar los enlaces de Python GDAL / OGR para eso.

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

Regresa Nonesi no se cruzan. Si se cruzan, devuelve la geometría donde ambos se cruzan.

También puede encontrar más información en el libro de cocina GDAL / OGR .

ustroetz
fuente
Me encantaría usar esto, pero estoy en Windows, y en los dos sistemas que he probado, no puedo hacer que funcionen los enlaces de Python. Me encuentro con el problema descrito en esta publicación: gis.stackexchange.com/questions/44958/…
Devdatta Tengshe
1
En caso de que alguien más se encuentre con esto, es posible usar GDAL / OGR con Python en Windows (y dentro de ArcGIS, nada menos): gis.stackexchange.com/questions/74524/…
Evil Genius
también puede escribir intersection = poly1.Intersect (poly2) --- el valor de la intersección será VERDADERO o FALSO dependiendo de si los polígonos se cruzan
Max
0

Sé que esta es una vieja pregunta, pero he escrito una biblioteca de Python para manejar colisiones entre polígonos cóncavos y convexos, así como círculos.

Es bastante simple de usar, ¡aquí tienes!

Ejemplo:

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

También puede hacer que genere una respuesta, que incluye:

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
fuente
0

si quieres saber el nivel puedes usar esto. Como argumento, puede dar una lista de polígonos. Y como valor de retorno obtienes una lista de niveles. En la lista de niveles están los 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
fuente