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

如何用代码批量生成Plotly Scatter Geo标记点周边5km区域PNG截图

自动化截取Plotly Scatter Geo指定区域的PNG截图

这需求太实用了!手动截图确实麻烦,用代码完全可以批量搞定。核心思路是动态调整地图的视野范围,把每个目标标记点设为中心,计算5km半径对应的经纬度边界,然后直接导出图片。下面是具体实现方案:

步骤拆解

  1. 经纬度与距离转换:因为经纬度的距离在不同纬度下不一致,需要先计算5km对应的经纬度范围。
  2. 遍历标记点更新地图视野:对每个点,调整Plotly的geos参数,将地图中心设为该点,同时限定经纬度范围为5km半径区域。
  3. 批量导出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:32:51