You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写函数判断坐标点是否落在不规则多边形配送区域范围内

不规则配送多边形的点包含判断实现方案

核心算法选择

直接用射线法(奇偶环绕数规则),是目前工业界处理不规则凹多边形点包含判断的通用方案,完全适配你这种有大量折角的复杂配送边界场景,无需对边界形状做规整处理。

算法逻辑

  • 从待判定的目标坐标点向水平正右方向发射一条无限长的虚拟射线
  • 遍历多边形所有连续边,统计射线和边的交点数量
  • 交点数为奇数则点在多边形内部(可配送),偶数则在外部(不可配送)
  • 特殊边界情况:点刚好落在多边形边、顶点上,直接判定为在内部即可,符合配送业务的常规规则

代码实现示例(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 14:27:03