热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue使用高德地图api实现热力图动态缩放

Vue使用高德地图api实现热力图动态缩放前言1.引入高德js2.显示基本的热力图3.显示优化4.Vue页面完整代码前言项目需要,根据积水数据的多少,


Vue使用高德地图api实现热力图动态缩放

  • 前言
  • 1.引入高德js
  • 2.显示基本的热力图
  • 3.显示优化
  • 4.Vue页面完整代码


前言

项目需要,根据积水数据的多少,在页面中进行展示,选用高德热力图api。实现后发现地图的缩放会导致热力图自动更改渲染的颜色,导致预期的效果发生变化,研究文档后实现了动态调整热力图的渲染,保证在不同缩放等级的地图下都能展示预期效果

使用vue ui命令构建项目,vue版本为2.x,使用axios读取本地积水数据,
axios安装命令为npm install axios --save
完整代码先看最后


1.引入高德js

在public目录下的index.html页面中引用脚本和css样式

<script src&#61;"https://webapi.amap.com/maps?v&#61;1.4.15&key&#61;你申请的key值">script>
<link rel&#61;"stylesheet" href&#61;"https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />

2.显示基本的热力图

显示底图&#xff1a;

loadMap() {this.map &#61; new AMap.Map("container", {resizeEnable: true,center: [108.909759, 34.412745],zoom: 12,});
}

这里有个小地方需要注意&#xff0c;如果不指定宽高&#xff0c;那么地图无法显示
我的做法是先指定父级节点的宽高&#xff0c;再指定本页面的宽高
父级节点在App.vue中
在这里插入图片描述

添加热力图&#xff1a;

createHeatMap2() {
let _this &#61; this; //保存vue实例,保证this作用域一致
let api &#61; "/js/result_half.json";
axios.get(api).then((res) &#61;> {let data &#61; res.data;console.log(tempdata);_this.map.plugin(["AMap.Heatmap"], function () {//初始化heatmap对象_this.heatmap &#61; new AMap.Heatmap(_this.map, {radius: 0.9, //每个热力点的大小opacity: [0.2, 0.8], //最小透明度和最大透明度&#xff0c;最小透明度越小&#xff0c;数值小的点就越不明显&#xff1b;最大透明度越大&#xff0c;数值大的点就越明显blur: 0.5, //一个点外圈和内圈的大小比例&#xff0c;值越大&#xff0c;内圈占的比例就越大&#xff1b;值越小&#xff0c;外圈占的比例就越大gradient: {//同 min参数以及 max参数一起生效&#xff0c;比如积水数值在[0.02,0.4]之间时&#xff0c;//gradient定义了某一个积水数值在这个区间的不同位置时显示什么颜色&#xff0c;如果计算出来不相等&#xff0c;就取两者之间的颜色0.25: _this.level1,0.5: _this.level2,0.75: _this.level3,0.8: _this.level4,1: _this.level5,},});//设置数据集_this.heatmap.setDataSet({data: data,max: 0.5,min: 0.1,});});
});
},

其中&#xff0c;result_half.json文件存在于本地&#xff0c;为了符合高德api&#xff0c;格式需要如下

[{"lng":xxx,"lat":xxx,"count":xxx},{"lng":xxx,"lat":xxx,"count":xxx},
]

效果&#xff1a;
在这里插入图片描述此处存在问题&#xff0c;上图的地图缩放等级为12&#xff0c;当放大后原本应该为红色区域&#xff08;积水数值较大&#xff09;的地方效果会淡化&#xff0c;如下&#xff1a;
在这里插入图片描述
这里是由于heatmap.js本身的计算导致&#xff0c;因此需要一个方法来解决


3.显示优化

热力图的radius属性可以指定热力点的半径大小&#xff0c;根据高德api文档&#xff0c;只需要绑定一个地图缩放事件&#xff0c;当地图放大缩小时&#xff0c;调整热力点的大小&#xff0c;保证显示效果的一致

addHeatMapEvent() {let _this&#61;this;_this.map.on("zoomchange", function (e) {let newRadius;let zoomLevel &#61; _this.map.getZoom();if (zoomLevel <&#61; 12) {newRadius &#61; 0.9;} else if (zoomLevel &#61;&#61; 13) {newRadius &#61; 1;} else if (zoomLevel &#61;&#61; 14) {newRadius &#61; 2;} else if (zoomLevel &#61;&#61; 15) {newRadius &#61; 3.5;} else if (zoomLevel &#61;&#61; 16) {newRadius &#61; 7;} else {newRadius &#61; 15;}_this.heatmap.setOptions({radius: newRadius,});});
},

由于高德的地图缩放等级并不多&#xff0c;这里一般用到的是12-17级&#xff0c;所以可以直接写死&#xff0c;热力点具体的半径大小需要根据显示效果慢慢调整&#xff0c;地图放得越大&#xff0c;半径就调整得越大。加入该方法后&#xff0c;显示效果如下&#xff1a;
在这里插入图片描述在这里插入图片描述在这里插入图片描述
问题解决


4.Vue页面完整代码

<template><div id&#61;"container"></div>
</template><script>
export default {mounted() {this.loadMap();this.createHeatMap2();this.addHeatMapEvent();},data() {return {map: null,heatmap: null,level1: "#BFEFFF",level2: "#00BFFF",level3: "yellow",level4: "#FFA500",level5: "red",};},methods: {//加载地图loadMap() {this.map &#61; new AMap.Map("container", {resizeEnable: true,center: [108.909759, 34.412745],zoom: 12,});},//添加热力图createHeatMap2() {let _this &#61; this; //保存vue实例,保证this作用域一致let api &#61; "/js/result_half.json";axios.get(api).then((res) &#61;> {let data &#61; res.data;// console.log(tempdata);_this.map.plugin(["AMap.Heatmap"], function () {//初始化heatmap对象_this.heatmap &#61; new AMap.Heatmap(_this.map, {radius: 0.9, //每个热力点的大小opacity: [0.2, 0.8], //最小透明度和最大透明度&#xff0c;最小透明度越小&#xff0c;数值小的点就越不明显&#xff1b;最大透明度越大&#xff0c;数值大的点就越明显blur: 0.5, //一个点外圈和内圈的大小比例&#xff0c;值越大&#xff0c;内圈占的比例就越大&#xff1b;值越小&#xff0c;外圈占的比例就越大gradient: {//同 min参数以及 max参数一起生效&#xff0c;比如积水数值在[0.02,0.4]之间时&#xff0c;//gradient定义了某一个积水数值在这个区间的不同位置时显示什么颜色&#xff0c;如果计算出来不相等&#xff0c;就取两者之间的颜色0.25: _this.level1,0.5: _this.level2,0.75: _this.level3,0.8: _this.level4,1: _this.level5,},});//设置数据集_this.heatmap.setDataSet({data: data,max: 0.5,min: 0.1,});});});},//根据缩放等级调整热力点大小addHeatMapEvent() {let _this&#61;this;_this.map.on("zoomchange", function (e) {// var oldRadius &#61; heatmap.getOptions()[&#39;radius&#39;];let newRadius;let zoomLevel &#61; _this.map.getZoom();if (zoomLevel <&#61; 12) {newRadius &#61; 0.9;} else if (zoomLevel &#61;&#61; 13) {newRadius &#61; 1;} else if (zoomLevel &#61;&#61; 14) {newRadius &#61; 2;} else if (zoomLevel &#61;&#61; 15) {newRadius &#61; 3.5;} else if (zoomLevel &#61;&#61; 16) {newRadius &#61; 7;} else {newRadius &#61; 15;}_this.heatmap.setOptions({radius: newRadius,});});},},
};
</script><style scoped>
html,
body,
#container {margin: 0;padding: 0;height: 100%;width: 100%;
}
</style>

参考&#xff1a;

  • 高德热力图示例
  • 高德热力图插件文档
  • vue使用高德热力图
  • 高德api map类


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
nashiyizhiyu_847_695
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有