按配置数据绘制配置型地图marker的icon,自定义marker

一、需求

需要自定义配置数据的marker,其中图片内容要灵活可配置自动生成。此处项目用的百度地图。

效果图:

二、思路

用背景图+canvas绘制数字的方式生成icon的图片资源。

再将icon生成对应地图marker。

三、代码

canvasImg.js
<!--
* @description canvasImg.js 背景图+绘制内容生成图片资源
* @author xw
!-->export function addFontWithBgImg(file, params, callback) {var ready = new FileReader()/* 开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/ready.readAsDataURL(file) // 调用reader.readAsDataURL()方法,把图片转成base64ready.onload = function () {var re = this.resultcanvasDataURL(re, params, callback)}
}/*** path 背景图资源路径* params:{ bgImgStyle: 'no-repeat', bgWidth: 35, bgHeight: 48, fontText: 1, fontWidth: 35, fontHeight: 35, font: 'bold 20px PingFangSC', bgc: '#0081FF', fontColor: '#fff' }* callback*      bgImgStyle = ["no-repeat", // 不平铺"repeat-x", // 横向平铺"repeat-y", // 纵向平铺"repeat" // 全画布平铺];* */
export function canvasDataURL(path, params, callback) {const defaultOptions = {bgImgStyle: 'no-repeat',bgWidth: 45,bgHeight: 48,bgc: '#0081FF',fontText: 1, // 图片正中 大数字font: 'bold 20px PingFangSC',fontWidth: 34,fontHeight: 39,fontColor: '#0081FF',fontTwoText: 1, // 右上角 小数字fontTwo: 'bold 10px PingFangSC',fontTwoColor: '#fff',fontTwoPositionX: 35,fontTwoPositionY: 10,}const options = Object.assign(defaultOptions, params)const { bgImgStyle, bgWidth, bgHeight, fontText, fontWidth, fontHeight, font, bgc, fontColor, fontTwoText, fontTwo, fontTwoColor, fontTwoPositionX, fontTwoPositionY } = options// console.log('createNumberImg()-options', options)const img = new Image()img.src = pathimg.onload = function () {const canvas = document.createElement('canvas');// document.body.appendChild(canvas); //将画布添加到页面上// 设置画布大小canvas.width = bgWidth;canvas.height = bgHeight;// context 获取2D上下文const ctx = canvas.getContext('2d');// 清空画布内容ctx.clearRect(0, 0, canvas.width, canvas.height);// ctx.fillStyle = ctx.createPattern(img, bgImgStyle);// ctx.fillRect(0, 0, canvas.width, canvas.height);// ctx.fill();ctx.drawImage(img, 0, 0, canvas.width, canvas.height)  //绘制背景图片// 背景色 部分,会覆盖背景图, 背景色做背景 和 背景图做背景 二选一// ctx.fillStyle = bgc// 背景画布设置完后,绘制第2层内容, 覆盖在背景上的 内容---ctxTwo--fillText// const ctxTwo = canvas.getContext('2d');ctx.font = fontctx.fillStyle = fontColorctx.textAlign = 'center' // 水平居中 left center right ,positionX = fontWidth / 2const positionX = fontWidth / 2ctx.textBaseline = 'middle' // 垂直居中 top  middle bottom,  positionY = fontHeight / 2const positionY = fontHeight / 2ctx.fillText(String(fontText), positionX, positionY)ctx.font = fontTwoctx.fillStyle = fontTwoColorctx.fillText(String(fontTwoText), fontTwoPositionX, fontTwoPositionY)// 导出为图片数据URLconst imageDataUrl = canvas.toDataURL('image/png', 1); // canvas.toDataURL('image/png', 1)// console.log("生成的图像资源链接:", imageDataUrl);callback(imageDataUrl)}}/*** 将以base64的图片url数据转换为Blob* @param urlData* 用url方式表示的base64图片数据*/
export function convertBase64UrlToBlob(urlData) {const arr = urlData.split(',')const mime = arr[0].match(/:(.*?);/)[1]const bstr = atob(arr[1])let n = bstr.lengthconst u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new Blob([u8arr], { type: mime })
}
具体使用
createIconImg() {// 图片资源 自己找几个bg 在项目里本地引用const iconNormal = require('@/assets/image/bg/normal.png');const iconDanger = require('@/assets/image/bg/danger.png'); const iconInfo = require('@/assets/image/bg/info.png'); const userImgMap = {'0': iconInfo,'1': iconNormal,'2': iconNormal,'3': iconDanger,}const fontColorMap = {'0': '#666','1': '#0081FF','2': '#0081FF','3': 'red',}
const pointList = [{ lng: '113.939435', lat: '22.522226', completeStatus: '0', frequency: 1 },{ lng: '113.947254', lat: '22.524549', completeStatus: '1', frequency: 3 },{ lng: '113.945889',  lat: '22.520798', completeStatus: '2',  frequency: 4 },]// 设置地图 marker ---此处用的百度地图--BMap--使用 canvasDataURL方法const markers = []if (BMap && pointList && pointList.length > 0) {const mapRef = this.$refs.mapmapRef?.clearOverlays()// 生成的icon图片bgWidth背景宽高 要和 canvas画布宽高保持一致const bgWidth = 45const bgHeight = 48const iconSize = new BMap.Size(bgWidth, bgHeight)const iconOptions = { offset: new BMap.Size(25, 50) }pointList.forEach((em, idx) => {const userImg = userImgMap[String(em.completeStatus) || '0']const fontColor = fontColorMap[String(em.completeStatus) || '0']const params = { bgWidth, bgHeight, fontText: String(idx+1), fontColor, fontTwoText: String(em.frequency)} // 生成图片资源canvasDataURL(userImg, params, function (imgUrl) {const siteMarker = this.createMarker(mapRef, imgUrl, iconSize, iconOptions, item, index)markers.push(siteMarker)})})setTimeout(() => { const centerPoint = new BMap.Point(Number(selectRow.pointList[0]?.lng), Number(selectRow.pointList[0]?.lat));mapRef.centerAndZoom(centerPoint, 15)}, 300)}},createMarker(mapRef, iconImg, item, index) {const siteIcon = new BMap.Icon(iconImg,iconSize,iconOptions,)const sitePoint = new BMap.Point(Number(item.lng), Number(item.lat));const siteMarker = new BMap.Marker(sitePoint, {icon: siteIcon})// siteMarker.lisaSiteInfo = item // lisaSiteInfo自定义字段 主要装item信息,在InfoWindow的innerHtml时使用// const newHtml = '<div class="">我是innerHtml</div>'// console.log('newHtml', newHtml)// const infoWindow = new BMap.InfoWindow({//     content: newHtml,//     InfoWindowOptions: {//         width: 400,//         height: 300,//         enableAutoPan: true,//     }// })siteMarker.on('click', function () {alert("carText模拟触发了地图click事件!");// console.log('mapRef', mapRef)// mapRef.openInfoWindow(infoWindow, sitePoint); //开启信息窗口})mapRef.addOverlay(siteMarker)return siteMarker},

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

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

相关文章

进程地址空间(Linux)

进程地址空间 一、引入概念1. 程序的地址分布2. 线性地址和物理地址 二、进程地址空间1. 初步认识2. 地址空间和物理内存的联系3. 区域划分4. 拓展——关于“线” 三、进一步理解进程地址空间四、页表总结 一、引入概念 1. 程序的地址分布 测试代码&#xff1a; #include &l…

Nginx安装以及具体应用

文章目录 Centos7安装NginxNginx命令Nginx具体应用反向代理 location指令说明负载均衡动静分离 Nginx.conf配置详解 Centos7安装Nginx 下载地址&#xff1a;nginx: download 中间这个就是tar.gz包 Centos7安装Nginx 下载nginx-1.16.1.tar.gz上传到Centos7中的/user/local目…

java8 流到底是什么呢?

引入背景&#xff1a; 1、想像写SQL那样操作集合 2、为了提高性能&#xff0c;需要并行处理&#xff0c;并利用多核架构 流到底是什么呢&#xff1f; 流是Java API的新成员&#xff0c;它允许你 以声明性方式处理数据集合&#xff08;通过查询语句来表达&#xff0c;而不是临时…

springboot+vue3组合,对接支付宝付款第一节:内网穿透

springbootvue3组合,对接支付宝付款第一节:内网穿透&#xff01;接下来会为大家展示&#xff0c;使用java的springboot搭建一个简单的后台。提供业务接口。实现在线下单&#xff0c;支付。支付宝付款的案例。 前端页面布局我们使用vue3element-plus来实现绘制。 今天是第一个…

海康实时监控预览视频流接入web

我们采取的方案是后端获取视频流返回给前端&#xff0c;然后前端播放 海康开放平台海康威视合作生态致力打造一个能力开放体系、两个生态圈&#xff0c;Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上&#xff0c;…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…

CodeGPT--(Visual )

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…

Elasticsearch介绍以及基本操作

目录 一、Elasticsearch介绍 二、关于Elasticsearch的基本操作 &#xff08;1&#xff09;索引操作 &#xff08;2&#xff09;文档操作 三、域的属性 &#xff08;1&#xff09;index &#xff08;2&#xff09;type &#xff08;3&#xff09;store 一、Elasticsearc…

使用Go语言编写安全的HTTP代理服务器

构建一个安全的HTTP代理服务器是至关重要的&#xff0c;因为这可以保护用户的数据和隐私。让我们来看看如何使用Go语言编写一个安全的HTTP代理服务器。 首先&#xff0c;确保你的代理服务器使用HTTPS协议进行通信。HTTPS使用SSL/TLS加密来保护数据传输&#xff0c;可以确保数据…

源聚达科技:抖店的专营店怎么开

在数字化浪潮的推动下&#xff0c;抖音平台不仅为人们提供了丰富的娱乐内容&#xff0c;也成为了电商的新战场。不少创业者和品牌商纷纷选择在抖音上开设自己的专营店&#xff0c;以此抓住流量红利&#xff0c;拓宽销售渠道。那么&#xff0c;如何在抖音平台上成功开设一家专营…

每日一题——LeetCode1346.检查整数及其两倍数是否存在

方法一 循环查找 用indexOf查找每个元素的两倍是否存在在数组中&#xff0c;找到了就直接return true&#xff0c;循环结束还没找到就return false var checkIfExist function(arr) {for(let i0;i<arr.length;i){let index arr.indexOf(arr[i]*2)if(index>0 &&…

听力下降为什么会影响到言语感知?

一、听力障碍对阈值、听觉频率范围和分辨能力的影响 听力障碍使得听障者的听敏度降低&#xff0c;提高了阈值&#xff0c;不利于言语信号的接收。听障者听力阈值的变化在不同频率并不相同&#xff0c;一般而言&#xff0c;高频部分的听力损失往往大于低频部分&#xff0c;而言…

fatal error:require():Failed opening required

今天部署网站遇到了个错误 fatal error:require():Failed opening required 这个错误经常遇到 大多是网站 是开启了 open_basedir 但今天这个错误很神奇 先说解决方法 1. 检测一下是不是真的 不存在这个文件 即使100%确定 也建议你再仔细看一下 这个文件存不存在 今天我遇…

Linux:利用匿名管道构建进程池

文章目录 进程池实现进程池创建信道和进程发送任务释放资源 进程池代码总结 本篇的主题是借助前面所学的基础管道实现一个进程池&#xff0c;那么在实现进程池前先了解进程池是什么&#xff0c;进程池有什么意义&#xff0c;进而对于进程池有一个基本的把握 进程池 给定一个进…

学习笔记-李沐动手学深度学习(四)(12-13,权重衰退、L2正则化、Dropout)

总结 【trick】过拟合及正则化项参数的理解 实际数据都有噪音&#xff0c;一般有噪音后&#xff0c;模型实际学习到的权重w就会比 理论上w的最优解&#xff08;即没有噪音时&#xff09;大。&#xff08;QA中讲的&#xff09; 【好问题】 &#xff08;1&#xff09;不使用正…

svg 属性详解:填充与边框

svg 属性详解&#xff1a;填充与边框 1 颜色和透明度2 填充规则 fill-rule3 边框样式3.1 stroke-width3.2 stroke-linecap3.3 stroke-linejoin3.4 stroke-dasharray 1 颜色和透明度 图像都有颜色&#xff0c;svg 中可以使用属性 fill 和 stroke 来修改图形的颜色。fill 属性设置…

九州金榜|家庭教育中孩子厌学原因及解决办法

作为家长我们希望自己的孩子热爱学习&#xff0c;并取得优异成绩。但是&#xff0c;在现实中&#xff0c;孩子往往会出现厌学情绪&#xff0c;作为家长为此感到非常困扰。如何帮助孩子克服厌学情绪&#xff0c;九州金榜家庭教育将会带大家找出背后的原因&#xff0c;并寻找有效…

Tortoise-tts Better speech synthesis through scaling——TTS论文阅读

笔记地址&#xff1a;https://flowus.cn/share/a79f6286-b48f-42be-8425-2b5d0880c648 【FlowUs 息流】tortoise 论文地址&#xff1a; Better speech synthesis through scaling Abstract: 自回归变换器和DDPM&#xff1a;自回归变换器&#xff08;autoregressive transfo…

SpringSecurity(15)——OAuth2密码模式

工作流程 将用户和密码传过去&#xff0c;直接获取access_token&#xff0c;用户同意授权动作是在第三方应用上完成&#xff0c;而不是在认证服务器&#xff0c;第三方应用申请令牌时&#xff0c;直接带用户名和密码去向认证服务器申请令牌。这种方式认证服务器无法判断用户是…

网站服务器中毒或是被入侵该怎么办?

随着互联网的普及和发展&#xff0c;网站服务器已经成为了企业和个人存储数据、展示信息的重要平台。然而&#xff0c;网络安全问题也日益突出&#xff0c;其中网站服务器中毒或被入侵的事件时有发生。一旦发生这种情况&#xff0c;不仅会导致网站无法正常运行&#xff0c;还可…