热门标签 | 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类


推荐阅读
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • 本文介绍了如何使用 Gesture Detector 和 overridePendingTransition 方法来实现滑动界面和过渡动画。 ... [详细]
  • MyBatisCodeHelperPro 2.9.3 最新在线免费激活方法
    MyBatisCodeHelperPro 2.9.3 是一款强大的代码生成工具,适用于多种开发环境。本文将介绍如何在线免费激活该工具,帮助开发者提高工作效率。 ... [详细]
  • iOS 百度地图使用指南:基本定位与地理编码
    本文详细介绍如何在 iOS 应用中集成百度地图,实现基本的地图定位和地理编码功能。配置详情请参考官方文档:http://developer.baidu.com/map/index.php?title=iossdk ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 在移动端开发中,多点触控手势是提升用户体验的重要手段。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。 ... [详细]
  • Java 中的控制流与作用域
    本文详细介绍了 Java 中的控制流语句,包括块作用域、if 语句、for 循环、while 循环、do-while 循环、switch 语句以及 break 和 continue 语句的使用方法。通过具体的代码示例,帮助读者更好地理解和应用这些控制流结构。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 如何使用strip()方法去除字符串首尾的空白字符
    本文介绍如何使用Python中的strip()方法来去除字符串首尾的空白字符,包括空格、制表符和换行符。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
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社区 版权所有