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

本文介绍了如何在地图中使用uni.createMapContext进行点聚合以解决过多标记点的问题,包括基本用法、调用`initMarkerCluster`方法、设置joinCluster属性、保证唯一id以及安卓和iOS兼容性注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果如图:
在这里插入图片描述
在这里插入图片描述

一、什么是点聚合

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

二、基本用法

  • template
<map id="map" :latitude="latitude" :longitude="longitude" :style="{ width: '100%', height: windowHeight + 'px' }" :scale="10">
  • onReady
// 获取屏幕高度
		uni.getSystemInfo({
			success: (res) => {
				this.windowHeight = res.windowHeight;
			},
		});
		
		// 创建map对象
		this._mapContext = uni.createMapContext("map", this);
		this.cluster();
  • data
			_mapContext: null,
			windowHeight: 0,
			latitude: 23.099994,
			longitude: 113.324520,
  • methods
		// 点聚合
		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方法,否则不生效

			// 创建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无法使用点聚合的效果. 因此,此处必须写兼容代码分别处理

  • 安卓
		this._mapContext.addMarkers({
				markers,
				clear: false,
				complete(res) {
					console.log('addMarkers', res)
				}
			})
  • ios
<map id="map" :latitude="latitude" :longitude="longitude" :style="{ width: '100%', height: windowHeight + 'px' }" :scale="10" markers="markerList">

在这里插入图片描述

根据提供的引用[1],这是一个uniapp使用map实现聚合的示例。聚合是将地图上的多个聚合成一个,以提高地图的可读性和性能。以下是实现聚合的步骤: 1. 引入map组件和聚合插件 ```vue <template> <view class="map"> <map :longitude="longitude" :latitude="latitude" :scale="scale" :markers="markers" :covers="covers" @markertap="markertap" @regionchange="regionchange"></map> </view> </template> <script> import QQMapWX from '@/utils/qqmap-wx-jssdk.min.js' import QQMapWXMin from '@/utils/qqmap-wx-jssdk.min.js' import QQMapWXMinJs from '@/utils/qqmap-wx-jssdk.js' import QQMapWXMinMap from '@/utils/qqmap-wx-jssdk.map.js' import QQMapWXMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.js' import QQMapWXMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.js' import QQMapWXMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.js' import QQMapWXMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.js' import QQMapWXMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.js' import QQMapWXMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinJs from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMap from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin from '@/utils/qqmap-wx-jssdk.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.min.map.js' import QQMapWXMinMapMinMapMinMapMinMapMinMapMinMapMinMapMin
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieyucx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值