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

基于Plotly计算参考GPS点范围并实现坐标筛选与区域绘制

解决方案

1. 筛选5米范围内的坐标点

经纬度属于球面坐标,需用Haversine公式计算两点间的球面距离,或借助geopy库简化计算,以此筛选出橙色参考点5米范围内的坐标。

原生Haversine公式实现

import math

def haversine(lat1, lon1, lat2, lon2):
    # 经纬度转弧度
    lat1_rad = math.radians(lat1)
    lon1_rad = math.radians(lon1)
    lat2_rad = math.radians(lat2)
    lon2_rad = math.radians(lon2)
    
    # Haversine核心计算
    dlat = lat2_rad - lat1_rad
    dlon = lon2_rad - lon1_rad
    a = math.sin(dlat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2)**2
    c = 2 * math.asin(math.sqrt(a))
    # 地球半径(单位:米)
    earth_radius = 6371000
    return c * earth_radius

# 橙色参考点坐标
ref_lat = 51.4000684461437
ref_lon = 12.4292323627949

# 所有数据源坐标集合
points = [
    ("红色", 51.4001213, 12.4291356),
    ("紫色", 51.400127, 12.429187),
    ("绿色", 51.400106346232, 12.429278003005),
    ("橙色", ref_lat, ref_lon)
]

# 筛选5米范围内的点
filtered_points = []
for name, lat, lon in points:
    distance = haversine(ref_lat, ref_lon, lat, lon)
    if distance <= 5:
        filtered_points.append((name, lat, lon, round(distance, 2)))

# 输出筛选结果
print("5米范围内的坐标:")
for p in filtered_points:
    print(f"{p[0]}: 距参考点{p[3]}米")

用geopy简化计算

from geopy.distance import geodesic

ref_point = (ref_lat, ref_lon)
filtered_points = []
for name, lat, lon in points:
    distance = geodesic(ref_point, (lat, lon)).meters
    if distance <= 5:
        filtered_points.append((name, lat, lon, round(distance, 2)))

筛选结果:绿色点(约3.9米)、橙色参考点(0米)在5米范围内;红色点(约8.7米)、紫色点(约7.2米)超出范围。

2. 在Plotly地图绘制5米区域与坐标点

用plotly.express.scatter_mapbox绘制坐标点,通过add_shape添加5米半径的半透明圆形区域:

import plotly.express as px

# 拆分坐标数据
names = [p[0] for p in points]
lats = [p[1] for p in points]
lons = [p[2] for p in points]

# 初始化地图
fig = px.scatter_mapbox(
    lat=lats,
    lon=lons,
    color=names,
    color_discrete_map={
        "红色": "red",
        "紫色": "purple",
        "绿色": "green",
        "橙色": "orange"
    },
    zoom=18,  # 放大至细节可见级别
    center={"lat": ref_lat, "lon": ref_lon},
    mapbox_style="open-street-map"
)

# 添加5米半径的橙色半透明区域
fig.add_shape(
    type="circle",
    fillcolor="rgba(255, 165, 0, 0.2)",
    line_color="orange",
    line_width=2,
    latref="lat",
    lonref="lon",
    lat0=ref_lat,
    lon0=ref_lon,
    radius=5  # 半径单位:米
)

fig.show()

效果说明:橙色半透明圆形为参考点5米范围,绿色点与橙色参考点落在圆内,红色、紫色点在圆外。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:45:53