Vue+高德地图api

2023-11-05


前言

项目使用了高德地图进行开发,记录一下demo和使用中遇到的一些问题。想使用百度地图可以查看另一篇文章Vue+百度地图api


一、准备工作

1.申请应用

首先去官网申请密钥高德控制台

2.引入

在public index.html引入,注意密钥的设置一定要在地图之前,本文基于2.0版本。

<script>
  window._AMapSecurityConfig = {
    securityJsCode: '您申请的安全密钥',
  }
</script>
<script src="https://webapi.amap.com/maps?v=2.0&key=您申请的key值"></script>

config.js配置文件中

externals: {
  "AMap": "AMap"
},

3.创建地图

创建一个div当作容器,然后写一个初始化的方法即可

<template>
  <div class="map" id="map-center" ref="map-center"></div>
</template>

<script>
import AMap from "AMap";
export default {
  name: "map-center",
  data() {
    return {
      map: null,
    };
  },
  mounted() {
    this.initMap();
  },
  methods: {
    initMap() {
      this.map = new AMap.Map("map-center", {
      	// 3D或2D
      	viewMode: "2D",
        resizeEnable: true, //自适应大小
        zoom: 12, //设置地图显示的缩放级别
        center: [104.066301, 30.572961], //设置地图中心点坐标
      });
    },
  },
};
</script>

<style scoped>
.map {
  height: 800px;
  width: 100%;
}
</style>

以下所有案例都是以上述代码为基础
在这里插入图片描述

二、使用高德地图

1.覆盖物

(1) 点标记

最简单的使用

<script>
export default {
	data() {
		return {
			map: null,
			marker: null,
		}
	},
	methods: {
		// 添加点标记
		addMarker() {
			this.marker = new AMap.Marker({
				position: [104.066301, 30.572961], // 坐标
			});
			this.map.add(this.marker);
		},
		//删除点标记
		delMarker() {
			this.map.remove(this.marker);
		},
	},
}
</script>

在这里插入图片描述

也可以自定义点的图标样式

addMarker() {
	// 创建 AMap.Icon 实例:
	let icon = new AMap.Icon({
	  size: new AMap.Size(50, 50), // 图标尺寸
	  image: "http://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png", // Icon的图像
	  imageOffset: new AMap.Pixel(0, 0), // 图像相对展示区域的偏移量,适于雪碧图等
	  imageSize: new AMap.Size(0, 0), // 根据所设置的大小拉伸或压缩图片
	});
	// 将 Icon 实例添加到 marker 上:
	this.marker = new AMap.Marker({
	  position: new AMap.LngLat(104.066301, 30.572961),
	  offset: new AMap.Pixel(-10, -10),
	  icon: icon, // 添加 Icon 实例
	  title: "这是一个点",
	  zoom: 13,
	});
	this.map.add(this.marker);
},

在这里插入图片描述

(2) 海量点标记

如果要展示的点位过多,地图上渲染会很慢,这时候使用点聚合可以很好解决问题。
首先要引入MarkerCluster,两种方式
直接在引入地图的js链接后面跟上参数,就可以直接使用。注:所有的插件都可以用这两种方式引入

<script src="https://webapi.amap.com/maps?v=2.0&key=您申请的key值&plugin=AMap.MarkerCluster"></script>

或者

this.map.plugin(["AMap.MarkerCluster"], () => {
	// 业务代码
})
<script>
export default {
	data() {
    	return {
    		map: null,
    		markerCluster : null,
    	}
    },
    methods: {
    	addMarkerCluster() {
			/**
			 * 【经纬度】lnglat 为必填字段;
			 * 【权重】weight 为可选字段,聚合时以权重高的点为中心进行聚合
			 * 也可以自定义一些数据,如id
			 */
			let points = [
				{
					weight: 8,
					lnglat: [104.062374, 30.578265],
					id: 1,
				},
				{
					weight: 1,
					lnglat: [104.064091, 30.577157],
					id: 2,
				},
				{
					weight: 1,
					lnglat: [104.063919, 30.575679],
					id: 3,
				},
				{
					weight: 1,
					lnglat: [104.062889, 30.574866],
					id: 4,
				},
				{
					weight: 1,
					lnglat: [104.063748, 30.576418],
					id: 5,
				},
				{
					weight: 1,
					lnglat: [104.065292, 30.576639],
					id: 6,
				},
				{
					weight: 1,
					lnglat: [104.063404, 30.575901],
					id: 7,
				},
				{
					weight: 1,
					lnglat: [104.062546, 30.576085],
					id: 8,
				},
				{
					weight: 1,
					lnglat: [104.06349, 30.577489],
					id: 9,
				},
			];
			this.map.plugin(["AMap.MarkerCluster"], () => {
				this.markerCluster = new AMap.MarkerCluster(this.map, points, {
					// 聚合网格像素大小
					gridSize: 50,
				});
				// 绑定点击事件
				this.markerCluster.on("click", (res) => {
					// 点击聚合点的时候也会触发事件,所以为了确保点击的是某一个点,做了判断
					if (res.cluster.m.length === 1) {
						console.log(res.cluster.m[0].id);
					}
				});
			});
		},
		// 删除点聚合
	    delMarkerCluster() {
	    	// 两个方法可以删除,选择一种即可
	    	// 相当于把点聚合的坐标集给清空
			this.markerCluster.setData(null);
			// 相当于把地图上展示的点聚合清除
			this.markerCluster.setMap(null);
      		this.markerCluster= null;
		},
    },
}
</script>

(3) 轨迹回放

<script>
export default {
	data() {
		return {
			map: null,
			// 轨迹数据
			lineArr: [
				[104.054573, 30.582289],
				[104.057577, 30.582326],
				[104.06013, 30.582381],
				[104.0641, 30.582455],
				[104.06425, 30.580386],
				[104.064207, 30.575602],
				[104.059959, 30.575343],
				[104.054744, 30.575251],
			]
		}
	},
	methods: {
		// 添加轨迹
		addTrack() {
			// 用折线绘制轨迹
			this.polyline = new AMap.Polyline({
				map: this.map,
				path: this.lineArr,
				// 添加dirImg可以自定义路线的箭头,支持Image和Canvas
				showDir: true,
				dirImg:'https://a.amap.com/jsapi_demos/static/images/mass0.png',
				strokeColor: "#28F", //线颜色
				strokeOpacity: 1,     //线透明度
				strokeWeight: 6, //线宽
				strokeStyle: "solid"  //线样式
			});
			// 创建了一个车辆的点用于运动
			this.startMarker = new AMap.Marker({
				map: this.map,
				size: new AMap.Size(50, 52),
				// 第一个点为起点
				position: this.lineArr[0],
				icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
				offset: new AMap.Pixel(-35, -20),
			});
		},
		// 删除轨迹
		delTrack() {
			// 起点删除
			if (this.startMarker) {
				this.startMarker.remove();
				this.startMarker = null;
			}
			// 折线删除
			if (this.polyline) {
				this.polyline.setMap(null);
				this.polyline = null;
			}
			// 走过的折线删除
			if (this.passedPolyline) {
				this.passedPolyline.setMap(null);
				this.passedPolyline = null;
			}
		},
		// 开始运动
		startAnimation() {
			// 加载插件MoveAnimation
			AMap.plugin("AMap.MoveAnimation", () => {
				// 运动过的轨迹样式
				this.passedPolyline = new AMap.Polyline({
					map: this.map,
					strokeColor: "#AF5", //线颜色
					strokeWeight: 6, //线宽
				});
				// 绑定运动事件
				this.startMarker.on("moving", (e) => {
					this.passedPolyline.setPath(e.passedPath);
					this.map.setCenter(e.target.getPosition(), true);
				});
				// 开始运动
				this.startMarker.moveAlong(this.lineArr, {
					// 每段动画持续时长, 单位:ms
					duration: 500,
					// 覆盖物是否沿路径旋转
					autoRotation: true,
				});
			});
		},
		// 暂停运动
		pauseAnimation() {
			this.startMarker.pauseMove();
		},
		// 继续运动
		resumeAnimation() {
			this.startMarker.resumeMove();
		},
		// 停止运动
		stopAnimation() {
			this.startMarker.stopMove();
		},
	},
}
</script>

在这里插入图片描述

2.矢量图形

(1) 多边形

可以使用这个来当作网格

<script>
export default {
	data() {
		return {
			map: null,
			polygon: null
		}
	},
	methods: {
		// 添加多边形
		addPolygon() {
			// 使用一些坐标假数据,一般是从后端获取,这里添加了两个多边形
			let data = [
				[
					[
						[104.060169, 30.571391],
						[104.065534, 30.571483],
						[104.06592, 30.56607],
						[104.060384, 30.566162],
					],
				],
				[
					[
						[104.065987, 30.569562],
						[104.067682, 30.569571],
						[104.067489, 30.569007],
						[104.067714, 30.568305],
						[104.066126, 30.568305],
					],
				],
			];
			// 创建实例,用一个全局变量接收,方便调用其他方法
			this.polygon = new AMap.Polygon({
				// 坐标集
				path: data,
				// 多边形填充颜色,使用16进制颜色代码赋值
				fillColor: "#ccebc5",
				// 轮廓线透明度,取值范围 [0,1] ,0表示完全透明,1表示不透明
				strokeOpacity: 1,
				// 多边形填充透明度,取值范围 [0,1] ,0表示完全透明,1表示不透明
				fillOpacity: 0.5,
				// 线条颜色,使用16进制颜色代码赋值
				strokeColor: "#2b8cbe",
				// 轮廓线宽度
				strokeWeight: 1,
				// 轮廓线样式,实线:solid,虚线:dashed
				strokeStyle: "solid",
				// 虚线和间隙的样式,此属性在strokeStyle 为dashed 时有效
				strokeDasharray: [5, 5],
				// 鼠标悬停的样式
				cursor: "pointer",
			});
			// 绑定鼠标移上事件
			this.polygon.on("mouseover", () => {
				this.polygon.setOptions({
				  fillOpacity: 0.7,
				  fillColor: "#7bccc4",
				});
			});
			// 绑定鼠标移出事件
			this.polygon.on("mouseout", () => {
				this.polygon.setOptions({
				  fillOpacity: 0.5,
				  fillColor: "#ccebc5",
				});
			});
			// 把多边形放入地图上
			this.map.add(this.polygon);
		},
		// 隐藏
		hidePolygon() {
			this.polygon.hide();
		},
		// 显示
		showPolygon() {
			this.polygon.show();
		},
		// 销毁
		destroyPolygon() {
			this.polygon.destroy();
		}
	},
}
</script>

效果
在这里插入图片描述

3.图层

(1) 热力图

使用插件AMap.HeatMap

<script>
export default {
	data() {
		return {
			map: null,
			heatmap: null,
		}
	},
	methods: {
		// 添加热力图
		addHeatmap() {
			this.map.plugin(["AMap.HeatMap"], () => {
				// 初始化heatmap对象
				this.heatmap = new AMap.HeatMap(this.map, {
					// 热力图中单个点的半径
					radius: 25,
					// 热力图的透明度,取值范围[0,1],0表示完全透明,1表示不透明
					opacity: [0, 0.8],
					// 热力图的渐变区间, 其中 key 表示插值的位置, 0-1,value 为颜色值
					gradient: {
						0.5: "blue",
						0.65: "rgb(117,211,248)",
						0.7: "rgb(0, 255, 0)",
						0.9: "#ffea00",
						1.0: "red",
					},
				});
			});
			// lng经度,lat纬度,count权重
			let heatmapData = [
				{
					lng: 104.066301,
					lat: 30.572961,
					count: 12,
				},
				{
					lng: 104.066301,
					lat: 30.573113,
					count: 10,
				},
				{
					lng: 104.065437,
					lat: 30.574296,
					count: 9,
				},
				{
					lng: 104.067776,
					lat: 30.572153,
					count: 5,
				},
				{
					lng: 104.067261,
					lat: 30.57509,
					count: 11,
				},
				{
					lng: 104.061704,
					lat: 30.57424,
					count: 8,
				},
				{
					lng: 104.066017,
					lat: 30.571321,
					count: 15,
				},
			];
			// 设置数据
			this.heatmap.setDataSet({
				// 坐标数据集
				data: heatmapData,
				// 权重最大值,不填则取数据集count最大值
				max: 20,
			});
		},
		// 删除
		delHeatmap() {
	    	this.heatmap.setMap(null);
	    },
		// 显示
		showHeatmap() {
			this.heatmap.show();
		},
		// 隐藏
		hideHeatmap() {
			this.heatmap.hide();
		},
	},
}
</script>

在这里插入图片描述

(2) Canvas图层

<script>
export default {
	data() {
		return {
			context: null,
	    	canvasLayer: null,
	    	radious: 0,
		}
	},
	methods: {
		addCanvas() {
			/*
			* 添加Canvas图层
			*/
			let canvas = document.createElement("canvas");
			canvas.width = canvas.height = 200;
			this.canvasLayer = new AMap.CanvasLayer({
				canvas: canvas,
				bounds: new AMap.Bounds(
					[104.07368741587149, 30.579319946772618],
					[104.05891555268354, 30.566601636273084]
				),
				zooms: [3, 18],
			});
			this.canvasLayer.setMap(this.map);
			
			let context = canvas.getContext("2d");
			context.fillStyle = "rgb(0,100,255)";
			context.strokeStyle = "white";
			context.globalAlpha = 1;
			context.lineWidth = 2;
			this.context = context;
			this.draw();
		},
		draw() {
			let context = this.context;
			context.clearRect(0, 0, 200, 200);
			context.globalAlpha = (context.globalAlpha - 0.01 + 1) % 1;
			this.radious = (this.radious + 1) % 100;
			
			context.beginPath();
			context.arc(100, 100, this.radious, 0, 2 * Math.PI);
			context.fill();
			context.stroke();
			// 使用3D地图时需要调用
			// this.CanvasLayer.reFresh();
			AMap.Util.requestAnimFrame(this.draw);
		},
	},
}
</script>

虽然实现了,但是速度异常的慢,这里留个坑,以后解决
在这里插入图片描述

4.坐标转换

有三种类型,gps,baidu,mapbar

var gps = [116.3, 39.9];
AMap.convertFrom(gps, type, (status, result) => {
	if (result.info === 'ok') {
	  var lnglats = result.locations;
	}
});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue+高德地图api 的相关文章

随机推荐

  • 【Altium Designer21】使用小技巧

    1 如何取消原理图的网格以及表头如下图 在Properties Visible Grid可以显示 隐藏网格 Title Block勾选上即显示表头 取消勾选即隐藏表头 图1 图2 图3 2 翻转的快捷键 空格 为90翻转 X 为水平翻转 Y
  • Eclipse 启动异常 找不到Java环境(A Java Runtime Environment....)

    点击启动Eclipse弹出异常消息 解决步骤 1 打开eclipse所在文件夹 2 用记事本打开配置文件 即下图的文件 3 找到java所在文件夹 4 复制路径并粘贴到记事本文件中 5 保存并重启Eclipse 大功告成
  • [算法]力扣刷题-动态规划 - 不同路径

    目录 题目 思路 编码 分析 修改 优化 题目 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同
  • Junit的基本使用(详解)

    什么是Junit Junit是xUnit的一个子集 在c paython java语言中测试框架的名字都不相同 xUnit是一套基于测试驱动开发的测试框架 其中的断言机制 将程序预期的结果与程序运行的最终结果进行比对 确保对结果的可预知性
  • Java代码质量检查工具及使用案例

    前言 在现在的软件开发中 由于软件的复杂度越来越高 业务也覆盖很广 各个业务模块业务错综复杂 这样就需要我们需要团队开发 在我们团队中开发人员的经验 代码风格样式都不一致 以及缺乏统一的标准 从而导致我们的整个项目的的代码难以阅读 不便于后
  • 顺序表实现图书管理系统增删改查

    顺序表学习 这个程序是用于学习数据结构而参考数据结构C语言第二版的教材实现的一个简易的图书管理系统 逻辑结构 顺序表 线性表的顺序存储又称作顺序表 由一组地址连续的存储单元依次存储线性表的数据元素 从而使得逻辑上相邻的两个元素在物理位置上也
  • 浅谈中断挂起与中断标志的区别

    中断挂起 如果中断发生时 正在处理同级或高优先级异常 或者被掩蔽 则中断不能立即得到响应 此时中断被悬起 悬挂意味着等待而不是舍去 当优先级高的或者同等级先发生的中断完成后 被挂起的中断才会执行 中断的悬起状态可以通过 中断设置悬起寄存器
  • STM32学习之ADC(模拟数字转换器)

    目录 ADC的定义及其类型 ADC 单通道独立规则模式 对于该模式的理解 通道及ADC分配 时钟配置 GPIO配置 ADC模式配置 校准 读取ADC 代码 野火的开源代码 由于大二学生一枚 水平有限 文中自己的理解难免出错 恳请道友发现后能
  • 【面试题】封装/继承/多态

    面向对象 C语言是面向过程的 关注的是过程 分析出求解问题的步骤 通过函数调用逐步解决问题 C 是基于面向对象的 关注的是对象 将一件事情拆分成不同对象 靠对象之间的交互完成 面向对象程序设计 Object oriented program
  • 算法帝国:华尔街交易怪兽的核武器缔造史

    这是一段通俗的读物 更是一段算法交易的历史钩沉 华尔街的每个角落逐渐被算法所侵蚀 思考者 依然还是拖着额头 但却不得不接受未来的现实 1980年华尔街的黑客生涯 天时地利 20世纪70年代末期 算法开始进入人们的工作 这一趋势席卷了世界各地
  • 小程序WXML,WXSS与原生HTML,CSS,JS之间的区别

    一 WXML 的概念以及和 HTML 之间的区别 1 什么是 WXML WXML WeiXin Markup Language 是框架设计的一套标签语言 组件 用来构建小程序页面的结构 其作用类似于网页开发中的 HTML 2 WXML 和
  • 项目上线后首次加载慢的解决方案

    1 使用路由懒加载 开发时尽量使用路由懒加载 component resolve gt require 放入需要加载的路由地址 resolve 2 使用gzip压缩 最高效 至少压缩一倍 npm install save dev compr
  • Open3D 点云快速欧式聚类(python详细过程版)

    目录 一 算法原理 1 论文概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 实验数据 一 算法原理 1 论文概述 从点云数据进行分割在许多应用中都是必不可少的 例如遥感 移动机器人或自动驾驶汽车 然而 三维距离传感器捕获的
  • 【论文笔记05】在智能合约中执行联合学习过程

    原文作者 A R Short H C Leligou and E Theocharis 原文标题 Execution of a Federated Learning process within a smart contract 原文链接
  • 一个带有楼中楼的评论系统数据库设置思路

    前言 有个需求 需要实现百度贴吧那样能评论帖子中某一楼的评论里的评论 分析 说起来有点拗口 其实这个评论系统分为4个部分 主题 楼主发布的帖子 直接返回楼主的评论 从帖 直接回复2的评论 直接回复3的评论 数据库 从上面的分析 我把数据库分
  • idea linux ssh乱码,idea--Preferences

    Font Font Monaco Size 16 Line spacing 1 3 Appearance Theme Darcula 勾选Use dark window headers 第三方主题 点击选择该主题 点击下载主题 下载文件是一
  • android webview 全屏100%显示图片

    这里引用 第三方类库 implementation org jsoup jsoup 1 10 2 定义工具类 HtmlUtils import org jsoup Jsoup import org jsoup nodes Document
  • C语言函数大全-- s 开头的函数(2)

    s 开头的函数 2 1 setlinestyle 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 setmem 2 1 函数说明 2 2 演示示例 3 setmode 3 1 函数说明 3 2 演示示例 3 3 运行结果 4 se
  • Origin6.0使用的一个坑

    今天在使用Origin6在画图时 遇到的一个软件问题 数据量大概在几万个 这些数据中仅有一个数为1 其他皆为0 但是绘制出的图片全是0 只有在放大后 这个数据1才绘制出来 不放大的话全是0 Origin这个绘制逻辑很坑 会误导使用者 一定要
  • Vue+高德地图api

    文章目录 前言 一 准备工作 1 申请应用 2 引入 3 创建地图 二 使用高德地图 1 覆盖物 1 点标记 2 海量点标记 3 轨迹回放 2 矢量图形 1 多边形 3 图层 1 热力图 2 Canvas图层 4 坐标转换 前言 项目使用了