İki çokgen Python'da kesişiyor mu?


19

Python'da bir algoritma, üst düzey bir çözüm ya da iki çokgenin kesişip kesişmediğini belirlememe yardımcı olabilecek bir kütüphane arıyorum.

İki farklı dizide iki poligonun köşeleri var (Bunlar deliksiz tek parçalı çokgenlerdir). Çokgenler 2D'dir (yani sadece X ve Y koordinatları)

Bu iki çokgenin kesişip kesişmediğini gösteren bir boole döndürecek bir işlev yapmak isterim.

Lütfen kullanamadığımı arcpyveya buradaki herhangi bir arcgisbileşeni kullanmamam gerektiğini unutmayın .

Bunu yapmak için bir algoritma veya kütüphane önerebilir misiniz?

Yanıtlar:


42

Düzgün deneyebilirsiniz .

Mekansal ilişkileri tanımlar ve pencerelerde çalışır

Mekansal veri modeline, geometrik nesneler arasındaki bir grup doğal dil ilişkisi - içerir, kesişir, çakışmalar, dokunuşlar, vb. - ve bileşen nokta kümelerinin karşılıklı kesişimlerinin 3x3 matrisini kullanarak bunları anlamak için teorik bir çerçeve eşlik eder.

Aşağıdaki kod, kavşağı nasıl test edebileceğinizi gösterir:

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

Bunun için GDAL / OGR Python bağlarını kullanabilirsiniz .

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

Geri döner None . Eğer kesişirlerse, her ikisi de kesişen geometriyi döndürür.

Ayrıca GDAL / OGR Yemek Kitabı'nda daha fazla bilgi bulabilirsiniz .


Bunu kullanmak isterdim, ama pencerelerdeyim ve denediğim her iki sistemde de python bağlarının çalışmasını sağlayamıyorum. Ben bu yazıda açıklanan sorunla karşılaşıyorum: gis.stackexchange.com/questions/44958/…
Devdatta Tengshe

1
Başkasının bunun üzerine tökezlemesi durumunda, Windows'da Python ile GDAL / OGR kullanmak mümkündür (ve ArcGIS içinde, daha az değil): gis.stackexchange.com/questions/74524/…
Evil Genius

Ayrıca kesişim = poli1 de yazabilirsiniz. Kesişim (poli2) --- çokgenlerin kesişip kesişmemesine bağlı olarak kesişimin değeri DOĞRU veya YANLIŞ olacaktır
Maks


0

Bunun eski bir soru olduğunu biliyorum, ama içbükey ve dışbükey çokgenler ve daireler arasındaki çarpışmaları ele almak için bir python kütüphanesi yazdım.

Kullanımı oldukça basit, işte gidiyorsunuz!

Misal:

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

Ayrıca aşağıdakileri içeren bir yanıt oluşturmasını sağlayabilirsiniz:

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

Eğer seviyeyi bilmek istiyorsanız bunu kullanabilirsiniz. Bir argüman olarak çokgen listesi verebilirsiniz. Ve bir dönüş değeri olarak bir seviye listesi alırsınız. Seviye listesinde çokgenler var.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.