From 8350978c5e612acd8e9095429f3524623e7ac0a5 Mon Sep 17 00:00:00 2001
From: "978184212@qq.com" <978184212@qq.com>
Date: Wed, 19 Aug 2026 15:39:10 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE=E7=9A=84?=
=?UTF-8?q?=E7=82=B9=E8=81=9A=E5=90=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages/maps/index.vue | 559 ++++++++++++++++++++++---------------------
1 file changed, 290 insertions(+), 269 deletions(-)
diff --git a/pages/maps/index.vue b/pages/maps/index.vue
index 71a0967..caa4a47 100644
--- a/pages/maps/index.vue
+++ b/pages/maps/index.vue
@@ -1,6 +1,5 @@
-
-
-
-
-
-
@@ -72,15 +66,17 @@
stationInfo: [],
pestlightMarker: null,
stationlist: [],
- timerSet: null
+ timerSet: null,
+ // 点聚合相关
+ mapContext: null,
+ clusterMarkerIds: [], // 参与聚合的marker id列表
+ isClusterInited: false // 是否已初始化聚合
};
},
onLoad() {
- // this.isscd = true
- // this.getList()
- this.$nextTick(() => {
- this.getList()
- })
+ this.$nextTick(() => {
+ this.getList()
+ })
},
onShow() {
var that = this
@@ -96,14 +92,10 @@
console.log(res, 165)
if (res.data.code == 0) {
let userInfo = res.data.data;
- // uni.setStorageSync('third_session', userInfo.thirdSession);
if (!userInfo.id) {
uni.reLaunch({
url: '/packDetail/pages/login/login'
})
- } else {
- // that.isscd = true
- //
}
}
})
@@ -114,13 +106,137 @@
url: '/pages/loginindex'
})
}
-
},
onReady() {
- // 1.页面准备好后,获取到map组件的执行上下文。注意:这里是取的map的id属性
- this.mapContext = uni.createMapContext("alarm_map", this);
+ // 获取地图上下文
+ this.mapContext = uni.createMapContext("map", this);
+ // 初始化点聚合
+ this.initCluster()
},
methods: {
+ // ===== 新增:初始化点聚合 =====
+ initCluster() {
+ if (!this.mapContext) {
+ setTimeout(() => {
+ this.initCluster()
+ }, 500)
+ return
+ }
+ // 1. 初始化聚合配置
+ this.mapContext.initMarkerCluster({
+ enableDefaultStyle: false, // 使用默认样式
+ zoomOnClick: true, // 点击聚合点时是否放大地图
+ gridSize: 60, // 聚合网格大小
+ complete: (res) => {
+ console.log('initMarkerCluster success', res)
+ this.isClusterInited = true
+ // 聚合初始化完成后,添加杀虫灯标记
+ this.addPestMarkersToCluster()
+ }
+ })
+
+ // 2. 监听聚合簇创建事件,自定义聚合簇样式
+ this.mapContext.on('markerClusterCreate', (res) => {
+ console.log('markerClusterCreate', res)
+ const clusters = res.clusters
+ const clusterMarkers = clusters.map((cluster) => {
+ // 获取该聚合簇中第一个marker的坐标作为中心点
+ const centerLat = cluster.center.latitude
+ const centerLng = cluster.center.longitude
+ const count = cluster.markerIds.length
+
+ return {
+ id: cluster.clusterId,
+ latitude: centerLat,
+ longitude: centerLng,
+ width: 40,
+ height: 40,
+ iconPath: '/static/zhandian_sahchong_dingwei.png',
+ label: {
+ content: count + '',
+ color: '#ffffff',
+ fontSize: 12,
+ fontWeight: 'bold',
+ anchorX: 0,
+ anchorY: -8,
+ borderWidth: 0,
+ bgColor: 'rgba(0,0,0,0.6)',
+ borderRadius: 10,
+ padding: 2
+ }
+ }
+ })
+ // 更新聚合簇样式
+ this.mapContext.addMarkers({
+ markers: clusterMarkers,
+ clear: false,
+ complete: (res) => {
+ console.log('add cluster markers success', res)
+ }
+ })
+ })
+ },
+
+ // ===== 新增:添加杀虫灯到聚合 =====
+ addPestMarkersToCluster() {
+ if (!this.isClusterInited) return
+
+ // 先移除之前的聚合标记
+ if (this.clusterMarkerIds.length > 0) {
+ this.mapContext.removeMarkers({
+ markerIds: this.clusterMarkerIds,
+ complete: (res) => {
+ console.log('remove old cluster markers', res)
+ }
+ })
+ this.clusterMarkerIds = []
+ }
+
+ // 如果杀虫灯开关是关闭状态,不添加
+ if (!this.isscd || this.pestlight.length === 0) return
+
+ // 准备聚合标记数据
+ const pestMarkers = []
+ this.pestlight.forEach((item, index) => {
+ const markerId = 10000 + index
+ pestMarkers.push({
+ id: markerId,
+ latitude: Number(item.latitude),
+ longitude: Number(item.longitude),
+ width: 15,
+ height: 20,
+ iconPath: '/static/zhandian_sahchong_dingwei.png',
+ joinCluster: true, // 参与聚合
+ inType: 'pestlight',
+ stationName: item.stationName,
+ stationCode: item.stationCode
+ })
+ this.clusterMarkerIds.push(markerId)
+ })
+
+ // 通过 addMarkers 添加参与聚合的标记
+ this.mapContext.addMarkers({
+ markers: pestMarkers,
+ clear: false,
+ complete: (res) => {
+ console.log('add pest markers to cluster success', res)
+ }
+ })
+ },
+
+ // ===== 修改:移除杀虫灯从聚合 =====
+ removePestMarkersFromCluster() {
+ if (this.clusterMarkerIds.length > 0 && this.mapContext) {
+ this.mapContext.removeMarkers({
+ markerIds: this.clusterMarkerIds,
+ complete: (res) => {
+ console.log('remove pest markers from cluster', res)
+ }
+ })
+ this.clusterMarkerIds = []
+ }
+ },
+
getList() {
this.markers = []
this.markersNoPest = []
@@ -131,103 +247,178 @@
});
this.$http.get('/applet/survStationInfo/stationMap').then(res => {
this.stationlist = [...res.data.data.pestlight, ...res.data.data.cusLocation, ...res.data.data.stationInfo]
- this.stationlist.forEach((item,index) => {
- item.id = index;
- if(item.inType == 'pestlight'){
- this.pestlight.push(item)
- }
- if(item.stationType == 'cusLocaltion'){
- this.cusLocation.push(item)
- }
- if(item.stationType == 'orient' || item.stationType == 'livestock'){
- this.stationInfo.push(item)
- }
- this.list.push({
- latitude:Number(item.stationLatitude),
- longitude: Number(item.stationLongitude),
- stationType:item.stationType,
- sortNo: item.sortNo,
- stationName: item.stationName,
- stationCode: item.stationCode
- })
- })
- this.issscd = false
- this.isssscd = false
- this.qiyeChange()
- this.list1query()
- this.list2query()
- uni.hideLoading();
- })
- },
- // 处理 stationlist 数据方法
- processStationList(stationlist) {
- if (stationlist) {
- stationlist.forEach(item => {
+ this.stationlist.forEach((item,index) => {
+ item.id = index;
+ if(item.inType == 'pestlight'){
+ this.pestlight.push(item)
+ }
+ if(item.stationType == 'cusLocaltion'){
+ this.cusLocation.push(item)
+ }
+ if(item.stationType == 'orient' || item.stationType == 'livestock'){
+ this.stationInfo.push(item)
+ }
this.list.push({
- latitude: item.inType === 'pestlight' ? Number(item.latitude) : Number(item
- .stationLatitude),
- longitude: item.inType === 'pestlight' ? Number(item.longitude) : Number(item
- .stationLongitude),
- stationType: item.inType === 'pestlight' ? 'pestlight' : item.stationType,
+ latitude:Number(item.stationLatitude),
+ longitude: Number(item.stationLongitude),
+ stationType:item.stationType,
sortNo: item.sortNo,
stationName: item.stationName,
stationCode: item.stationCode
})
})
+ this.issscd = false
+ this.isssscd = false
+ this.qiyeChange()
+ this.list1query()
+ this.list2query()
+
+ // 如果聚合已初始化,直接添加杀虫灯;否则等待初始化完成
+ if (this.isClusterInited) {
+ this.addPestMarkersToCluster()
+ }
+ uni.hideLoading();
+ })
+ },
+
+ // ===== 修改:杀虫灯开关控制 =====
+ switch1Change() {
+ this.isscd = !this.isscd;
+ if (this.isscd) {
+ // 打开 - 添加杀虫灯到聚合
+ this.addPestMarkersToCluster()
+ } else {
+ // 关闭 - 从聚合中移除杀虫灯
+ this.removePestMarkersFromCluster()
}
},
- // 生成 pointers 数据方法
- generatePointers() {
- const iconConfig = {
- // pestlight: {
- // iconPath: '/static/zhandian_sahchong_dingwei.png',
- // width: 15,
- // height: 20
- // },
- orient: {
- iconPath: '/static/zhandian_nongtian_dingwei.png',
- width: 35,
- height: 52
- },
- livestock: {
- iconPath: '/static/zhandian_xuqin_dingwei.png',
- width: 35,
- height: 52
- },
- cusLocaltion: {
- iconPath: '/static/qiyeIcon.png',
- width: 35,
- height: 52
- }
- }
- this.list.forEach((item, i) => {
- const config = iconConfig[item.stationType] || {}
- item.iconPath = config.iconPath || ''
- item.width = config.width || 0
- item.height = config.height || 0
- this.pointers.push({
- id: i,
+
+ // ===== 以下方法完全保持原样 =====
+ qiyeChange() {
+ for (let i = 0; i < this.cusLocation.length; i++) {
+ const item = this.cusLocation[i];
+ item.iconPath = '/static/qiyeIcon.png';
+ item.latitude = Number(item.stationLatitude);
+ item.longitude = Number(item.stationLongitude);
+ item.width = 35;
+ item.height = 52;
+ this.list.push({
+ latitude:Number(item.stationLatitude),
+ longitude: Number(item.stationLongitude),
+ stationType:item.stationType,
+ sortNo: item.sortNo,
+ stationName: item.stationName,
+ stationCode: item.stationCode
+ })
+ const markerItem = {
+ id: item.id,
iconPath: item.iconPath,
- latitude: Number(item.latitude),
- longitude: Number(item.longitude),
+ latitude: item.latitude,
+ longitude: item.longitude,
width: item.width,
height: item.height,
customCallout: {
- anchorY: 0, // Y轴偏移量
- anchorX: 0, // X轴偏移量
- display: 'ALWAYS' // 一直展示
+ anchorY: 0,
+ anchorX: 0,
+ display: 'ALWAYS'
},
stationType: item.stationType,
stationName: item.stationName,
stationCode: item.stationCode,
- joinCluster: true // 是否参与点聚合
+ joinCluster: true
+ };
+ this.markers.push(markerItem);
+ }
+ },
+ switch2Change() {
+ this.issscd = !this.issscd
+ this.list1query()
+ },
+ switch3Change() {
+ this.isssscd = !this.isssscd
+ this.list2query()
+ },
+ list1query(){
+ if (!this.issscd) {
+ for (let i = 0; i < this.stationInfo.length; i++) {
+ const item = this.stationInfo[i];
+ if(item.stationType === 'orient'){
+ item.iconPath = '/static/zhandian_nongtian_dingwei.png';
+ item.latitude = Number(item.stationLatitude);
+ item.longitude = Number(item.stationLongitude);
+ item.width = 35;
+ item.height = 52;
+ const markerItem = {
+ id: item.id,
+ iconPath: item.iconPath,
+ latitude: item.latitude,
+ longitude: item.longitude,
+ width: item.width,
+ height: item.height,
+ customCallout: {
+ anchorY: 0,
+ anchorX: 0,
+ display: 'ALWAYS'
+ },
+ stationType: item.stationType,
+ stationName: item.stationName,
+ stationCode: item.stationCode,
+ joinCluster: true
+ };
+ this.markers.push(markerItem);
+ }
+ }
+ } else {
+ this.markers = this.markers.filter((item)=>{
+ return item.stationType !== 'orient'
})
- })
+ }
+ },
+ list2query(){
+ if (!this.isssscd) {
+ for (let i = 0; i < this.stationInfo.length; i++) {
+ const item = this.stationInfo[i];
+ if(item.stationType === 'livestock'){
+ item.iconPath = '/static/zhandian_xuqin_dingwei.png';
+ item.latitude = Number(item.stationLatitude);
+ item.longitude = Number(item.stationLongitude);
+ item.width = 35;
+ item.height = 52;
+ const markerItem = {
+ id: item.id,
+ iconPath: item.iconPath,
+ latitude: item.latitude,
+ longitude: item.longitude,
+ width: item.width,
+ height: item.height,
+ customCallout: {
+ anchorY: 0,
+ anchorX: 0,
+ display: 'ALWAYS'
+ },
+ stationType: item.stationType,
+ stationName: item.stationName,
+ stationCode: item.stationCode,
+ joinCluster: true
+ };
+ this.markers.push(markerItem);
+ }
+ }
+ } else {
+ this.markers = this.markers.filter((item)=>{
+ return item.stationType !== 'livestock'
+ })
+ }
},
markertap(e) {
const index = e.detail.markerId
- console.log(e.detail,'index')
- if (['orient', 'livestock'].includes(this.list[index].stationType)) {
+ console.log(e.detail,'index')
+ // 判断是否点击的是聚合点
+ if (e.detail && e.detail.isCluster) {
+ console.log('点击了聚合点:', e.detail)
+ return
+ }
+ if (['orient', 'livestock'].includes(this.list[index]?.stationType)) {
uni.navigateTo({
url: `/packDetail/pages/Site/detail?item=${encodeURIComponent(JSON.stringify(this.list[index]))}`
})
@@ -235,7 +426,7 @@
},
callouttap(e) {
const index = e.detail.markerId
- if (['orient', 'livestock'].includes(this.list[index].stationType)) {
+ if (['orient', 'livestock'].includes(this.list[index]?.stationType)) {
uni.navigateTo({
url: `/packDetail/pages/Site/detail?item=${encodeURIComponent(JSON.stringify(this.list[index]))}`
})
@@ -243,174 +434,7 @@
},
todetails(item) {
console.log(item, '还是个然后')
- },
- switch1Change() {
- this.isscd = !this.isscd;
- let index = 0;
- if (!this.isscd) {
- this.pestlightMarker = [];
- this.timerSet = setInterval(() => {
- for (let i = 0; i < 50 && index < this.pestlight.length; i++) {
- const item = this.pestlight[index];
- item.iconPath = '/static/zhandian_sahchong_dingwei.png';
- item.latitude = Number(item.latitude);
- item.longitude = Number(item.longitude);
- item.width = 15;
- item.height = 20;
- // 创建符合 markers 格式的对象
- const markerItem = {
- id: item.id,
- iconPath: item.iconPath,
- latitude: item.latitude,
- longitude: item.longitude,
- width: item.width,
- height: item.height,
- customCallout: {
- anchorY: 0, // Y轴偏移量
- anchorX: 0, // X轴偏移量
- display: 'ALWAYS' // 一直展示
- },
- // stationType: item.stationType,
- inType: item.inType,
- stationName: item.stationName,
- stationCode: item.stationCode,
- joinCluster: false // 是否参与点聚合
- };
- this.markers.push(markerItem);
- index++;
- }
- // this.markers = this.markers.concat(aa);
- if (index >= this.pestlight.length) {
- clearInterval(this.timerSet);
- }
- }, 1000);
-
- } else {
- clearInterval(this.timerSet);
- this.markers = this.markers.filter((item)=>{
- return item.inType !== 'pestlight'
- })
- }
- },
- qiyeChange() {
- for (let i = 0; i < this.cusLocation.length; i++) {
- const item = this.cusLocation[i];
- item.iconPath = '/static/qiyeIcon.png';
- item.latitude = Number(item.stationLatitude);
- item.longitude = Number(item.stationLongitude);
- item.width = 35;
- item.height = 52;
- this.list.push({
- latitude:Number(item.stationLatitude),
- longitude: Number(item.stationLongitude),
- stationType:item.stationType,
- sortNo: item.sortNo,
- stationName: item.stationName,
- stationCode: item.stationCode
- })
- // 创建符合 markers 格式的对象
- const markerItem = {
- id: item.id,
- iconPath: item.iconPath,
- latitude: item.latitude,
- longitude: item.longitude,
- width: item.width,
- height: item.height,
- customCallout: {
- anchorY: 0, // Y轴偏移量
- anchorX: 0, // X轴偏移量
- display: 'ALWAYS' // 一直展示
- },
- stationType: item.stationType,
- stationName: item.stationName,
- stationCode: item.stationCode,
- joinCluster: true // 是否参与点聚合
- };
- this.markers.push(markerItem);
- }
- },
- switch2Change() {
- this.issscd = !this.issscd
- this.list1query()
- },
- switch3Change() {
- this.isssscd = !this.isssscd
- this.list2query()
- },
- list1query(){
- if (!this.issscd) {
- for (let i = 0; i < this.stationInfo.length; i++) {
- const item = this.stationInfo[i];
- if(item.stationType === 'orient'){
- item.iconPath = '/static/zhandian_nongtian_dingwei.png';
- item.latitude = Number(item.stationLatitude);
- item.longitude = Number(item.stationLongitude);
- item.width = 35;
- item.height = 52;
- // 创建符合 markers 格式的对象
- const markerItem = {
- id: item.id,
- iconPath: item.iconPath,
- latitude: item.latitude,
- longitude: item.longitude,
- width: item.width,
- height: item.height,
- customCallout: {
- anchorY: 0, // Y轴偏移量
- anchorX: 0, // X轴偏移量
- display: 'ALWAYS' // 一直展示
- },
- stationType: item.stationType,
- stationName: item.stationName,
- stationCode: item.stationCode,
- joinCluster: true // 是否参与点聚合
- };
- this.markers.push(markerItem);
- }
- }
- } else {
- this.markers = this.markers.filter((item)=>{
- return item.stationType !== 'orient'
- })
- }
- },
- list2query(){
- if (!this.isssscd) {
- for (let i = 0; i < this.stationInfo.length; i++) {
- const item = this.stationInfo[i];
- if(item.stationType === 'livestock'){
- item.iconPath = '/static/zhandian_xuqin_dingwei.png';
- item.latitude = Number(item.stationLatitude);
- item.longitude = Number(item.stationLongitude);
- item.width = 35;
- item.height = 52;
- // 创建符合 markers 格式的对象
- const markerItem = {
- id: item.id,
- iconPath: item.iconPath,
- latitude: item.latitude,
- longitude: item.longitude,
- width: item.width,
- height: item.height,
- customCallout: {
- anchorY: 0, // Y轴偏移量
- anchorX: 0, // X轴偏移量
- display: 'ALWAYS' // 一直展示
- },
- stationType: item.stationType,
- stationName: item.stationName,
- stationCode: item.stationCode,
- joinCluster: true // 是否参与点聚合
- };
- this.markers.push(markerItem);
- }
- }
- } else {
- this.markers = this.markers.filter((item)=>{
- return item.stationType !== 'livestock'
- })
- }
- }
+ }
}
}
@@ -418,7 +442,6 @@
+
\ No newline at end of file