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

