파이썬에서 두 개의 다각형이 교차하는지 찾기?


19

파이썬에서 두 개의 다각형이 교차하는지 확인하는 데 도움이되는 알고리즘, 높은 수준의 솔루션 또는 라이브러리를 찾고 있습니다.

두 개의 다른 배열에 두 개의 다각형의 정점이 있습니다 (이것은 구멍이없는 단일 부품 다각형입니다). 다각형은 2D입니다 (즉, X 및 Y 좌표 만).

이 두 다각형이 교차하는지 여부를 나타내는 부울을 반환하는 함수를 만들고 싶습니다.

arcpy, 또는 이것의 어떤 arcgis구성 요소도 사용할 수 없습니다 .

이를 위해 알고리즘이나 라이브러리를 제안 할 수 있습니까?

답변:


42

매끄럽게 시도 할 수 있습니다.

공간 관계를 설명하고 창에서 작동합니다.

공간 데이터 모델에는 포함, 교차, 겹침, 접촉 등 기하학적 객체 간의 자연 언어 관계 그룹과 구성 요소 포인트 세트의 상호 교차점의 3x3 매트릭스를 사용하여이를 이해하기위한 이론적 프레임 워크가 수반됩니다.

다음 코드는 교차를 테스트하는 방법을 보여줍니다.

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

이를 위해 GDAL / OGR Python 바인딩 을 사용할 수 있습니다 .

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

None교차하지 않으면 반환 됩니다. 이들이 교차하면 형상이 모두 교차했음을 반환합니다.

또한 GDAL / OGR Cookbook 에서 추가 정보를 찾을 수 있습니다 .


나는 이것을 사용하고 싶지만 창문에 있고 내가 시도한 두 시스템 모두에서 파이썬 바인딩을 작동시킬 수 없다. 이 게시물에 설명 된 문제가 발생합니다. gis.stackexchange.com/questions/44958/…
Devdatta Tengshe

1
바로이시의 경우 다른 사람 비틀 거림, (덜하고는 ArcGIS 이내) Windows에서 파이썬 GDAL / OGR을 사용할 수 없습니다 : gis.stackexchange.com/questions/74524/...
사악한 천재

교차점 = poly1.Intersect (poly2) --- 다각형이 교차하는지 여부에 따라 교차 값이 참 또는 거짓이됩니다.
Max


0

나는 이것이 오래된 질문이라는 것을 알고 있지만 원과 오목하고 볼록한 다각형 사이의 충돌을 처리하기 위해 파이썬 라이브러리를 작성했습니다.

사용하기 매우 간단합니다. 여기 있습니다!

예:

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

다음을 포함하여 응답을 생성하도록 할 수도 있습니다.

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

레벨을 알고 싶다면 이것을 사용할 수 있습니다. 인수로 다각형 목록을 제공 할 수 있습니다. 그리고 반환 값으로 레벨 목록을 얻습니다. 레벨 목록에는 다각형이 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.