<!-- * @Description: 环监设备图层 * @Author: 王晓颖 * @Date: 2021-08-09 15:27:40 --> <template> </template> <script> import { getDeviceList, getDeviceData } from '@/api/environment/device' import Leaflet from 'leaflet' import commonMixin from '@/components/mapWindow/base/mixins/common.js' export default { name: "deviceLayer", mixins: [commonMixin('layer')], props: { show: { type: Boolean, default: true }, // 是否显示 iconSize: { type: Array, default: () => { return [30, 30] } }, // 图标大小 iconAnchor: { type: Array, default: () => { return [-15, 15] } }, // 图标位移 popupAnchor: { type: Array, default: () => { return [30, 0] } }, // 弹窗位移 refreshTime: { type: Number, default: 60 } // 定时刷新时间 }, data(){ return { deviceOnlineList: [], deviceOfflineList: [], deviceOnlineLayer: null, // 在线设备图层 deviceOfflineLayer: null, // 离线设备图层 layerGroup: [], // 图层组 deviceOnlineIcon: require('@/assets/map/device-online.png'), deviceOfflineIcon: require('@/assets/map/device-offline.png'), } }, methods:{ load () { console.log('load caseLayer') if (this.show) { this.initLayer() } }, // 初始化图层 initLayer () { const {map} = this // 初始化图层组 /* eslint-disable new-cap */ this.layerGroup = [] this.deviceOnlineLayer = new Leaflet.layerGroup().addTo(map) this.deviceOfflineLayer = new Leaflet.layerGroup().addTo(map) this.layerGroup.push(this.deviceOnlineLayer) this.layerGroup.push(this.deviceOfflineLayer) console.log('initLayer') this.loadData() }, // 加载数据 loadData(){ getDeviceList(this.listQuery).then(response => { this.list = response.data this.deviceOnlineList = this.list.filter(item=>item.online=='1') this.deviceOfflineList = this.list.filter(item=>item.online=='0') console.log('在线数据', this.deviceOnlineList); console.log('离线数据', this.deviceOfflineList); this.addPointOnMap(this.deviceOnlineList,this.deviceOnlineLayer,this.deviceOnlineIcon) this.addPointOnMap(this.deviceOfflineList,this.deviceOfflineLayer,this.deviceOfflineIcon) }) // this.list = [ // {id:"1", deviceNo:"2021030803100001", deviceName:"王泥岭", area:'崇仁县', online:'1', deptName:"城管局", areaCode:'361024', lat:27.75962, lng:116.06021, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"}, // {id:"2", deviceNo:"2021030803100002", deviceName:"王泥岭", area:'崇仁县', online:'1', deptName:"城管局", areaCode:'361024', lat:27.77740600, lng:116.05673800, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"}, // {id:"3", deviceNo:"2021030803100003", deviceName:"王泥岭", area:'崇仁县', online:'1', deptName:"城管局", areaCode:'361024', lat:27.77740600, lng:116.05673800, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"}, // {id:"4", deviceNo:"2021030803100004", deviceName:"王泥岭", area:'崇仁县', online:'1', deptName:"城管局", areaCode:'361024', lat:27.77740600, lng:116.05673800, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"}, // {id:"5", deviceNo:"2021030803100005", deviceName:"王泥岭", area:'崇仁县', online:'2', deptName:"城管局", areaCode:'361024', lat:27.77740600, lng:116.05673800, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"}, // {id:"6", deviceNo:"2021030803100006", deviceName:"王泥岭", area:'崇仁县', online:'2', deptName:"城管局", areaCode:'361024', lat:27.77740600, lng:116.05673800, notes:"无", position:"王泥岭", ts:"2021-01-12", deptid:'24', installDate:"2021-07-01"} // ] }, // 将点加到地图上 addPointOnMap: function (list, layer, iconType) { const {iconSize, iconAnchor, popupAnchor} = this layer.clearLayers() // 图标 const icon = Leaflet.icon({ iconUrl: iconType, iconSize: iconSize, iconAnchor: iconAnchor, popupAnchor: popupAnchor }) list.forEach(detail => { // let popupStr = '<div class="popup-div">' + // '<div class="popup-title">站点详细信息</div>' + // '<div class="dashed-line"></div>' + // '<div class="popup-item"><label>点位名称</label>' + detail.deviceName + '</div>' + // '<div class="popup-item"><label>设备编号</label>' + detail.deviceNo + '</div>' + // '<div class="popup-item"><label>详细地址</label>' + detail.position + '</div>' + // '<div class="popup-item"><label>权属单位</label>' + detail.deptName + '</div>' + // '<div class="popup-item"><label>在线状态</label>' + (detail.online==='1'?'在线':'离线') + '</div>' // popupStr += '</div>' // const popup = Leaflet.popup().setContent(popupStr) if (detail.lng > 0 && detail.lat > 0) { // 添加marker const marker = Leaflet.marker([detail.lat, detail.lng], { icon: icon, id:detail.id, deviceNo: detail.deviceNo, detail: detail, zIndexOffset: 100000 }).addTo(layer) marker.on('click', e => { // 获取数据详情 if (e.target.dragging._marker._popup) { e.target.dragging._marker.unbindPopup() } var id = e.target.options.id getDeviceData({id:id}).then(res=>{ const data = res.data let popupStr = '<div class="popup-div">' + '<div class="popup-title">站点详细信息</div>' + '<div class="dashed-line"></div>' + '<div class="popup-item"><label>点位名称</label>' + detail.deviceName + '</div>' + '<div class="popup-item"><label>设备编号</label>' + detail.deviceNo + '</div>' + '<div class="popup-item"><label>详细地址</label>' + detail.position + '</div>' + '<div class="popup-item"><label>权属单位</label>' + detail.deptName + '</div>' + '<div class="popup-item"><label>在线状态</label>' + (detail.online==='1'?'在线':'离线') + '</div>'+ '<div class="popup-item"><label>更新时间</label>' + (data.ts==''?'尚无':data.ts) + '</div>'+ '<div class="data-div">'+ '<div class="data-item"><span class="sp1">pm2.5</span><span class="sp2">' + (data.pm25==''?'--':data.pm25) + '</span><span class="sp3">ug/m³</span></div>'+ '<div class="data-item"><span class="sp1">pm10</span><span class="sp2">' + (data.pm10==''?'--':data.pm10) + '</span><span class="sp3">ug/m³</span></div>'+ '<div class="data-item"><span class="sp1">TSP</span><span class="sp2">' + (data.tsp==''?'--':data.tsp) + '</span><span class="sp3">ug/m³</span></div>'+ // '<div class="data-item"><span class="sp1">噪声</span><span class="sp2">' + (data.noise==''?'--':data.noise) + '</span><span class="sp3">db</span></div>'+ '<div class="data-item"><span class="sp1">风速</span><span class="sp2">' + (data.windSpeed==''?'--':data.windSpeed) + '</span><span class="sp3">m/s</span></div>'+ '<div class="data-item"><span class="sp1">风力</span><span class="sp2">' + (data.windPower==''?'--':data.windPower) + '</span><span class="sp3">级</span></div>'+ '<div class="data-item"><span class="sp1">风向</span><span class="sp2">' + (data.windDirection==''?'--':data.windDirection) + '</span><span class="sp3">°</span></div>'+ '<div class="data-item"><span class="sp1">温度</span><span class="sp2">' + (data.temperature==''?'--':data.temperature) + '</span><span class="sp3">℃</span></div>'+ '<div class="data-item"><span class="sp1">湿度</span><span class="sp2">' + (data.humidity==''?'--':data.humidity) + '</span><span class="sp3">%RH</span></div>'+ '<div class="data-item"><span class="sp1">气压</span><span class="sp2">' + (data.pressure==''?'--':data.pressure) + '</span><span class="sp3">kpa</span></div>' popupStr += '</div></div>' var popup = L.popup().setContent(popupStr) e.target.dragging._marker.bindPopup(popup, { minWidth: 330 }).openPopup() }) // console.log(detail.carId) // document.getElementById('btntrail_' + detail.carId).onclick = () => { // // this.trail(e.sourceTarget.options.slug.carId, e.sourceTarget.options.slug) // this.trail(e.sourceTarget.options.slug.carId, carType) // } }) } }) }, } } </script> <style rel="stylesheet/scss" lang="scss" > .data-div{ display:flex; align-items: flex-start; flex-wrap: wrap; .data-item{ width:30%; margin:5px; padding:5px; border: 1px solid #e4e7ed; background-color: #e4e7ed; border-radius: 5px; .sp1{ display: block; color:#606266; font-size: 12px; text-align: left; line-height: 1.1; } .sp2{ display: block; font-size: 16px; color: #67c23a; font-weight: bolder; text-align: center; line-height: 1.3; } .sp3{ display: block; font-size: 12px; text-align: right; line-height: 1.1; } } } </style>