经纬志
首页 / Leaflet / 使用示例

地图导出图片

把当前视野的瓦片与矢量拼到一张 canvas 上,导出为 PNG 并自动下载。

Leaflet 1.9.4 · 更新 2026-10-28
源码与运行效果
运行效果

说明

导出不是截图,而是重新绘制:先按 map.getPixelBounds() 算出视野覆盖的瓦片行列, 把每块瓦片画到离屏 canvas 的对应位置,再取 overlayPane 里的 canvas 渲染器,按 0,0 叠上去。地图本身的 HTML 标记不在画布里, 所以注记与版权文字在导出时手工绘制。

瓦片图层必须加 crossOrigin: 'anonymous',且瓦片服务返回 Access-Control-Allow-Origin,否则 canvas 被污染, toDataURL 会直接抛 SecurityError。 示例中把渲染器的 padding 设为 0,画布尺寸与视野严格一致, 省去偏移换算。服务没有开放跨域时,代码会退化为只导出矢量图层,并给出状态提示。

步骤用到的接口不做会怎样
算瓦片范围getPixelBounds()用容器像素当起点,边缘缺一条瓦片
瓦片跨域crossOrigin: 'anonymous'没开跨域时无法读取像素,只能导出矢量
矢量合成overlayPane 中的 canvasSVG 渲染的矢量不在 canvas 里,导出会丢图层
画布对齐渲染器 padding: 0画布比视野大一圈,矢量整体偏移
注记手动 fillTextHTML 标记与气泡不会出现在导出图上

分辨率固定为 CSS 像素,高分屏导出的图会偏小。需要 2 倍图时把 canvas 宽高 乘以 2,并在绘图前 ctx.scale(2, 2),同时按 2 倍尺寸重新请求瓦片, 否则瓦片会被拉伸放大、文字发虚。