Scopri se due poligoni si intersecano in Python?


19

Sto cercando un algoritmo, una soluzione di alto livello o persino una libreria che possa aiutarmi a determinare se due poligoni si intersecano, in Python.

Ho i vertici dei due poligoni (questi sono poligoni a parte singola senza fori) in due diverse matrici. I poligoni sono 2D (cioè solo coordinate X e Y)

Mi piacerebbe fare una funzione che restituirà un valore booleano che indica se questi due poligoni si intersecano.

Si prega di notare che non posso usare arcpyo alcun arcgiscomponente in questo.

Puoi suggerire un algoritmo o una libreria per farlo?

Risposte:


42

Si potrebbe provare formosa .

Descrivono le relazioni spaziali e funzionano su Windows

Il modello di dati spaziali è accompagnato da un gruppo di relazioni linguistiche naturali tra oggetti geometrici - contiene, interseca, sovrapposizioni, tocchi, ecc. - e un quadro teorico per comprenderli utilizzando la matrice 3x3 delle intersezioni reciproche dei loro set di punti componenti

Il codice seguente mostra come testare l'intersezione:

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

Per questo puoi usare i binding 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()

Ritorna Nonese non si intersecano. Se si intersecano restituisce che la geometria si interseca.

Inoltre puoi trovare ulteriori informazioni nel ricettario GDAL / OGR .


Mi piacerebbe usarlo, ma sono su Windows e su entrambi i sistemi che ho provato, non riesco a far funzionare i binding di Python. Ho riscontrato
Devdatta Tengshe

1
Nel caso in cui qualcun altro si imbatti in questo, è possibile utilizzare GDAL / OGR con Python in Windows (e in ArcGIS, non meno): gis.stackexchange.com/questions/74524/…
Evil Genius

puoi anche scrivere intersection = poly1.Intersect (poly2) --- il valore dell'intersezione sarà VERO o FALSO a seconda se i poligoni si intersecano
Max


0

So che questa è una vecchia domanda, ma ho scritto una libreria in pitone per gestire le collisioni tra poligoni concavi e convessi, nonché i cerchi.

È abbastanza semplice da usare, ecco qua!

Esempio:

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

Puoi anche fargli generare una risposta, che include:

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

se vuoi conoscere il livello puoi usarlo. Come argomento puoi dare un elenco di poligoni. E come valore di ritorno ottieni un elenco di livelli. Nell'elenco dei livelli ci sono i poligoni.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.