uniapp map 点聚合 聚合点样式修改

重点:此代码复制 可直接运行, 重要提示需要编译在小程序开发工具中使用“真机预览”才可展示如上图所示效果,一定“真机预览”哟!!!

项目需求聚合点的展示必须是图片的样式展示,不能使用默认样式。

图片展示(本来想弄视频太麻烦了):

 点聚合的最重要的一个地方是在markers中添加 joinCluster = true 这个重要的属性,否则将无法开启点聚合功能,这个在uniapp的官方文档里体现的不是那么清楚,但是在小程序文档提示的就相当清楚。

代码:

<template>
	<view class="base_body">
		<map :markers="markers"  max-scale="11.9" :scale="scale" id="map" style="width: 100%; height: 100%;" :latitude="latitude"
			:longitude="longitude">
		</map>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				map: '',
				scale: '8', // 缩放级别,取值范围为3-20
				latitude: 39.890, // 地图默认显示的维度
				longitude: 116.39752, // 地图默认显示的纬度
				markerClickList: [],
				markers: [],  //
UniApp 中,要使用 `map` 组件实现聚合功能,可按以下步骤操作。 ### 1. 准备工作 在 `pages.json` 中确保已添加 `map` 组件所需的权限和配置,在 `pages` 节下对应页面配置中添加地图相关的样式和配置。 ### 2. 页面布局 在 `.vue` 文件中使用 `map` 组件,并绑定相关数据和事件。以下是示例代码: ```vue <template> <view> <map id="map" :latitude="latitude" :longitude="longitude" :markers="markers" :scale="scale" @markertap="onMarkerTap" style="width: 100%; height: 100vh;" ></map> </view> </template> <script> export default { data() { return { latitude: 30.0000, longitude: 120.0000, scale: 10, markers: [] }; }, onReady() { this.initMarkers(); }, methods: { initMarkers() { // 这里模拟添加多个标记 const markerList = []; for (let i = 0; i < 10; i++) { const marker = { id: i, latitude: this.latitude + Math.random() * 0.1 - 0.05, longitude: this.longitude + Math.random() * 0.1 - 0.05, width: 30, height: 30 }; markerList.push(marker); } this.markers = markerList; this.doCluster(); }, doCluster() { // 实现聚合逻辑 const clusterMarkers = []; // 这里简单模拟聚合,实际需要根据地图缩放级别和标记距离等因素计算 const clusterRadius = 0.01; const tempMarkers = [...this.markers]; while (tempMarkers.length > 0) { const currentMarker = tempMarkers.shift(); const cluster = [currentMarker]; for (let i = tempMarkers.length - 1; i >= 0; i--) { const distance = this.calculateDistance( currentMarker.latitude, currentMarker.longitude, tempMarkers[i].latitude, tempMarkers[i].longitude ); if (distance < clusterRadius) { cluster.push(tempMarkers[i]); tempMarkers.splice(i, 1); } } if (cluster.length > 1) { const clusterMarker = this.createClusterMarker(cluster); clusterMarkers.push(clusterMarker); } else { clusterMarkers.push(currentMarker); } } this.markers = clusterMarkers; }, calculateDistance(lat1, lon1, lat2, lon2) { const R = 6371; // 地球半径,单位:km const dLat = (lat2 - lat1) * (Math.PI / 180); const dLon = (lon2 - lon1) * (Math.PI / 180); const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * (Math.PI / 180)) * Math.cos(lat2 * (Math.PI / 180)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; }, createClusterMarker(cluster) { let totalLat = 0; let totalLon = 0; cluster.forEach((marker) => { totalLat += marker.latitude; totalLon += marker.longitude; }); const avgLat = totalLat / cluster.length; const avgLon = totalLon / cluster.length; return { id: cluster.length + 1000, latitude: avgLat, longitude: avgLon, width: 40, height: 40, label: { content: cluster.length.toString(), color: "#fff", fontSize: 14, bgColor: "#ff0000", padding: 5 } }; }, onMarkerTap(e) { console.log("击标记:", e.markerId); } } }; </script> ``` ### 代码解释 - `initMarkers` 方法:模拟添加多个标记到地图上。 - `doCluster` 方法:实现聚合逻辑,根据标记之间的距离进行聚合- `calculateDistance` 方法:计算两个标记之间的距离。 - `createClusterMarker` 方法:创建聚合标记,将多个标记聚合成一个,并显示聚合数量。 ### 注意事项 - 上述代码中的聚合逻辑是简单模拟,实际应用中需要根据地图的缩放级别、标记的实际分布等因素进行更精确的计算。 - 可以根据需求调整聚合半径和聚合标记样式
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值