Newer
Older
cockpit_hxrq_front / src / components / Map / components / routeLayer.vue
<!--
 * @Description: 巡线图层
 * @Author: 王晓颖
 * @Date: 2021-06-04 09:09:15
 -->
<template>
  <div>
    <slot/>
  </div>
</template>

<script>
import commonMixin from '../base/mixins/common.js'
import { getRoutesData } from '@/api/pipe'
import { getToday } from '@/utils/dateutils'
export default {
  name: 'RouteLayer',
  mixins: [commonMixin('layer')],
  props: {
    size: {
      type: String,
      default: ''
    }, // 颜色类型:single单色柱,multi多色柱
    height: {
      type: Number,
      default: 10
    }, // 偏移值
    show: {
      type: Boolean,
      default: false
    } // 是否可见
  },
  data() {
    return {
      layer: null, // 图层
      data: [], // 完整数据
      filteredData: [] // 过滤后的数据
    }
  },
  watch: {
    show(val) {
      console.log('watch show: ' + val)
      if (val) {
        this.initLayer()
      } else {
        this.removeLayer()
      }
    }
  },
  methods: {
    load() {
      console.log('load')
      if(this.show){
        this.initLayer()
      }
    },
    initLayer() {
      const { mars3d, map } = this
      if (map) {
        if (this.show) {
          if (this.layer) {
            this.removeLayer()
          }
        }
        const graphicLayer = new mars3d.layer.DivLayer()
        graphicLayer.on(mars3d.EventType.click, event => {
          console.log('单击了巡检人员', event)
        })
        graphicLayer.bindPopup(event => {
          const route = event.graphic.attr
          const html =
            '<div>姓名:' + route.name +
            '<br/>电话:' + route['phone'] +
            '<br/>岗位:' + route['duty'] +
            '<br/>站名:' + route['unitname'] +
            '<br/>时间:' + route.locationdate + '</div>'
          return html
        })
        this.layer = graphicLayer
        map.addLayer(graphicLayer)
        this.loadData()
      }
    },
    loadData() {
      const { mars3d, Cesium, layer, height } = this
      const date = getToday()
      getRoutesData(date).then((res) => {
        if (res.status === 200) {
          const data = res.data.map(item => {
            return {
              name: item['WD60_03'],
              lng: parseFloat(item['WD60_05']),
              lat: parseFloat(item['WD60_06']),
              locationdate: item['WD60_04'],
              time: new Date(item['WD60_04']),
              duty: item['WD60_11'] === null ? '' : item['WD60_11'],
              sex: item['WD60_09'] === null ? '' : item['WD60_09'],
              phone: item['WD60_10'] === null ? '' : item['WD60_10'],
              idcard: item['WD60_12'] === null ? '' : item['WD60_12'],
              unitname: item['WD60_08'] === null ? '' : item['WD60_08']
            }
          })
          this.filteredData = []
          // 遍历所有数据,去除重复数据
          for (const route of data) {
            // 去filteredData里查找是否有同一个人
            const result = this.filteredData.findIndex(item => item.name == route.name && item.phone == route.phone)
            if (result === -1) { // 查找不到直接添加
              this.filteredData.push(route)
            } else { // 查找到,对比时间,时间大则替换
              if (this.filteredData[result].time < route.time) {
                this.filteredData.splice(result, 1, route)
              }
            }
          }
          // 遍历过滤后的数据,添加到地图
          for (const route of this.filteredData) {
            const graphic = new mars3d.graphic.DivGraphic({
              position: [route.lng, route.lat, height],
              style: {
                html: '<img src="static/images/map/pe02.gif" style="width:25px;height:25px;" ></img>',
                distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 2000000), // 按视距距离显示
                horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                verticalOrigin: Cesium.VerticalOrigin.CENTER,
                attr: route
              },
              attr: route,
              pointerEvents: true // false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
            })
            layer.addGraphic(graphic)
          }
        }
      })
    },
    // 移除图层
    removeLayer() {
      const { map, layer } = this
      if (this.layer) {
        map.removeLayer(layer)
        this.layer = null
      }
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>

</style>