查找两个多边形是否在Python中相交?


19

我正在寻找一种算法,高级解决方案,或者甚至一个可以帮助我确定Python中两个多边形是否相交的库。

我在两个不同的数组中具有两个多边形的顶点(这些是没有任何孔的单部分多边形)。多边形是2D(即仅X和Y坐标)

我想制作一个函数,该函数将返回一个布尔值,指示这两个多边形是否相交。

请注意,我不能使用arcpy或其中的任何arcgis组件。

您可以建议这样做的算法或库吗?

Answers:


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中找到更多信息。


我很想使用它,但是我在Windows上,并且在我尝试过的两个系统上,我都无法使python绑定正常工作。:我碰上在这篇文章中描述的问题gis.stackexchange.com/questions/44958/...
Devdatta Tengshe

1
万一有人偶然发现,可以在Windows中(以及在ArcGIS中,也可以在Python中)将GDAL / OGR与Python一起使用:gis.stackexchange.com/questions/74524/…–
Evil Genius

你也可以写路口= poly1.Intersect(POLY2)---交点的值将是TRUE或FALSE取决于如果多边形相交
最大


0

我知道这是一个老问题,但是我已经编写了一个python库来处理凹凸多边形和圆之间的碰撞。

它非常简单易用,您可以使用!

例:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.