¿Encontrando si dos polígonos se intersecan en Python?

13

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

Tengo los vértices de los dos polígonos (estos son polígonos de una sola parte sin ningún agujero) 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 intersecan.

Ten en cuenta que no puedo usar arcpy , o cualquier componente arcgis en esto.

¿Puede sugerir un algoritmo o una biblioteca para hacer esto?

    
pregunta Devdatta Tengshe 18.03.2014 - 13:44

4 respuestas

34

Puedes intentar bien formado .

Describen relaciones espaciales y funcionan en Windows

  

El modelo de datos espaciales está acompañado por un grupo de lenguaje natural   relaciones entre objetos geométricos - contiene, se interseca,   solapamientos, toques, etc. - y un marco teórico para   entendiéndolos usando la matriz 3x3 de las intersecciones mutuas de   sus conjuntos de puntos componentes

El siguiente código muestra cómo puedes 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))
    
respondido por el radouxju 18.03.2014 - 14:37
13

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

Devuelve None si no se intersecan. Si se intersecan, devuelve la geometría donde ambos se intersectan.

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

    
respondido por el ustroetz 18.03.2014 - 14:00
1

Si sabe o está interesado en aprender R, tiene algunos paquetes espaciales útiles. enlace Hay un módulo de Python para interactuar con R (RPy *)

    
respondido por el iKenSpatial 19.03.2014 - 12:50
0

Sé que esta es una pregunta antigua, 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)

enlace

    
respondido por el Qwerty 14.11.2018 - 19:19

Lea otras preguntas en las etiquetas