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
相关产品推荐
相关产品推荐

