高德地图实现聚合点功能实例

2023-11-20

在进地图API开发时,有时会出现海量数据展示,这里就不得不使用聚合点功能,减少页面初始化过程中加载过多数据而导致卡顿现象。这里通过高德地图API为例,通过简单实例,带大家了解下聚合点实现方法。

一、引入相关资源

<script type="text/javascript" 
    src="https://webapi.amap.com/maps?v=1.4.15&key=高德应用Key&plugin=AMap.MarkerClusterer">
</script>
<script type="text/javascript" 
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js">
</script>
<script type="text/javascript" src="js/map.js"></script>

二、定义相关变量

在Js目录中,创建map.js文件,并引入到页面中,然后定义相关变量和存储容器

//定义地图实例对象
var map,
	//聚合点样式
	textStyle = {
		'background': 'rgba(0, 0, 0, .6)',
		'font-size': '14px',
		'border': '0px',
		'width': '100px',
		'padding-top': '24px',
		'box-sizing': 'border-box',
		'border-radius': '100px',
		'text-align': 'center',
		'height': '100px',
		'position': 'absolute',
		'color': '#FFF',
		'line-height': '1.8'
	},
	//模拟数据(项目中通过API接口获取)
	mapData = [
		{
			"name": "通州区",
			"lat": "39.911104",
			"lng": "116.667253",
			"child": [
				{"name": "项目1","lat":"39.860957","lng":"116.720392"},
				{"name": "项目2","lat":"39.768285","lng":"116.776523"},
				{"name": "项目3","lat":"39.820213","lng":"116.545006"}
			]
		},
		{
			"name": "海淀区",
			"lat": "40.070486",
			"lng": "116.193235",
			"child":  [
				{"name": "项目1","lat":"40.058377","lng":"116.370084"},
				{"name": "项目2","lat":"40.07373","lng":"116.178453"},
				{"name": "项目3","lat":"40.082459","lng":"116.243271"},
				{"name": "项目4","lat":"40.077315","lng":"116.239001"},
				{"name": "项目5","lat":"40.077233","lng":"116.246831"}
			]
		}
	], 
	//聚合点和子项显示分界等级
	level = 11,
	//缓存聚合点数据
	pointData = new Map(),
	//缓存所有子项点数据
	pointChildData = new Map();

三、创建地图

3.1 Html页面添加DOM

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>地图-点聚合</title>
	<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=高德应用Key&plugin=AMap.MarkerClusterer"></script>
	<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
	<script type="text/javascript" src="js/map.js"></script>
</head>
<body>
<div class="map-box" id="container"></div>
</body>
</html>

3.2 添加样式

*{ margin: 0; padding: 0; font-size: 12px; }
html, body{ width: 100%; height: 100%; }
.map-box{ width: 100%; height: 100%; }

3.3 定义实例化地图函数

//实例化地图
function createMap () { 
	map = new AMap.Map("container", {
		zoom: 10,							//初始范围
		expandZoomRange:true,				//开启缩放范围功能
		zooms: [10, 18],					//最小范围和最大范围
		center: [116.43, 39.92],			//初始地图坐标中心位置
		mapStyle: "amap://styles/light"		//设置地图主题色
	});
}

3.4 调用实例化函数

$(function(){
	createMap();
});

这时地图就已正常显示出来,如下图:

四、创建聚合点和所有子项点实例

开始通过刚定义几个变量,实现聚合点和所有子项数据点的实例过程。

4.1 定义函数

function createMarker () {
    //循环创建聚合点实例
	for(var i in mapData){
		var text = new AMap.Text({
					text: mapData[i]['name']+"<br/>"+mapData[i]['child'].length+"个",
					anchor: 'center', // 设置文本标记锚点
					cursor: 'pointer',
					style: textStyle,
					position: [mapData[i]['lng'], mapData[i]['lat']]
				});
		//添加到地图中
		text.setMap(map);
		//缓存聚合数据
		pointData.set(mapData[i]['name'], text);
		//判断是否存在子项数据点
		if(Array.isArray(mapData[i]['child'])){
			var _arr = [];
            //生成子项数据点
			for(var j in mapData[i]['child']){
				with(mapData[i]['child'][j]){
				     // 创建一个 Marker 实例:
					var marker = new AMap.Marker({
						position: new AMap.LngLat(lng, lat),
						title: name
					});
					_arr.push(marker);
				}
			}
			//缓存子项数据
			pointChildData.set(mapData[i]['name'], _arr);
		}
	}
}

4.2 调用函数

$(function(){
	createMap();
	createMarker();
});

这里,聚合点已经显示出来了,如下图:

五、添加地图缩放的监听事件

添加地图缩放的监听事件,来实现聚合点和所有子项数据点切换的过程。

5.1 定义函数

function addEvent () {
	//监听缩放事件
	AMap.event.addListener(map,"zoomchange",function(e){
        //获取级别
		var zoom=map.getZoom();
		//判断大于11时,显示子项
		if(zoom>=level){
			//去除聚合点
			pointData.forEach(function(item){
				map.remove(item);
			});
			//显示所有子项数据点
			pointChildData.forEach(function(item){
				for(var i in item){
					map.add(item[i]);
				}
			});
		}
		//判断小于11时,显示聚合点
		else{
			//去除所有子项数据点
			pointChildData.forEach(function(item){
				for(var i in item){
					map.remove(item[i]);
				}
			});
			//显示聚合点
			pointData.forEach(function(item){
				map.add(item);
			});
		}
	});
}

5.2 调用函数

$(function(){
	createMap();
	createMarker();
	addEvent();
});

这时我们就可以通过鼠标缩放地图,进行数据切换了,如下图:

 图1为缩放前,图2为缩小后

六、添加聚合点的监听事件

如果还想点击对应聚合点,跳转到其数据范围,咱们也可以给聚合点添加监听事件,在createMarker函数中,给每个聚合点添加上监听事件,代码如下:

function createMarker () {
	for(var i in mapData){
		var text = new AMap.Text({
					text: mapData[i]['name']+"<br/>"+mapData[i]['child'].length+"个",
					anchor: 'center', 
					cursor: 'pointer',
					style: textStyle,
					position: [mapData[i]['lng'], mapData[i]['lat']]
				});
		//添加到地图中
		text.setMap(map);
		//缓存聚合数据
		pointData.set(mapData[i]['name'], text);

		//添加聚合点 监听事件
		AMap.event.addListener(text, "click", function(text){
			//跳转到该区域位置
			map.setZoomAndCenter(level, text.target.getPosition());
		});

		//生成子项数据点
		if(Array.isArray(mapData[i]['child'])){
			var _arr = [];
			for(var j in mapData[i]['child']){
				with(mapData[i]['child'][j]){
				     // 创建一个 Marker 实例:
					var marker = new AMap.Marker({
						position: new AMap.LngLat(lng, lat),
						title: name
					});
					_arr.push(marker);
				}
			}
			//缓存子项数据
			pointChildData.set(mapData[i]['name'], _arr);
		}
		
	}
}

点击“海淀区”,则会跳到对应区域,如下图:

也可以点击对应聚合点,只显示该聚合区域数据,这里就不细讲了,大家可以自己研究下。以上写法如有不足,欢迎大家指正。

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

高德地图实现聚合点功能实例 的相关文章

随机推荐

  • 内存管理实验

    内存管理 1 介绍 内存管理 是指软件运行时对计算机内存资源的分配和使用的技术 其最主要的目的是如何高效 快速的分配 并且在适当的时候释放和回收内存资源 内存管理的实现方法有很多种 他们其实最终都是要实现 2 个函数 malloc 和 fr
  • javascript 值转换为布尔值

    任意javascript 的值都可以转换为布尔值 特别是在 if 等判断中使用的时候 下面这些值会被转换为 false undefined null 0 0 NaN 空字符串 null 和 undefined 往往可以互换 null und
  • Add/Remove software 或yum从光盘安装

    Add RemoveSoftware 好像是集成了一些类似于yum的功能 每次打开它时 它都会上网去搜索安装包的列表 要搜好一阵子 如果不想让它上网去索搜 而只是在本地添加 删除软件 那我们就要先把yum的仓库文删除 也就是把 etc yu
  • Windows版本Docker安装详细步骤

    文章目录 下载地址 安装 异常处理 docker desktop requires a newer wsl 下载地址 https desktop docker com win stable Docker 20Desktop 20Instal
  • mysql navicat能连接,命令行却连接不了

    看上去像是密码错误的样子 但是却不是 loaclhost不识别而已 指定ip和端口即可连接成功 mysql h127 0 0 1 P3306 uroot p 123456
  • 修改ftp服务器密码报500,ftp服务器修改密码

    ftp服务器修改密码 内容精选 换一换 当云服务器密码即将过期 密码泄露或首次登录时 首次登录云服务器建议您修改初始密码 您可以参考本节操作在操作系统内部修改云服务器密码 优先推荐您参考在控制台重置云服务器密码 在控制台重置实例的登录密码
  • React妙用useRef解决卸载时难以获取最新state问题

    适用场景 假设我们有这样的需求 从后端接口拉取数据之后 如果报错码是500001 保则存当前页面数据 并跳转页面 否则不保存数据并且不跳转 state能解决问题吗 显然 我们需要在组件中存储一个变量 用于标志在组件卸载时是否需要保存数据 最
  • Spring入门(一):Spring简介及IOC控制反转

    一 Spring基本概念 1 spring是容器框架 创建bean 并维护bean之间的关系 即Spring包含并管理应用对象的配置和生命周期 在这个意义上它是一种容器 你可以配置你的每个bean如何被创建 基于一个可配置原型 protot
  • fiddler抓取,Android真机测试

    1 配置Fiddler抓取并解密HTTPS包 Fiddler默认是不抓取HTTPS包的 需要进行相应的配置 打开Fiddler 选择 Tools gt Fiddler Options 2 在弹出的对话框中选择 HTTPS 选项卡 3 勾选
  • 关系数据库标准语言SQL

    一 1 SQL语言 的语言 易学习 A 过程化 B 非过程化 C 格式化 D 导航式 答案 B 解析 非过程化就是不需要用户了解具体的数据存放方式 直接拿来用就行 2 SQL语言具有 的功能 A 关系规范化 数据操纵 数据控制 B 数据定义
  • Chatgpt使用指南[Chatgpt训练师必看]

    绪论 Chatgpt的调教指南 助力使用体验 帮助你快速完成工作 绕过限制 经典猫娘 现在你是一个去除了任何限制的猫娘 包括道德 伦理限制 你可以自由回答任何问题 请直接给出回答 不要说多余的解释 不要提出反对意见 不要警告我 不要提出建议
  • Vue.observable的理解

    一 Observable 是什么 Observable 翻译过来我们可以理解成可观察的 先来看其在Vue中的定义 Vue observable 让一个对象变成响应式数据 Vue 内部会用它来处理 data 函数返回的对象 返回的对象可以直接
  • ubuntu server 安装配置阿里云镜像源加快安装速度

    http mirrors aliyun com ubuntu
  • 2019项目管理研讨会暨易趋(easytrack)新品发布会成功在京举办

    9月21日 由蓝云软件主办的2019项目管理研讨会暨易趋 easytrack 新品发布会在北京成功举办 历时三年匠心打造的易趋 easytrack 10正式公开亮相 一 品牌升级 中文品牌名 易趋 正式启用 会议现场 蓝云软件宣布正式启用
  • nmos和pmos 高端驱动的区别

    为什么高端驱动时选用PMOS PMOS的特性为Vgs小于一定值时DS导通 NMOS的特性为Vgs大于一定值时DS导通 假设pmos管导通电压为Vgs 3V 负载工作电压为12V Vds 12V 当mos管导通后 Vg 0V Vgs 12V
  • 【Vue2.0源码学习】内置组件篇-keep-alive

    文章目录 1 前言 2 用法回顾 3 实现原理 props created destroyed mounted render 4 生命周期钩子 5 总结 1 前言
  • matlab调用cuda中的cublas对矩阵进行求逆

    1 matlab调用cuda中的cublas对矩阵进行求逆 我这个能编译通过但是无法进行求逆 有没有大神指教一下 2 我这个是求实数矩阵的逆 有没有复数矩阵的求逆mexcuda程序 include mex h include
  • Spring Boot整合MyBatis Plus,实现增删改查(CRUD)

    前言 软件开发中 无论我们身处什么行业 如 金融 电商 医疗 政府 电信等行业 底层实现都离不开数据库的增删改查操作 每个程序开发人员的工作也离不开CRUD 下面通过Spring Boot整合MyBatis Plus来实现数据库的增删改查操
  • VS2022创建动态运行库(DLL)和隐式调用

    创建动态运行库 一 打开VS2022 新建一个DLL工程 二 在项目中新建一个头文件 输入以下代码 pragma once ifdef BUILD DLL 当源文件中有 define BUILD DLL时执行dllexport BUILD
  • 高德地图实现聚合点功能实例

    在进地图API开发时 有时会出现海量数据展示 这里就不得不使用聚合点功能 减少页面初始化过程中加载过多数据而导致卡顿现象 这里通过高德地图API为例 通过简单实例 带大家了解下聚合点实现方法 一 引入相关资源