You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.0 KiB
Vue

<!--
* @Author: chris
* @Date: 2025-01-13 16:31:10
* @LastEditors: chris
* @LastEditTime: 2026-01-19 15:07:11
-->
<script setup>
import { BmMarker, BmInfoWindow } from 'vue-baidu-map-3x'
const props = defineProps({
deviceList: {
type: Array,
default: () => []
},
currentDevice: {
type: Object,
default: () => null
}
})
const Map = ref(null)
const pestMap = ref(null)
const baiduMapConfig = {
center: '汕头市潮南区雷岭镇',
zoom: 12,
}
const winInfo = ref({
open: false,
lat: 0,
lng: 0,
content: ''
})
const mapDevices = computed(() => {
if (!Map.value) return []
return props.deviceList.map(item => {
const [lng, lat] = item.installPointDes.split(',')
return Object.assign({}, item, {
point: new Map.value.Point(lng, lat),
open: false
})
})
})
watch(() => props.currentDevice, (newVal) => {
if(!pestMap.value || !props.currentDevice) return
const device = mapDevices.value.find(item => item.deviceAddr === newVal.deviceAddr)
device && pestMap.value.flyTo(device.point, 16)
})
function mapReady({BMap, map}) {
console.log(BMap, map)
pestMap.value = map;
Map.value = BMap;
map.enableScrollWheelZoom(true)
// const overlays = map.getOverlays()
// const points = overlays.map(item => item.latLng)
// const viewport = map.getViewport(points)
// map.setViewport(viewport)
}
function mapZoomEnd({target}) {
target.setTilt(45)
}
function markerClick(e, item) {
console.log(item, e)
const deviceType = item.deviceType === '1' ? '虫情监测' : item.deviceType === '2' ? '土壤墒情监测' : '气象视频监测'
// 类型 1: 虫情检测 2:土壤墒情监测 3:气象视频监测
winInfo.value = {
open: true,
lat: e.latLng.lat,
lng: e.latLng.lng,
content: `<p style="font-size: 16px; margin-bottom: 10px;font-weight: bold; color: #333;">${deviceType}设备</p>
<p style="font-size: 14px; color: #666;">设备编号${item.deviceNo}</p>
<p style="font-size: 14px;">设备状态<span style="color: ${item.status === '1' ? 'green' : 'red'};">${item.status === '1' ? '在线' : '离线'}</span></p>`
}
}
</script>
<template>
<div class="device-map" >
<baidu-map class="map" :center="baiduMapConfig.center" :zoom="baiduMapConfig.zoom" @ready="mapReady" @zoomend="mapZoomEnd">
<bm-marker v-for="item in mapDevices" :key="item.deviceAddr" :position="{lng: item.point.lng, lat: item.point.lat}" @click="markerClick($event, item)" >
</bm-marker>
<bm-info-window :show="winInfo.open" :position="{lng: winInfo.lng, lat: winInfo.lat}" :offset="{width: -20, height: -25}">
<div class="device-info" v-html="winInfo.content || '暂无数据'"></div>
</bm-info-window>
</baidu-map>
</div>
</template>
<style lang="scss" scoped>
.device-map {
// @apply mx-[-19px] my-[-15px];
@apply p-18px;
}
.device-map, .map {
@apply w-full h-full;
}
.map {
@apply rounded-8px overflow-hidden;
}
:deep(.anchorBL) {
display: none;
}
.device-info {
@apply p-12px;
}
</style>