Newer
Older
baseResourceFront / src / views / overview / track.vue
zhangyingjie on 22 Mar 2021 6 KB 原车辆子系统代码提交
<template>
  <div id="overview" class="app-container">
    <div id="map">
      <!--查询结果Table显示-->
      <div slot="header" class="rightcard" >
        <el-row>
          <el-col :span="3" :offset="1">
            <div style="font-size: 14px;padding-top: 10px;padding-left: 5px">刷新时间</div>
          </el-col>
          <el-col :span="9" style="padding-top: 12px;padding-left: 10px">
            <el-radio-group v-model="refresh" @change="clicktime">
              <el-radio label="5">5秒</el-radio>
              <el-radio label="10">10秒</el-radio>
              <el-radio label="30">30秒</el-radio>
            </el-radio-group>
          </el-col>
          <el-col :span="4" style="padding-top: 4px;padding-left: 18px">
            <el-button type="primary" size="small" @click="fetchData">立即刷新</el-button>
          </el-col>
          <el-col :span="4" style="padding-top: 10px">
            <label style="font-size: 14px;padding-left: 10px;color: red">{{ sec }}</label>
            <label style="font-size: 14px">秒后刷新</label>
          </el-col>
        </el-row>
      </div>
    </div>
  </div>
</template>
<script>
import { track } from '@/api/overview'
import L from 'leaflet'
import 'leaflet/dist/leaflet.css'
export default {
  name: 'Track',
  data() {
    return {
      dialogFormVisible: false, // 是否显示编辑框
      refresh: '10',
      showtable: true,
      id: '',
      marker: null,
      label: null,
      baselayer: [],
      map: null,
      total: 0, // 数据总数
      sec: 10, // 数据总数
      fullscreenLoading: false, // 全屏加载动画
      cartypelist: [], // 类型列表
      deptlist: [] // 类型列表
    }
  },
  watch: {
    sec(val) {
      if (val === 0) {
        this.sec = Number(this.refresh)
        this.fetchData()
      }
    }
  },
  mounted() {
    if (this.$route.query) {
      this.id = this.$route.query.id
    }
    this.initMap()
    this.fetchData()
    this.timer = setInterval(() => {
      this.sec--
    }, 1000)
  },
  methods: {
    initMap() {
      track(this.id).then(response => {
        var data = response.data
        var map
        if (data.lat !== '') {
          map = L.map('map', {
            minZoom: 3,
            maxZoom: 14,
            center: [data.lat, data.lng],
            zoom: 12,
            zoomControl: false,
            attributionControl: false,
            crs: L.CRS.EPSG3857
          })
        } else {
          map = L.map('map', {
            minZoom: 3,
            maxZoom: 11,
            center: [27.75962, 116.06021],
            zoom: 12,
            zoomControl: false,
            attributionControl: false,
            crs: L.CRS.EPSG3857
          })
        }
        this.map = map // data上需要挂载
        window.map = map
        this.baselayer.push(L.tileLayer(
          'https://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=216ee92889e17ab1b083fae665d522b8',
          { subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'] }
        ).addTo(map))
        this.baselayer.push(L.tileLayer(
          'https://t0.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=216ee92889e17ab1b083fae665d522b8',
          { subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'] }
        ).addTo(map))
      })
    },
    clicktime() {
      this.sec = Number(this.refresh)
    },
    fetchData() {
      track(this.id).then(response => {
        var data = response.data
        if (this.marker != null) {
          this.marker.remove()
          this.label.remove()
        }
        var Icon
        if (data.status === '') {
          return
        } else if (data.status === '离线') {
          Icon = L.icon({
            iconUrl: require('../../assets/global_images/car-offline.png'),
            iconSize: [40, 40]
          })
        } else if (data.status === '超时') {
          Icon = L.icon({
            iconUrl: require('../../assets/global_images/car-timeout.png'),
            iconSize: [40, 40]
          })
        } else if (data.status === '停车') {
          Icon = L.icon({
            iconUrl: require('../../assets/global_images/car-stop.png'),
            iconSize: [40, 40]
          })
        } else if (data.status === '行驶') {
          Icon = L.icon({
            iconUrl: require('../../assets/global_images/car-online.png'),
            iconSize: [40, 40]
          })
        } else if (data.status === '报警') {
          Icon = L.icon({
            iconUrl: require('../../assets/global_images/car-alarm.png'),
            iconSize: [40, 40]
          })
        }
        var str = '<div style="font-size: 15px;padding: 6px"> <div style="font-weight: bold;padding-bottom: 10px">车辆位置概要信息</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">描述</label>' + data.description + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">类型</label>' + data.carTypeName + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">单位</label>' + data.deptName + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">状态</label>' + data.status + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">定位</label>' + data.lng + ' , ' + data.lat + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">时间</label>' + data.upTime + '</div>' +
          '<div style="padding-bottom: 6px"><label style="font-weight: bold;padding-right: 15px">速度</label>' + data.speed + '(km/h)</div></div>'
        var myIcon = L.divIcon({
          html: '<div style="font-size: 13px;font-weight: bold;padding-top: 17px;text-align:center;"> ' + data.deptName + '_' + data.description + '</div>',
          className: '',
          iconSize: [100, 15]
        })
        this.label = L.marker([data.lat, data.lng], { icon: myIcon }).addTo(this.map)
        var popup = L.popup().setContent(str)
        this.marker = L.marker([data.lat, data.lng], {
          icon: Icon,
          slug: data,
          rotationAngle: data.direction
        }).addTo(this.map).bindPopup(popup)
        this.map.setView({ lat: data.lat, lng: data.lng })
      })
    }
  }
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
  .rightcard{
    width: 600px;
    height: 40px;
    z-index: 10000;
    position: absolute;
    left:500px;
    top:20px;
    background-color: rgba(238, 238, 238, 0.93);
  }
  #map {
    width:100%;
    height:80vh;
  }
</style>