使用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
相关产品推荐
相关产品推荐

