uniapp小程序自定义聚合点

news2024/10/18 17:12:39

注:

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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC之 文件上传和下载

1. 文件上传 1.1 前端注意事项 文件上传操作&#xff0c;前端的表单项需要如下三项设置&#xff1a; &#xff08;1&#xff09;input标签的type属性应设置为file&#xff0c;并且注意不要在input标签中设置value属性&#xff0c;因为这可能导致文件上传不成功&#xff1b; …

轻触节点,链表里的悄然邂逅

公主请阅 1. 移除链表元素1. 题目说明示例 1示例 2示例 3 1.2 题目分析1.3 代码部分1.4 代码解析 2. 反转链表2. 1题目说明示例 1示例 2示例 3 2.2 题目分析2.3 代码部分2.4 代码分析 1. 移除链表元素 题目传送门 1. 题目说明 给你一个链表的头节点 head 和一个整数 val &…

无头浏览器测试:如何使用 Puppeteer 和 Browserless?

什么是无头浏览器测试&#xff1f; 无头浏览器测试通常指没有头的物体或东西&#xff0c;在浏览器的语境中&#xff0c;它指的是没有 UI 的浏览器模拟。无头浏览器自动化使用 Web 浏览器进行端到端测试&#xff0c;而无需加载浏览器的 UI。 无头模式是一个功能&#xff0c;它…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…

一款AutoXJS现代化美观的日志模块AxpLogger

简介 Axp Logger是一款基于autox.js的现代化日志模块&#xff0c;具备窗口事件穿透、拖拽和缩放功能。 Axp Logger文档 特性现代化的UI设计支持点击穿透模式&#xff08;不影响脚本运行&#xff09;监听音量-键切换模式支持窗口操作模式窗口拖拽移动窗口自由缩放清空日志关闭日…

高精-阶乘和-保姆级教程

提供50的阶乘30414093201713378043612608166064768844377641568960512000000000000&#xff1b; 显然要做这题&#xff0c;int 或者 long long 类型的整型放不下这么长的数据所以我们要使用数组用高精度实现&#xff1b; 然后容易想到这题 肯定要用到高精度乘法和高精度加法&…

外包干了3周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了3周的功…

Qt(10.11)

数据表 源代码&#xff1a; #include "widget.h" #include "ui_widget.h" #include<QMessageBox>//消息对话框 #include<QDebug> #include<QSqlRecord> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&g…

十、pico+Unity交互开发教程——射线抓取与更多交互功能

一、回顾与引入 回顾上一篇直接抓取的教程&#xff0c;VR交互一般需要可交互的对象&#xff08;Interactable&#xff09;和发起交互的对象&#xff08;Interactor&#xff09;。直接抓取和射线抓取的可交互对象无区别&#xff0c;可参考上一篇教程设置组件。两者区别在于发起…

【Vercel】Vercel静态部署踩坑

背景 在现代的软件开发中&#xff0c;自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台&#xff0c;提供了与GitHub的无缝集成&#xff0c;使得开发者能够在每次提交代码后自动触发部署流程。然而&#xff0c;自动化部署过程中可能会遇到一些挑战&#xff0…

性能测试:流量回放工具-GoReplay!结合一款无需CA证书即可抓取HTTPS明文的工具,简直无敌

性能测试&#xff1a;流量回放工具-GoReplay&#xff01;结合一款无需CA证书即可抓取HTTPS明文的工具&#xff0c;简直无敌。 GoReplay 是一个开源网络监控工具&#xff0c;可以将实时 HTTP 流量捕获并重放到测试环境。 应用成熟的过程中&#xff0c;测试所需的工作量往往会成…

学习干货小白女友看完这篇文章后,面试工作和护网蓝队初级竟然秒通过!

小白女友看完这篇文章后&#xff0c;面试工作和护网蓝队初级竟然秒通过&#xff01; 前言&#xff1a;本文中涉及到的相关技术或工具仅限技术研究与讨论&#xff0c;严禁用于非法用途&#xff0c;否则产生的一切后果自行承担&#xff0c;如有侵权请联系。 还在学怎么挖通用漏…

【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…

老机MicroServer Gen8再玩 OCP万兆光口+IT直通

手上有一台放了很久的GEN8微型服务器&#xff0c;放了很多年&#xff0c;具体什么时候买的我居然已经记不清了 只记得开始装修的时候搬家出去就没用了&#xff0c;结果搬出去有了第1个孩子&#xff0c;孩子小的时候也没时间折腾&#xff0c;等孩子大一点的时候&#xff0c;又有…

MongoDB查询操作

&#x1f337;启动mongo &#x1f388;启动mongo shell &#xff08;1&#xff09;在指定目录下创建mongodb文件夹、其子文件夹data、log以及文件mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log(2)先执行mongodb命…

《计算机视觉》—— 疲劳检测

文章目录 一、疲劳检测实现的思想二、代码实现 一、疲劳检测实现的思想 了解以下几篇文章有助于了解疲劳检测的方法 基于dlib库的人脸检测 https://blog.csdn.net/weixin_73504499/article/details/142977202?spm1001.2014.3001.5501 基于dlib库的人脸关键点定位 https://blo…

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的自动回复

目录 1.根据需要自动回复某些主题 2.调用doReply方法进行自动回复 1.根据需要自动回复某些主题 根据主题判断&#xff0c;哪些主题是需要自动回复的&#xff0c;比如设备登录&#xff0c;需要自动回复。 2.调用doReply方法进行自动回复&#xff08;代码不一定全部正确&#xf…

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

安乃达:用CRM构建从销售到管理到售后的全链路数字化运营平台

安乃达驱动技术(上海)股份有限公司((简称&#xff1a;“安乃达”,股票代码为&#xff1a;“603350”))自2011年以来&#xff0c;公司通过多年的研发与积累现有直驱轮毂电机、减速轮毂电机和中置电机三大系列产品&#xff0c;并具备与电机相匹配的控制器、传感器、仪表等电驱动成…