Mencari apakah dua poligon berpotongan dengan Python?

19

Saya mencari algoritma, solusi tingkat tinggi, atau bahkan perpustakaan yang dapat membantu saya menentukan apakah dua poligon berpotongan, dengan Python.

Saya memiliki simpul dari dua poligon (Ini adalah poligon bagian tunggal tanpa lubang) dalam dua array yang berbeda. Poligon adalah 2D (yaitu hanya koordinat X dan Y)

Saya ingin membuat fungsi yang akan mengembalikan boolean yang menunjukkan apakah kedua poligon bersilangan.

Harap dicatat bahwa saya tidak dapat menggunakan arcpy, atau arcgiskomponen apa pun dalam hal ini.

Bisakah Anda menyarankan algoritma atau pustaka untuk melakukan ini?

Devdatta Tengshe
sumber

Jawaban:

42

Anda bisa mencoba dengan cantik .

Mereka menggambarkan hubungan spasial dan berfungsi pada windows

Model data spasial disertai oleh sekelompok hubungan bahasa alami antara objek geometris - berisi, berpotongan, tumpang tindih, menyentuh, dll. - dan kerangka kerja teoritis untuk memahaminya menggunakan matriks 3x3 dari persimpangan saling persimpangan set poin komponen mereka

Kode berikut menunjukkan bagaimana Anda bisa menguji persimpangan:

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

Anda dapat menggunakan binding Python GDAL / OGR untuk itu.

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

Itu kembali Nonejika mereka tidak berpotongan. Jika mereka memotongnya kembali maka geometri keduanya berpotongan.

Anda juga dapat menemukan info lebih lanjut di Cookbook GDAL / OGR .

ustroetz
sumber
Saya ingin menggunakan ini, tapi saya di windows, dan pada kedua sistem saya sudah mencoba, saya tidak bisa mendapatkan binding python untuk bekerja. Saya mengalami masalah yang dijelaskan dalam posting ini: gis.stackexchange.com/questions/44958/…
Devdatta Tengshe
1
Untuk berjaga-jaga jika ada orang lain yang menemukan ini, dimungkinkan untuk menggunakan GDAL / OGR dengan Python di Windows (dan dalam ArcGIS, tidak kurang): gis.stackexchange.com/questions/74524/…
Evil Genius
Anda juga dapat menulis persimpangan = poly1.Intersect (poly2) --- nilai persimpangan akan BENAR atau SALAH tergantung pada apakah poligon bersilangan
Max
0

Saya tahu ini adalah pertanyaan lama, tetapi saya telah menulis perpustakaan python untuk menangani tabrakan antara polong cekung dan cembung, serta lingkaran.

Cukup mudah digunakan, ini dia!

Contoh:

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

Anda juga dapat membuatnya menghasilkan respons, yang meliputi:

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

jika Anda ingin mengetahui levelnya, Anda bisa menggunakan ini. Sebagai argumen, Anda dapat memberikan daftar poligon. Dan sebagai nilai balik Anda mendapatkan daftar level. Dalam daftar level ada poligon.

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
sumber