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

Python无第三方库实现经纬度周边半径内位置查询及圆形绘制

经纬度圆形范围生成与点筛选Python实现(无第三方依赖)

以下实现仅依赖Python内置math模块,无需安装任何额外库,适配十进制度格式的经纬度输入。
参考示意图

核心前置说明

所有计算基于地球近似球体模型,默认取地球平均半径为6371km,若需要使用米作为半径单位,可将地球半径数值改为6371000。三角函数计算前需将十进制度经纬度转换为弧度,计算完成后再转回十进制度。

1. 围绕中心点生成指定半径的圆形范围边界

实现逻辑:

  • 将中心点十进制度经纬度转为弧度
  • 把输入的半径转换为球面角偏移量:偏移角度 = 半径 / 地球平均半径
  • 遍历0~360°的方位角(步长可自行调整,步长越小边界点越密集,圆形平滑度越高)
  • 对每个方位角通过球面坐标变换计算对应边界点的经纬度,再转回十进制度输出

示例代码:

import math

EARTH_RADIUS = 6371  # 单位:km,若需用米则改为6371000

def generate_circle_boundary(center_lon, center_lat, radius, step=1):
    """
    生成圆形范围的边界点坐标
    :param center_lon: 中心点经度(十进制度)
    :param center_lat: 中心点纬度(十进制度)
    :param radius: 圆形半径(单位和EARTH_RADIUS对应,默认km)
    :param step: 方位角步长,默认1度,数值越小边界越平滑
    :return: 圆形边界点的经纬度列表,格式为[(lon1, lat1), (lon2, lat2)...]
    """
    # 十进制度转弧度
    center_lon_rad = math.radians(center_lon)
    center_lat_rad = math.radians(center_lat)
    # 半径转球面偏移角
    d_rad = radius / EARTH_RADIUS
    boundary_points = []
    # 遍历所有方位角
    for bearing in range(0, 360, step):
        bearing_rad = math.radians(bearing)
        # 计算当前方位角对应的纬度
        lat_rad = math.asin(
            math.sin(center_lat_rad) * math.cos(d_rad) +
            math.cos(center_lat_rad) * math.sin(d_rad) * math.cos(bearing_rad)
        )
        # 计算当前方位角对应的经度
        lon_rad = center_lon_rad + math.atan2(
            math.sin(bearing_rad) * math.sin(d_rad) * math.cos(center_lat_rad),
            math.cos(d_rad) - math.sin(center_lat_rad) * math.sin(lat_rad)
        )
        # 转回十进制度
        lon = math.degrees(lon_rad)
        lat = math.degrees(lat_rad)
        boundary_points.append((lon, lat))
    return boundary_points

2. 筛选落在圆形范围内的坐标点

实现逻辑:
使用哈弗辛(Haversine)公式计算目标点和中心点的球面实际距离,若距离小于等于设定的半径阈值,即为落在圆形范围内的点。

示例代码:

def calc_haversine_distance(lon1, lat1, lon2, lat2):
    """
    计算两个经纬度点之间的球面距离
    :param lon1: 点1经度
    :param lat1: 点1纬度
    :param lon2: 点2经度
    :param lat2: 点2纬度
    :return: 两点距离,单位和EARTH_RADIUS对应,默认km
    """
    lon1_rad = math.radians(lon1)
    lat1_rad = math.radians(lat1)
    lon2_rad = math.radians(lon2)
    lat2_rad = math.radians(lat2)
    # 哈弗辛公式计算
    dlon = lon2_rad - lon1_rad
    dlat = lat2_rad - lat1_rad
    a = math.sin(dlat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2)**2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    return EARTH_RADIUS * c

def filter_points_in_circle(center_lon, center_lat, radius, points):
    """
    筛选所有落在圆形范围内的点
    :param center_lon: 中心点经度
    :param center_lat: 中心点纬度
    :param radius: 圆形半径
    :param points: 待筛选的点列表,格式为[(lon1, lat1), (lon2, lat2)...]
    :return: 符合条件的点列表
    """
    filtered = []
    for (lon, lat) in points:
        dist = calc_haversine_distance(center_lon, center_lat, lon, lat)
        if dist <= radius:
            filtered.append((lon, lat))
    return filtered

调用示例

# 示例:中心点为北京经纬度,半径5km
center_lon, center_lat = 116.403874, 39.914885
radius = 5

# 生成圆形边界
circle_boundary = generate_circle_boundary(center_lon, center_lat, radius)
print("圆形边界点数量:", len(circle_boundary))

# 待筛选的测试点
test_points = [
    (116.403874, 39.914885),  # 中心点,肯定在范围内
    (116.45, 39.92),  # 距离约4km,在范围内
    (116.5, 39.95),  # 距离约10km,不在范围内
]
# 筛选点
in_circle_points = filter_points_in_circle(center_lon, center_lat, radius, test_points)
print("范围内的点:", in_circle_points)

内容的提问来源于stack exchange,提问作者Muhammad Usama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:45:07