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

使用Folium提取指定中心mxm米范围nxn像素正方形地图的方法咨询

Folium提取指定米级范围正方形地图的最优方案

你之前得到矩形输出的核心原因是没有固定Folium画布的宽高比,且默认内边距会扩展视口范围,导致边界匹配失效。最优方案无需事后裁剪,可精准控制覆盖范围,具体实现逻辑和示例如下:

核心实现步骤

  • 第一步:通过米制投影(如UTM)精准计算目标正方形区域的WGS84经纬度边界,保证边界对应的实际地理范围是严格的mxm米正方形
  • 第二步:创建Folium地图时显式指定width和height参数为相同的像素值,保证地图画布本身为正方形,从根源避免矩形输出
  • 第三步:调用fit_bounds方法时设置padding=(0,0),关闭默认内边距,确保视口完全匹配计算得到的边界,不会额外扩展范围
  • 第四步:如需导出静态图像,用无头浏览器渲染时设置窗口尺寸和画布尺寸一致,等待瓦片加载完成后直接截图即可

具体场景实现(中心点(48.8584,2.2945),100x100米范围)

依赖安装

提前安装需要的库:

pip install folium pyproj selenium

使用Selenium导出静态图需要提前配置对应浏览器的驱动,示例使用Chrome驱动。

完整实现代码

import folium
import os
import time
from pyproj import Transformer
from selenium import webdriver

# 1. 配置参数
center_lat, center_lon = 48.8584, 2.2945  # 埃菲尔铁塔中心点坐标
side_length = 100  # 正方形边长,单位米
img_pixel_size = 1000  # 输出图像的像素尺寸,宽高一致
half_side = side_length / 2

# 2. 计算目标区域的经纬度边界
# 巴黎所在UTM投影区为31N,对应EPSG编码32631
transformer_wgs84_utm = Transformer.from_crs("EPSG:4326", "EPSG:32631", always_xy=True)
transformer_utm_wgs84 = Transformer.from_crs("EPSG:32631", "EPSG:4326", always_xy=True)

# 中心点转UTM米制坐标
center_x, center_y = transformer_wgs84_utm.transform(center_lon, center_lat)
# 计算正方形的西南、东北角UTM坐标
sw_utm = (center_x - half_side, center_y - half_side)
ne_utm = (center_x + half_side, center_y + half_side)
# 转回WGS84经纬度,适配Folium的(纬度, 经度)格式
bounds_wgs84 = [
    transformer_utm_wgs84.transform(*sw_utm)[::-1],
    transformer_utm_wgs84.transform(*ne_utm)[::-1]
]

# 3. 创建正方形地图
m = folium.Map(
    location=[center_lat, center_lon],
    width=img_pixel_size,
    height=img_pixel_size,
    zoom_control=False,
    control_scale=True  # 开启比例尺可手动验证范围
)
# 适配边界,关闭内边距
m.fit_bounds(bounds_wgs84, padding=(0, 0))

# 4. 导出静态正方形图像
tmp_html_path = "tmp_map.html"
m.save(tmp_html_path)

# 无头浏览器渲染截图
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument(f"--window-size={img_pixel_size},{img_pixel_size}")
driver = webdriver.Chrome(options=chrome_options)
driver.get(f"file://{os.path.abspath(tmp_html_path)}")
time.sleep(2)  # 等待瓦片完全加载,可根据网络情况调整
driver.save_screenshot("eiffel_100x100m.png")

# 清理临时文件
driver.quit()
os.remove(tmp_html_path)

精度验证

你可以通过输出图像自带的比例尺核对覆盖范围,也可以计算边界两点的实际距离,误差可控制在1米以内,完全满足米级精度的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:15:07