如何编写函数判断坐标点是否落在不规则多边形配送区域范围内
不规则配送多边形的点包含判断实现方案
核心算法选择
直接用射线法(奇偶环绕数规则),是目前工业界处理不规则凹多边形点包含判断的通用方案,完全适配你这种有大量折角的复杂配送边界场景,无需对边界形状做规整处理。
算法逻辑
- 从待判定的目标坐标点向水平正右方向发射一条无限长的虚拟射线
- 遍历多边形所有连续边,统计射线和边的交点数量
- 交点数为奇数则点在多边形内部(可配送),偶数则在外部(不可配送)
- 特殊边界情况:点刚好落在多边形边、顶点上,直接判定为在内部即可,符合配送业务的常规规则
代码实现示例(Python版)
你可以根据自己使用的开发语言做适配,逻辑完全通用:
def is_in_delivery_area(point, boundary): """ 判断坐标点是否在配送区域内 :param point: 待判定点 (lng, lat) :param boundary: 配送多边形边界坐标数组,按连续顺序排列,首尾闭合 [(lng1, lat1), (lng2, lat2), ..., (lng1, lat1)] :return: True=在配送区域内,False=不在 """ lng_p, lat_p = point inside = False n = len(boundary) for i in range(n): lng1, lat1 = boundary[i] lng2, lat2 = boundary[(i+1)%n] # 判断边的两个端点是否在射线上下两侧 if ((lat1 > lat_p) != (lat2 > lat_p)): # 计算射线和边的交点经度 intersect_lng = ( (lat_p - lat1) * (lng2 - lng1) ) / (lat2 - lat1) + lng1 if lng_p < intersect_lng: inside = not inside return inside
业务优化建议
- 多门店场景可以先做前置过滤:先计算目标点和对应门店的直线距离,如果超出你预设的最大配送半径(比如3km)直接返回不可配送,跳过多边形判断逻辑,大幅提升接口响应速度
- 如果配送区域存在需要排除的内部区域(比如某个封闭小区不配送),可以再加一层排除多边形的判断,点落在排除多边形内则返回不可配送
- 长期固定的配送边界可以提前把坐标数组序列化存储,不用每次请求都重新解析边界数据
内容的提问来源于stack exchange,提问作者pxrplmxxn
相关产品推荐
相关产品推荐

