如何用Shapely实现点与多边形包含关系的判断及结果输出
用Shapely检测点是否属于多边形的实现方案
核心逻辑
用Shapely的Point.within()方法(或Polygon.contains())判断点与多边形的包含关系,通过循环遍历所有目标多边形,匹配到符合条件的就输出结果,遍历结束未匹配则输出不属于。
完整可运行代码
from shapely.geometry import Point, Polygon # 1. 定义测试多边形(替换为你的实际多边形坐标) polygons = [ {"name": "多边形A", "coords": [(0, 0), (0, 5), (5, 5), (5, 0)]}, {"name": "多边形B", "coords": [(6, 6), (6, 10), (10, 10), (10, 6)]} ] # 2. 定义测试点(替换为你的实际点坐标) test_point = Point(2, 3) # 3. 遍历检测逻辑 found = False for poly in polygons: # 构造Shapely多边形对象 shapely_poly = Polygon(poly["coords"]) # 判断点是否在多边形内(包含边界) if test_point.within(shapely_poly): print(f"点属于多边形:{poly['name']}") found = True # 找到匹配后可选择跳出循环,若允许多重包含则移除break break if not found: print("点不属于多边形")
常见问题排查(针对你之前循环嵌套if失败的情况)
- 多边形坐标格式错误:必须传入闭合的坐标序列(最后一个点可与第一个点重复,Shapely会自动闭合),格式为
[(x1,y1), (x2,y2), ..., (xn,yn)] - 对象构造错误:必须用
Point()和Polygon()构造Shapely的几何对象,不能直接用原始坐标列表判断 - 循环逻辑问题:要设置标记变量(如上述代码的
found),避免遍历所有多边形后重复输出“不属于”的结果 - 边界判断需求:若需排除边界,可改为
test_point.within(shapely_poly) and not test_point.touches(shapely_poly)
内容的提问来源于stack exchange,提问作者Victor Soares
相关产品推荐
相关产品推荐

