html利用html2canvas截取百度地图成图片并下载到本地,解决覆盖物截不到的问题

说实话,我也不是很熟,但是确实实现了,利用html2canvas截取百度地图很简单,但是要把覆盖物下下来却很难,尤其是轨迹,我是差了很多很多很多资料,最后综合了好几家给解决了;
大概思路也说不好,反正就是先转矢量图,在转png格式;
话不多说,上代码
第一步,引入html2canvas.js

<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>

第二步 直接调用callbackdata 方法就行了;
唯一需要注意的一点,地图所在的div的id和class是一样名字就可以了

						<div id="mapDiv" class="mapDiv">
                        </div>
			//  byh 截取图片 主方法 直接调用
            callbackdata = function () {
                PrtScn(".mapDiv").then((result) => {
                	//下载图片
                    download(result);
                });
            }

            /* 截图核心方法封装,获取base64 */
            function PrtScn(domName) {
                if (null == domName || '' == domName) {
                    throw ('dom name should not be null');
                }
                if ('#' != domName.charAt(0) && '.' != domName.charAt(0)) {
                    throw ('dom element only supports id or class');
                }
                let domIsNull = null;
                switch (domName.charAt(0)) {
                    case '#':
                        domIsNull = document.getElementById(domName.substr(1));
                        break;
                    case '.':
                        domIsNull = document.getElementsByClassName(domName.substr(1))[0];
                        break;
                    default:
                        break;
                }
                if (null == domIsNull) {
                    throw ('dom element should not be null');
                }
                // svg转canvas
                let nodesToRecover = [];
                let nodesToRemove = [];
                let svgElem;
                switch (domName.charAt(0)) {
                    case '#':
                        svgElem = document.getElementById(domName.substr(1)).getElementsByTagName('svg');
                        break;
                    case '.':
                        svgElem = document.getElementsByClassName(domName.substr(1))[0].getElementsByTagName('svg');
                        break;
                    default:
                        break;
                }
                let prepare = [];
                for (let i = 0; i < svgElem.length; i++) {
                    prepare.push(0);
                }
                for (let i = 0; i < svgElem.length; i++) {
                    let parentNode = svgElem[i].parentNode;
                    let canvas = document.createElement('canvas');
                    canvas.style.position = svgElem[i].style.position;
                    canvas.width = parseInt(svgElem[i].style.width);
                    canvas.height = parseInt(svgElem[i].style.height);
                    canvas.style.left = 0;
                    canvas.style.top = 0; // 生成与svg对应尺寸的canvas
                    let ctx = canvas.getContext('2d');
                    let svg_xml = (new XMLSerializer()).serializeToString(svgElem[i]);
                    let img = new Image();
                    img.src = "data:image/svg+xml;base64," + window.btoa(svg_xml);
                    img.onload = function () {
                        ctx.drawImage(img, 0, 0);
                        prepare[i] = 1;
                        //download(canvas.toDataURL("image/png")); // 调试用
                    }
                    parentNode.appendChild(canvas); // 使用canvas代替svg进行截图
                    nodesToRemove.push({ // 完成截图后删除canvas
                        parent: parentNode,
                        child: canvas
                    });
                    nodesToRecover.push({ // 完成截图后恢复svg
                        parent: parentNode,
                        child: svgElem[i]
                    });
                    parentNode.removeChild(svgElem[i]); // 暂时移除svg
                }
                return new Promise((resolve) => {
                    let waitInterval = setInterval(() => {
                        let isComplete = true; // 创建定时器,等待上面img.onload的异步操作
                        for (let i = 0; i < prepare.length; i++) {
                            if (prepare[i] == 0) {
                                isComplete = false;
                                break;
                            }
                        }
                        if (isComplete) {
                            clearInterval(waitInterval);
                            // div转canvas截图
                            let domElem;
                            switch (domName.charAt(0)) {
                                case '#':
                                    domElem = document.getElementById(domName.substr(1));
                                    break;
                                case '.':
                                    domElem = document.getElementsByClassName(domName.substr(1))[0];
                                    break;
                                default:
                                    break;
                            }
                            html2canvas(domElem, {
                                useCORS: true,
                                foreignObjectRendering: true,
                                allowTaint: false,
                                taintTest: true,
                                scale: 1
                            }).then((cnv) => {
                                let imgUrl = cnv.toDataURL("image/png"); // 将canvas转换成img的src流,base64
                                for (let i = 0; i < nodesToRecover.length; i++) {
                                    nodesToRecover[i].parent.appendChild(nodesToRecover[i].child);
                                }
                                for (let i = 0; i < nodesToRemove.length; i++) {
                                    nodesToRemove[i].parent.removeChild(nodesToRemove[i].child);
                                }
                                resolve(imgUrl);
                            });
                        }
                    }, 5);
                });
            }

            /* 下载图片的方法 */
            function download(url) {
                let a = document.createElement('a');
                a.style.display = 'none';
                document.body.appendChild(a);
                let triggerDownload = $(a).attr("href", url).attr("download", "order-1111111111.png");
                triggerDownload[0].click();
                document.body.removeChild(a)
            }

今天写代码遇到个问题,就是想在后台下载怎么下载…反正最后是解决了,如果也有相同问题的,可以给我留言或者私信我,我再写一篇文章;

HTML2Canvas是一个JavaScript库,用于将HTML内容转换为图片。然而,它并非专为处理复杂的矢量图形如百度地图上的轨迹线设计,因此直接截取可能会出现问题百度地图的轨迹线通常是SVG或VML元素,而HTML2Canvas对这类元素支持有限。 解决这个问题的一种常见做法是结合第三方库,例如`html2canvas`和`jspdf-autotable`,以及一些地图API提供的导出功能。如果百度地图提供这样的API,可以直接导出轨迹数据然后绘制到canvas上再图。如果没有现的API,可以尝试手动抓取轨迹数据并转化为像素坐标。 以下是一个简单的代码示例,假设我们已经获取到了百度地图轨迹的数据: ```javascript // 假设轨迹数据存储在轨迹Array中 const trajectoryData = ...; // 使用html2canvascanvas let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); // 预计的宽度和高度 let width = 800; let height = 600; // 渲染轨迹到canvas for (let i = 0; i < trajectoryData.length; i++) { let point = trajectoryData[i]; // 将地理坐标转换为canvas坐标(这里仅作演示,实际需要调用百度地图提供的坐标转换函数) let canvasPoint = convertGeoToCanvasCoord(point.lat, point.lng, width, height); // 绘制点或其他轨迹表示 ctx.beginPath(); ctx.arc(canvasPoint.x, canvasPoint.y, 4, 0, Math.PI * 2); ctx.fillStyle = 'red'; ctx.fill(); } // 设置canvas大小并渲染 canvas.width = width; canvas.height = height; ctx.drawImage(canvas, 0, 0); // 现在你可以使用html2canvas(canvas)来图了 html2canvas(canvas).then(function(img) { // 将图片保存或做其他操作 }); ``` 请注意,这个例子是简化的,并未涵盖所有细节,实际应用中可能需要处理更复杂的情况,比如轨迹线的连续性和颜色渐变等。同时,百度地图的具体API和坐标转换规则需要查阅其官方文档。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋秋秋秋秋雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值