<template> <view class="page"> <u-navbar is-back="false" :title="title" :border-bottom="false" :background="bgc" title-color='#000' title-size='36' :title-bold='true' height='45' id="navbar"> </u-navbar> <map class="map" id="map" ref="map" :scale="zoomSize" :latitude="latitude" :longitude="longitude" :show-location='true' :markers="covers" @markertap="handleMarkerClick"></map> <view class="fxtongji"> <view class="one"> <image src="https://api.ccttiot.com/smartmeter/img/static/uB2k1NNeN2QUuSZIAf5r" mode=""></image> <text class="wz">蜂场</text> <text class="shu">{{listmap.length}}</text> </view> <view class="two"> <image src="https://api.ccttiot.com/smartmeter/img/static/ukbyhyrDcp3VzgyeJo2G" mode=""></image> <text class="wz">蜂箱</text> <text class="shu">{{listmaps.length}}</text> </view> </view> <tab-bar :indexs='3' style=""></tab-bar> <!-- <span style="">福鼎蜂场</span> --> </view> </template> <script> export default { data() { return { bgc: { backgroundColor: " #F4FAF8", }, title: "地图", latitude: '', longitude: '', isMap: false, zoomSize: 15, markers: [], jinweidu:'', covers: [], mapContext: null, mapScaleInterval: null, listmap:[], listmaps:[] } }, onLoad() { }, onShow() { this.getMyLocation() this.getMyLocations() }, onReady() { this.mapContext = uni.createMapContext('map', this) this.mapScaleInterval = setInterval(this.updateMarkers, 1000) }, beforeDestroy() { if (this.mapScaleInterval) { clearInterval(this.mapScaleInterval) this.mapScaleInterval = null } }, methods: { // 点击地图图标 handleMarkerClick(e) { console.log(e.markerId); }, getMyLocations() { uni.getLocation({ type: 'wgs84', success: (res) => { this.jinweidu = res.longitude + ',' + res.latitude this.latitude = Number(res.latitude.toFixed(5)) - 0.004 this.longitude = Number(res.longitude.toFixed(5)) + 0.004 // this.setMapScale() this.$u.get("/farm/beehive/listNearBy?center=" + this.jinweidu + '&radius=' + 1000).then( res => { if (res.code == 200) { this.listmaps = res.data res.data.forEach(item => { this.covers.push({ id: parseFloat(item.beehiveId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/ukbyhyrDcp3VzgyeJo2G', label: { content: item.name, anchorX: (() => { if (item.name.length <= 2) { return -12 } else if (item.name.length <= 3) { return -20 } else if (item.name.length <= 4) { return -25 } else if (item.name.length <= 5) { return -30 } else if (item.name.length <= 6) { return -35 } else if (item.name.length <= 8) { return -40 } else if (item.name.length <= 10) { return -45 } else { return -item.name.length * 5 } })(), fontWeight: 700, color: '#FFCC25', textShadow: '2px 2px 0px white, -2px -2px 0px white, 2px -2px 0px white, -2px 2px 0px white', borderColor:'#fff', borderRadius:5, } }) // this.covers.push(shopCover) }); } }) }, fail: (err) => { console.error('获取位置失败:', err) } }); }, getMyLocation() { uni.getLocation({ type: 'wgs84', success: (res) => { this.jinweidu = res.longitude + ',' + res.latitude this.latitude = Number(res.latitude.toFixed(5)) - 0.004 this.longitude = Number(res.longitude.toFixed(5)) + 0.004 this.$u.get("/farm/apiary/listNearBy?center=" + this.jinweidu + '&radius=' + 1000).then( res => { if (res.code == 200) { this.listmap = res.data res.data.forEach(item => { this.covers.push({ id: parseFloat(item.apiaryId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uYrX2QTRLdVVDTB3E5cp', label: { content: item.name, anchorX: (() => { if (item.name.length <= 2) { return -12 } else if (item.name.length <= 3) { return -20 } else if (item.name.length <= 4) { return -25 } else if (item.name.length <= 5) { return -30 } else if (item.name.length <= 6) { return -35 } else if (item.name.length <= 8) { return -40 } else if (item.name.length <= 10) { return -45 } else { return -item.name.length * 5 } })(), fontWeight: 700, color: '#FFCC25', textShadow: '2px 2px 0px white, -2px -2px 0px white, 2px -2px 0px white, -2px 2px 0px white', borderColor:'#fff', borderRadius:5, } }) }) } }) }, fail: (err) => { console.error('获取位置失败:', err) } }); }, // 缩放显示隐藏 updateMarkers() { this.mapContext.getScale({ success: (res) => { this.covers = [] if (res.scale <= 14) { this.addMarkersWithoutLabels() } else { this.addMarkersWithLabels() } }, fail: (error) => { // console.error('获取地图缩放级别失败:', error); }, }); }, addMarkersWithoutLabels() { this.listmap.forEach((item) => { this.covers.push({ id: parseFloat(item.storeId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uYrX2QTRLdVVDTB3E5cp', borderColor:'#fff', borderRadius:5, // bgColor: 'rgba(255, 255, 255, 0.7)' }) // this.covers.push(shopCover) }); this.listmaps.forEach((item) => { this.covers.push({ id: parseFloat(item.storeId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/ukbyhyrDcp3VzgyeJo2G', borderColor:'#fff', borderRadius:5, // bgColor: 'rgba(255, 255, 255, 0.7)' }) // this.covers.push(shopCover) }); }, addMarkersWithLabels() { this.listmap.forEach((item) => { this.covers.push({ id: parseFloat(item.storeId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uYrX2QTRLdVVDTB3E5cp', label: { content: item.name, anchorX: this.calculateAnchorX(item.name), fontWeight: 700, color: '#FFCC25', textShadow: '2px 2px 0px #000, -2px -2px 0px #000, 2px -2px 0px #000, -2px 2px 0px #000', rotate: 20, borderColor:'#fff', borderRadius:5, // bgColor: 'rgba(255, 255, 255, 0.7)' } }) // this.covers.push(shopCover) }); this.listmaps.forEach((item) => { this.covers.push({ id: parseFloat(item.storeId), latitude: item.lat, longitude: item.lng, width: 25, height: 30, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/ukbyhyrDcp3VzgyeJo2G', label: { content: item.name, anchorX: this.calculateAnchorX(item.name), fontWeight: 700, color: '#FFCC25', textShadow: '2px 2px 0px #000, -2px -2px 0px #000, 2px -2px 0px #000, -2px 2px 0px #000', rotate: 20, borderColor:'#fff', borderRadius:5, // bgColor: 'rgba(255, 255, 255, 0.7)' } }) // this.covers.push(shopCover) }); }, calculateAnchorX(name) { let chineseLength = 0; let englishLength = 0; for (let i = 0; i < name.length; i++) { const charCode = name.charCodeAt(i); if (charCode >= 0x4e00 && charCode <= 0x9fa5) { chineseLength++; } else if (/[a-zA-Z]/.test(name[i])) { englishLength = englishLength + 0.3 } } const totalLength = chineseLength + englishLength * 2 return -totalLength * 7 }, } } </script> <style lang="scss"> page { background-color: #FAFDFD; } .page { // position: relative; width: 750rpx; .fxtongji{ position: fixed; top: 15vh; right: 50rpx; z-index: 99; .one{ display: flex; align-items: center; background-color: rgba(191, 191, 191, 0.4); padding: 4rpx 20rpx; box-sizing: border-box; border-radius: 30rpx; .wz{ color: #3D3D3D; font-size: 32rpx; margin: 0 15rpx; font-weight: 600; } .shu{ color: #FFC107; font-size: 32rpx; } image{ width: 44rpx; height: 44rpx; } } .two{ display: flex; align-items: center; margin-top: 20rpx; background-color: rgba(191, 191, 191, 0.4); padding: 4rpx 20rpx; box-sizing: border-box; border-radius: 30rpx; .wz{ color: #3D3D3D; font-size: 32rpx; margin: 0 15rpx; font-weight: 600; } .shu{ color: #FFC107; font-size: 32rpx; } image{ width: 44rpx; height: 44rpx; } } } .map { width: 750rpx; height: 100vh; } } </style>