百度地图3.0截图,下载(解决图形下载偏移的问题)

news2025/7/9 6:50:22

百度地图应用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)
  },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析B树:数据结构、存储结构与算法优势

一、引言 在计算机科学中&#xff0c;数据结构和算法是核心内容。它们的选择和应用直接影响程序的效率和性能。B树&#xff08;B-Tree&#xff09;作为一种自平衡的多叉树数据结构&#xff0c;广泛应用于数据库和文件系统中。本文将详细介绍B树的数据结构模型、存储结构&#…

ssm创意商城-计算机毕业设计源码03663

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

JavaScript快速入门系列-2(JavaScript语言基础)

第二章&#xff1a;JavaScript语言基础 2.1 变量声明&#xff1a;let, const, var2.1.1 变量是什么&#xff1f;2.1.2 var2.1.3 let与const2.1.4 选择哪个关键字&#xff1f; 2.2 数据类型2.2.1 基本数据类型2.2.2 复杂数据类型2.2.3 示例与类型检测 2.3 运算符2.3.1 算术运算符…

C++基础知识(八:STL标准库 Map和multimap )

Map C 标准模板库&#xff08;STL&#xff09;中的 map 容器是一种非常有用的关联容器&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。在 map 中&#xff0c;每个元素都由一个键和一个值组成&#xff0c;其中键是唯一的&#xff0c;而值则可以重复。 基…

来自IEEE编委的发文建议及最佳实践

1.注意关键词(会涉及是否能找到合适的评审人) 2. Intro部分 contribution 通常3-4点 3. 注意文章中的符号使用前后统一 4.需要分析最终的结果(对之后的研究有什么帮助) 5.结论的部分 切忌虎头蛇尾,需要分析优点和缺点 建议未来的研究方向 6.参考文献

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…

max code size exceeded

Warning! Error encountered during contract execution [max code size exceeded] 智能合约编译时提示 contracts/core/CORE.sol:15:1: Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on m…

自研一套带双向认证的Android通用网络库

当前&#xff0c;许多网络库基于Retrofit或OkHttp开发&#xff0c;但实际项目中常需要定制化&#xff0c;并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么&#xff0c;有没有一种通用的封装方式&#xff0c;可以满足大多数项目需求&#xff1f;…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

如何平衡安全访问和办公效率?零信任安全×统一身份才是解决之道

在远程办公、混合办公、跨团队协作日益频繁的今天&#xff0c;企业的业务开展需要支持多种访问接入的需求和场景。如何平衡企业数据的安全访问和办公效率将成为挑战。 在业务的多种接入场景上&#xff0c;企业引入零信任&#xff08;Zero Trust&#xff0c;ZT&#xff09;产品…

鸿蒙用 BuilderParam 实现同一个布局不同内容组件

面通过一个案例展示BuilderParam的具体用法&#xff0c;例如&#xff0c;现需要实现一个通用的卡片组件&#xff0c;如下图所示 卡片中显示的内容不固定&#xff0c;例如 具体实现代码如下&#xff1a; Entry Component struct BuildParamDemo {build() {Column(){Card() {imag…

aac如何转化mp3?超好用的四种音频转换方法!

aac如何转化mp3&#xff1f;AAC格式可能鲜为人知&#xff0c;但实际上它是一种音频文件格式&#xff0c;然而&#xff0c;AAC的应用却不太广泛&#xff0c;这并非偶然&#xff0c;首先&#xff0c;使用AAC需要支付专利费用&#xff0c;这对于个人和公司都可能是一笔不小的开支&…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

Git保姆级教程

目录 Git是什么&#xff0c;为什么要学这个工具&#xff1f; 码云注册并创建仓库 Git安装 查看本地仓库状态 添加到暂存区 提交到本地库 修改文件 版本回退 创建、切换和删除分支 合并分支 克隆远端库到本地 将本地库推送到远端库 命令设置别名 Git是什么&#xf…

Qt 竖排文字研究(一)

在传统的编程环境中&#xff0c;代码的排列方式通常是水平的&#xff0c;这是基于我们日常的阅读习惯和编程规范。但是&#xff0c;当我们尝试打破这一常规&#xff0c;将代码字符以竖排的方式呈现时&#xff0c;发现没有什么现成有效的方式。所以本文基于Qt 的场景视图下&…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

搭建 Redis 集群【Windows】

Redis 集群是一个分布式存储解决方案&#xff0c;它将数据分布在多个Redis节点上&#xff0c;以提高系统的可伸缩性、可靠性和性能。 1. 集群概念与特点 集群概念&#xff1a;Redis集群是由多个相互独立的 Redis 节点组成&#xff0c;这些节点通过高速网络互联&#xff0c;并作…

Java多线程-StampedLock(原子读写锁)

StampedLock 是读写锁的实现&#xff0c;对比 ReentrantReadWriteLock 主要不同是该锁不允许重入&#xff0c;多了乐观读的功能&#xff0c;使用上会更加复杂一些&#xff0c;但是具有更好的性能表现。StampedLock 的状态由版本和读写锁持有计数组成。 获取锁方法返回一个邮戳&…

源代码防泄密经验分享之安全上网篇

场景描述&#xff1a; 随着信息技术的发展&#xff0c;越来越多的新技术产品进入到政府、军事、科研等涉密单位。这些新技术产品在给工作人员带来便利的同时&#xff0c;也给信息安全保密工作带来了许多新的不容忽视的安全隐患&#xff0c;应引起高度重视。常规的内外网隔离手…