uniapp小程序自定义聚合点

注:

1.默认的聚合点可以点击自动展示子级点位,但是自定义的聚合点在ios上无法触发markerClusterClick的监听,至今未解决,不知啥原因

2.ios和安卓展示的点位样式还有有差别

源码附上

<template>
	<view class="marker-map">
		<map id="mapId" style="width: 100%; height:1342rpx ;" :latitude="latitude" :longitude="longitude"
			show-location show-scale :scale="zoom" @regionchange="regionchange" @updated="update" @callouttap='callouttap'>
		</map>
		<view class="layer flex-column align-end">
			<view class="cur-location justify-center align-center" @click="backCenter">
				<image :src="imgConf.position" mode="" style="width:60%;height: 60%;"></image>
			</view>
			<view class="list">
				<u-transition :show="showMarkerListPop" mode="fade-up">
					<mapMarkerList @onclose="showMarkerListPop=false" />
				</u-transition>
			</view>
		</view>
	</view>
</template>

<script>
	import mapMarkerList from './components/mapMarkerList.vue'
	import imgConf from '@/utils/imgConf.js'
	export default {
		components: {
			mapMarkerList
		},
		data() {
			return {
				imgConf,
				longitude: 104.04311,
				latitude: 30.64242,
				markers: [], // 使用 marker点击事件 需要填写id
				fixedHeight: 60,
				zoom: 16,
				showMarkerListPop: false
			}
		},
		created() {
			this.mapContext = uni.createMapContext("mapId", this);


			console.log("this.mapContext", this.mapContext);
			// 使用默认聚合效果时可注释下一句
			this.bindEvent()
			this.getDotList();
		},

		methods: {
			bindEvent() {
				this.mapContext.initMarkerCluster({
					enableDefaultStyle: false,
					zoomOnClick: true,
					gridSize: 100,
					complete(res) {
						console.log('initMarkerCluster', res)
					}
				});

				// enableDefaultStyle 为 true 时不会触发该事件
				this.mapContext.on('markerClusterCreate', res => {
					const clusters = res.clusters
					const markers = clusters.map(cluster => {
						const {
							center,
							clusterId,
							markerIds
						} = cluster
						return {
							...center,
							width: 1,
							height: 1,
							clusterId, // 必须
							iconPath: '',
							label: {
								content: '盛世年华' + "(" + "2" + "套)" + '\n' + '12' + '元起',
								color: "#ffffff",
								fontSize: 11,
								borderRadius: 8,
								bgColor: "#0090FF",
								padding: 10,
								textAlign: 'center',
								anchorX: 0,
								anchorY: -56,
							}
							// callout: {
							// 	content: '盛世年华' + "(" + "2" + "套)" + '\n' + '12' + '元起',
							// 	color: "#ffffff",
							// 	fontSize: 11,
							// 	borderRadius: 8,
							// 	bgColor: "#0090FF",
							// 	padding: 10,
							// 	textAlign: 'center',
							// 	display: 'ALWAYS',
							// },
						}
					})
					this.mapContext.addMarkers({
						markers,
						clear: false,
						complete(res) {
							console.log('clusterCreate addMarkers', res)
						}
					})
				})

				this.mapContext.on("markerClusterClick", (ClusterInfo) => {
					console.log("点击聚合点", ClusterInfo); //[id1,id2]
				});
			},
			// 获取所有点位/
			async getDotList(params) {
				// const res = await getDot(params)
				const resPosition = [{
						longitude: 113.324520,
						latitude: 23.099994,
						title: '盛世年华1',
						num: 1,
						price: 35500
					},
					{
						longitude: 102.04320,
						latitude: 31.64242,
						title: '盛世年华2',
						num: 1,
						price: 35500
					},
					{
						longitude: 102.04313,
						latitude: 30.64242,
						title: '盛世年华3',
						num: 1,
						price: 15500
					},
					{
						longitude: 113.326520,
						latitude: 31.64242,
						title: '盛世年华4',
						num: 3,
						price: 25500
					},
				]
				const markers = []
				resPosition.forEach((p, i) => {
					markers.push(
						Object.assign({}, {
							id: i + 1,
							iconPath: '',
							joinCluster: true,
							width: 2,
							height: 2,
							callout: {
								content: p.title + "(" + p.num + "套)" + '\n' + p.price + '元起',
								color: "#ffffff",
								fontSize: 11,
								borderRadius: 8,
								bgColor: "#0090FF",
								padding: 10,
								textAlign: 'center',
								display: 'ALWAYS',
							},
						}, p)
					)
				})
				this.markers = JSON.parse(JSON.stringify(markers))
				this.mapContext.addMarkers({
					markers: this.markers,
					clear: false,
					complete(res) {
						console.log('addMarkers', res)
					}
				})
				// .map((item, index) => {
				// 	if (item.lnglat === '') {
				// 		return undefined
				// 	}
				// 	var location = item.x.split(",");
				// 	let iconPath = ''

				// 	let label = item.name.length > 20 ? item.name.substr(0, 18) + '...' : item.name;
				// 	label = label.length > 10 ? label.substr(0, 10) + '\n' + label.substr(10) : label;
				// 	return {
				// 		id: index,
				// 		longitude: Number(location[0]),
				// 		latitude: Number(location[1]),
				// 		iconPath,
				// 		joinCluster: this.zoom > 18 ? false : true,
				// 		width: 50,
				// 		height: 60,
				// 		name: item.name,
				// 		label: {
				// 			content: label,
				// 			anchorX: 20,
				// 			anchorY: -45,
				// 			color: '#333',
				// 			fontSize: 14
				// 		}
				// 	}
				// }).filter(i => i !== undefined)
				console.log('markers', this.markers)
				if (this.markers.length === 0) {
					uni.showToast({
						title: '暂无相关点位信息',
						icon: "none"
					})
					this.longitude = 92.066757
					this.latitude = 31.473608
					this.zoom = 16
					return
				}
				// })
			},
			// 点击标记点
			callouttap(e) {
				this.showMarkerListPop = true
				// 根据markerid查找
				console.log('点击标记点E', e) //e.markerId
			},

			regionchange() {
				// this.mapContext.getScale({
				// 	success: (res) => {
				// 		this.zoom = res.scale
				// 	}
				// })
			},
			update() {

				console.log('渲染更新完成') //e.markerId
			},
			// 定位到当前位置
			backCenter() {
				uni.getLocation({
					type: 'gcj02',
					success: (res) => {
						if (res.longitude && res.latitude) {
							this.latitude = Number(res.latitude)
							this.longitude = Number(res.longitude)
							this.zoom = 16.01 // 必须要有层级的变化,下面的方法才能生效
							this.mapContext.moveToLocation({
								longitude: this.longitude,
								latitude: this.latitude,
								success: (res) => {
									this.zoom = 16.03
								},
								fail: (info) => {
									console.log(info)
								}
							})
						} else {
							uni.showToast({
								title: '无法获取当前定位'
							})
						}
					},
					fail(err) {
						uni.showToast({
							title: '无法获取当前定位'
						})
					}
				});
			},
		}
	}
</script>

<style lang="scss" scoped>
	.marker-map {
		.layer {
			position: fixed;
			z-index: 999;
			width: 100%;
			right: 0;
			bottom: 0;
		}

		.cur-location {
			width: 86rpx;
			height: 86rpx;
			background: #FFFFFF;
			box-shadow: 0rpx 0rpx 8rpx 1rpx rgba(0, 144, 255, 0.15);
			border-radius: 20rpx 20rpx 20rpx 20rpx;
			margin-right: 30rpx;
			margin-bottom: 50rpx;
		}

		.list {
			width: 100%;
			height: 100%;
		}
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法——python实现归并排序

文章目录 归并排序NB三人组总结 归并排序 """ 归并排序 """""" 时间复杂度 &#xff1a; O(N*logN) 空间复杂度 &#xff1a; O(N) 需要额外生成一个临时变量&#xff0c;最大是N长 思路&#xf…

[Linux网络编程]03-TCP协议

一.TCP协议数据通信的过程 TCP数据报如下&#xff0c;数据报中的标志位双端通信的关键。 三次握手: 1.客户端向服务端发送SYN标志位&#xff0c;请求建立连接&#xff0c;同时发送空包 2.服务端向客户端回发ACK标志位(即确认标志位&#xff0c;任何一端发送数据后都需要另一端…

Nginx UI 一个可以管理Nginx的图形化界面工具

Nginx UI 是一个基于 Web 的图形界面管理工具&#xff0c;支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富&#xff1a; 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

C++ string的精讲

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 string是标准库中的一个类&#xff0c;它位于<string>头文件中。这个类提供…

Python算法——链表(反转链表,合并两个排序链表,判断是否有环,链表中倒数最后k个结点,第一个公共结点,删除重复元素)

哈喽大家好&#xff0c;好久不见&#xff01;又进入新的一个学期&#xff0c;这学期小编要进行python的算法学习啦&#xff0c;今天更新链表的部分题目~ 牛客 NC78 反转链表 题目如下&#xff1a; 算法思想如下&#xff1a; 1.初始化两个指针pre和cur&#xff0c;分别表示前驱…

ERROR [internal] load metadata for docker.io/library/nginx:latest

docker执行错误解决方法 1、执行docker pull nginx2、docker build -t xxx:xx

Ai环境安装教程

依赖的驱动软件 python3.115cuda11.4torch2.0.1 一。如何下载安装 一、驱动下载 【Python链接】https://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe 【CUDA链接】https://developer.download.nvidia.com/compute/cuda/11.4.4/local_installers/cuda_11.4.4…

从 Microsoft 官网下载 Windows 10

方法一&#xff1a; 打开 Microsoft 官网&#xff1a; 打开开发人员工具&#xff08;按 F12 或右键点击“检查”&#xff09;。 点击“电脑模拟手机”按钮&#xff0c;即下图&#xff1a; 点击后重新加载此网页&#xff0c;即可看到下载选项。

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

Notepad++将搜索内容所在行选中,并进行复制等操作

背景 Notepad在非常多的数据行内容中&#xff0c;按照指定内容检索&#xff0c;并定位到具体行&#xff0c;而后对内容行的数据进行复制、剪切、删除等处理动作。 操作说明 检索并标记所在行 弹出搜索框&#xff1a;按下 Ctrl F。 输入查找字符串&#xff1a;在搜索框中输入要…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

java项目之精准扶贫管理系统源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的精准扶贫管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 精准扶贫管理系统的主要…

STM32重拾+找工作MD

1.工程文件创建 外部的文件夹要和工程文件对应&#xff0c;也就是外面创建好之后&#xff0c;里面也要对应添加&#xff1b; 首先是startup启动文件&#xff0c;这个是程序执行最基本的文件&#xff0c;keil中启动文件是用汇编写的&#xff0c;启动文件内定义了中断向量表&…

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇&#xff0c;本篇主要是介绍Java的一些基础内容&#xff1a; 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系&#xff1f; 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv&#xff01; 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级&#xff01;服务详情可以在官网查看详细解读&#xff01; 那些因为老旧版本而被攻击的例子 话不多说&#xff0c;直接上图&a…

QT实现校园导航

导航是地图类项目实战中经常会遇到了。看上去貌似没头绪&#xff0c;其实是有模板遵循的。我们直接根据图看代码。 //MainWidget.h#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "mapwidget.h" #include <QToolButton> #in…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

【动手学深度学习】7.3 网络中的网络(NiN)(个人向笔记)

LeNet&#xff0c;AlexNet和VGG都有一个共同的设计模型&#xff1a;通过一系列卷积层和汇聚层来提取空间结构特征&#xff0c;然后通过全连接层对特征的表征进行处理AlexNet和VGG对LeNet的改进主要是在于如何扩大和加深这两个模块网络中的网络(NIN)提出了&#xff1a;在每个像素…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…