我有两个多边形的顶点(这些是单个的)两个不同阵列中的没有任何孔的部分多边形)。多边形是二维的(即只是X和Y坐标)
我想创建一个函数,该函数将返回一个布尔值,指示这两个多边形是否相交。我不能在其中使用
arcpy
或任何arcgis
组件。您可以建议这样做的算法或库吗?
#1 楼
您可以试一试。它们描述了空间关系,并且可以在Windows上运行。
空间数据模型伴随着一组自然语言
几何对象之间的关系–包含,相交,
重叠,接触等–以及用于
使用其构成点集的相互交点的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))
#2 楼
您可以为此使用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
。如果它们相交,则返回的几何图形都是相交的。#3 楼
如果您知道或对学习R感兴趣,它具有一些有用的空间包。 http://cran.r-project.org/web/views/Spatial.html有Python模块可与R(RPy *)交互
#4 楼
我知道这是一个老问题,但是我已经编写了一个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
#5 楼
如果您想知道级别,可以使用它。作为参数,您可以提供多边形列表。作为返回值,您可以获得级别列表。在级别列表中有多边形。
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
评论
我很想使用它,但是我在Windows上,并且在我尝试过的两个系统上,我都无法使python绑定正常工作。我遇到了这篇文章中描述的问题:gis.stackexchange.com/questions/44958/…
–德夫达塔(Devdatta Tengshe)
2014年3月18日在13:13
以防万一有人偶然发现此问题,可以在Windows中(以及在ArcGIS中同样如此)在Python中使用GDAL / OGR:gis.stackexchange.com/questions/74524/…
–邪恶的天才
2014年3月19日在12:16
您还可以编写交集= poly1.Intersect(poly2)---相交的值为TRUE或FALSE,这取决于多边形是否相交
–最大
2015年11月19日在10:01