百度地图应用3.0开发的页面,需要截图并下载的功能。前端采用html2canvas生成base64图片
由于百度地图绘制多边形是svg,而html2canvas不支持生成。不绘制线的截图是正常的,绘制了线条就会出现偏移。以下是对比,上一张是正常的,下一张是使用html2canvas截图,会偏移


搜索了很多方法,又说用canvg的,试了下要么报错,要么空白,没用,最后找到用rasterizehtml进行转换,将dom中的目标svg转换为canvas。发现可以实现想要的需求
具体实现就是: 通过id,获取地图div下的svg(变量备份一份svg的dom数据),转换为canvas,然后进行截图,需要注意,在替换时,需要延迟进行html2canvas截图,否则页面渲染未完成,截图截的是空白的。待截图完成,下载后。再将转换的canvas替换回svg,一定要替换回去。否则再次在地图上操作,会发现,地图上的线条不再跟随地图了,成静态的了。
有一点需要注意,html2canvas截图,图片跨域会截图不了,会空白,所以要么服务器允许跨域,要么设置代理。
# 允许跨域访问的配置
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
以下是步骤:
1。安装html2canvas ,rasterizehtml
![]()
![]()
2.页面引用
import html2canvas from 'html2canvas' import rasterizeHTML from 'rasterizehtml'
3.实现代码,地图父级div写入id即可
downImage(idStr = 'baiduMapId') {
// 备份原始的svg元素
const svgBackups = []
// 获取全部的svg
const reportElement = document.getElementById(idStr)
// const reportElement = document.getElementById(idStr)
const svgElems = reportElement.querySelectorAll('svg')
console.log(svgElems)
if (svgElems.length !== 0) {
svgElems.forEach((item, index) => {
// 获取svg的父元素
const parentNode = item.parentNode
// 获取svg内容及样式
const svgHTML = (item.outerHTML || new XMLSerializer().serializeToString(item)).trim()
const svgStyles = getComputedStyle(item)
// 创建canvas元素,并根据svg设置宽
const canvas = document.createElement('canvas')
canvas.width = parseInt(svgStyles.width, 10)
canvas.height = parseInt(svgStyles.height, 10)
// 生成canvas
rasterizeHTML.drawHTML(svgHTML, canvas)
// 使用canvas代替svg
parentNode.removeChild(item)
parentNode.appendChild(canvas)
// 备份原始的svg元素
svgBackups.push({ parentNode, svgElement: item })
})
}
setTimeout(() => {
html2canvas(document.querySelector('#' + idStr), {
useCORS: true,
preserveDrawingBuffer: true,
// foreignObjectRendering: true,
allowTaint: true,
scrollY: 0,
scale: 1
}).then(canvas => {
const imgUrl = canvas.toDataURL('image/png')
console.log(imgUrl)
// 创建一个临时的 <a> 元素
const link = document.createElement('a')
link.href = imgUrl
// 设置下载的文件名
link.download = 'screenshot.png'
// 模拟点击链接进行下载
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
/* if (svgBackups.length !== 0) {
// 将canvas元素替换回原来的svg元素
svgBackups.forEach(({ parentNode, svgElement }) => {
parentNode.removeChild(parentNode.querySelector('canvas'))
parentNode.appendChild(svgElement)
})
} */
})
}, 2000)
},



















