uniapp中map使用点聚合渲染marker覆盖物

效果如图:

一、什么是点聚合

当地图上需要展示的标记点 marker 过多时,可能会导致界面上 marker 出现压盖,展示不全,并导致整体性能变差。针对此类问题,推出点聚合能力。
点聚合官网教程

二、基本用法

  • template
html 复制代码
<map id="map" :latitude="latitude" :longitude="longitude" :style="{ width: '100%', height: windowHeight + 'px' }" :scale="10">
  • onReady
js 复制代码
// 获取屏幕高度
		uni.getSystemInfo({
			success: (res) => {
				this.windowHeight = res.windowHeight;
			},
		});
		
		// 创建map对象
		this._mapContext = uni.createMapContext("map", this);
		this.cluster();
  • data
js 复制代码
			_mapContext: null,
			windowHeight: 0,
			latitude: 23.099994,
			longitude: 113.324520,
  • methods
js 复制代码
		// 点聚合
		cluster() {
			// 仅调用初始化,才会触发 on.("markerClusterCreate", (e) => {})
			this._mapContext.initMarkerCluster({
				enableDefaultStyle: false, // 是否使用默认样式
				zoomOnClick: true, // 点击聚合的点,是否改变地图的缩放级别
				gridSize: 60, // 聚合计算时网格的像素大小,默认60
				complete(res) {
					console.log('initMarkerCluster', res)
				}
			});

			this._mapContext.on("markerClusterCreate", (res) => {
				console.log("markerClusterCreate", res);
				const clusters = res.clusters
				const markers = clusters.map(cluster => {
					const {
						center,
						clusterId,
						markerIds
					} = cluster
					return {
						...center,
						width: 0,
						height: 0,
						clusterId, // 必须
						label: {
							content: markerIds.length + '',
							fontSize: 16,
							width: 50,
							height: 50,
							bgColor: '#00A3FA',
							borderRadius: 25,
							textAlign: 'center',
							anchorX: 0,
							anchorY: -20,
						}
					}
				})
				this._mapContext.addMarkers({
					markers,
					clear: false,
					complete(res) {
						console.log('clusterCreate addMarkers', res)
					}
				})
			});
			this._mapContext.on('markerClusterClick', (res) => {
				console.log('markerClusterClick', res)
			})
			this.addMarkers();
		},

		// 添加标记点
		addMarkers() {
			const positions = [
				{
					latitude: 23.099994,
					longitude: 113.324520,
				}, {
					latitude: 23.099994,
					longitude: 113.322520,
				}, {
					latitude: 23.099994,
					longitude: 113.326520,
				}, {
					latitude: 23.096994,
					longitude: 113.329520,
				}
			]

			const markers = []
			positions.forEach((p, i) => {
				markers.push(
					Object.assign({}, {
						id: i + 1,
						iconPath: "/static/images/map0.png",
						width: 28,
						height: 29,
						joinCluster: true, // 指定了该参数才会参与聚合
						callout:{
							bgColor: "#5AC2EB",
							color: "#fff",
							content: "客户名称",
							display: "ALWAYS",
							fontSize: "14",
							fontWeight: "bold",
							padding: 8,
							textAlign: "center"
						}
					}, p)
				)
			})
			console.log('markers', markers)
			this._mapContext.addMarkers({
				markers,
				clear: false,
				complete(res) {
					console.log('addMarkers', res)
				}
			})
		},

三、踩坑总结

1. 调用initMarkerCluster方法,否则不生效

js 复制代码
			// 创建map对象
			this._mapContext = uni.createMapContext("map", this);
			// 仅调用初始化,才会触发 on.("markerClusterCreate", (e) => {})
			this._mapContext.initMarkerCluster({
				enableDefaultStyle: false, // 是否使用默认样式
				zoomOnClick: true, // 点击聚合的点,是否改变地图的缩放级别
				gridSize: 60, // 聚合计算时网格的像素大小,默认60
				complete(res) {
					console.log('initMarkerCluster', res)
				}
			});

2. joinCluster属性设为true,否则不生效

marker对象上必须有该属性

3. 确保每个marker有唯一的id,否则可能会出问题

4. 安卓和ios兼容问题

1. iconPath不要有中文,安卓和微信小程序可以使用中文,但苹果端使用中文要出异常,所以统一不要使用中文

2.小程序--安卓端直接传入marker数组无法使用点聚合的效果. 小程序--苹果端通过调用addMarkers无法使用点聚合的效果. 因此,此处必须写兼容代码分别处理

  • 安卓
js 复制代码
		this._mapContext.addMarkers({
				markers,
				clear: false,
				complete(res) {
					console.log('addMarkers', res)
				}
			})
  • ios
html 复制代码
<map id="map" :latitude="latitude" :longitude="longitude" :style="{ width: '100%', height: windowHeight + 'px' }" :scale="10" markers="markerList">
相关推荐
Mintopia16 小时前
Vue3 项目如何迁移到 uni-app x:从纯 Web 到多端应用的系统指南
uni-app
Mintopia16 小时前
uni-app x 发展前景技术分析:跨端统一的新阶段?
uni-app
不爱说话郭德纲1 天前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
HashTang3 天前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
JunjunZ3 天前
uniapp 文件预览:从文件流到多格式预览的完整实现
前端·uni-app
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
TT_Close4 天前
“啪啪啪”三下键盘,极速拉起你的 uni-app 项目!
vue.js·uni-app·前端工程化
特立独行的猫a4 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
00后整顿职场4 天前
Hbuilderx APP真机无法识别iqoo Z9+手机设备解决方案
uni-app·uniapp真机调试·真机运行
前端小雪的博客.4 天前
【保姆级教程】uniAI 插件高效开发 uni-app 微信小程序(附实战案例)
微信小程序·uni-app·ai编程·uniai