Newer
Older
smartcity_env_front / src / views / overview / component / deviceLayer.vue
dutingting on 18 Jan 9 KB 环境系统去掉噪声
<!--
 * @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>