如何用代码批量生成Plotly Scatter Geo标记点周边5km区域PNG截图
自动化截取Plotly Scatter Geo指定区域的PNG截图
这需求太实用了!手动截图确实麻烦,用代码完全可以批量搞定。核心思路是动态调整地图的视野范围,把每个目标标记点设为中心,计算5km半径对应的经纬度边界,然后直接导出图片。下面是具体实现方案:
步骤拆解
- 经纬度与距离转换:因为经纬度的距离在不同纬度下不一致,需要先计算5km对应的经纬度范围。
- 遍历标记点更新地图视野:对每个点,调整Plotly的
geos参数,将地图中心设为该点,同时限定经纬度范围为5km半径区域。 - 批量导出PNG:用Plotly的
write_image工具保存每个调整后的地图。
代码实现
首先确保你安装了依赖:
pip install plotly kaleido
(kaleido是Plotly推荐的图片导出工具,比旧的orca更稳定)
完整代码示例:
import plotly.graph_objects as go import math # 1. 示例标记点数据(替换成你的实际数据) markers = [ {"lat": 31.2304, "lon": 121.4737, "name": "上海"}, {"lat": 39.9042, "lon": 116.4074, "name": "北京"}, {"lat": 23.1291, "lon": 113.2644, "name": "广州"} ] # 2. 定义函数:计算5km半径对应的经纬度范围 def get_5km_bounds(lat, lon): # 纬度每度约111km,经度在lat纬度处每度约111*cos(lat) km km_per_deg_lat = 111.0 km_per_deg_lon = 111.0 * math.cos(math.radians(lat)) # 5km对应的经纬度差值 delta_lat = 5 / km_per_deg_lat delta_lon = 5 / km_per_deg_lon return { "lat_min": lat - delta_lat, "lat_max": lat + delta_lat, "lon_min": lon - delta_lon, "lon_max": lon + delta_lon } # 3. 创建基础Scatter Geo地图 fig = go.Figure(go.Scattergeo( lat=[m["lat"] for m in markers], lon=[m["lon"] for m in markers], text=[m["name"] for m in markers], mode="markers+lines", # 保留边界线(如果你的边界线是连接点的线,这里用lines;如果是点的边界,用marker的line参数) marker=dict( size=10, color="red", line=dict(width=2, color="black") # 标记点的边界线 ) )) # 基础地图配置 fig.update_layout( geo=dict( projection_type="mercator", # 墨卡托投影,适合计算平面距离 showland=True, landcolor="lightgray" ) ) # 4. 遍历每个标记点,截取并保存5km范围的截图 for idx, marker in enumerate(markers): bounds = get_5km_bounds(marker["lat"], marker["lon"]) # 更新地图视野 fig.update_geos( center=dict(lat=marker["lat"], lon=marker["lon"]), lataxis_range=[bounds["lat_min"], bounds["lat_max"]], lonaxis_range=[bounds["lon_min"], bounds["lon_max"]] ) # 保存为PNG文件 filename = f"marker_{idx}_{marker['name']}_5km.png" fig.write_image(filename, width=800, height=600) print(f"已保存:{filename}")
关键细节说明
- 边界线处理:如果你的标记点边界线是自定义的多边形(不是点之间的连线),需要确保在
Scattergeo中正确传入lon和lat的多边形坐标,mode设为lines或markers+lines。 - 投影选择:墨卡托投影(
mercator)在低纬度区域距离计算误差较小,如果是高纬度地区,可以考虑用orthographic但距离计算会更复杂,建议还是用墨卡托。 - 图片尺寸:
write_image的width和height可以根据需求调整,确保截图清晰度足够。
内容的提问来源于stack exchange,提问作者Tway101
相关产品推荐
相关产品推荐

