Newer
Older
dcms_front / src / views / baseSource / overview.vue
<!-- 图层浏览 -->
<template>
  <app-container>
    <div id="map" class="leaflet_container"/>
    <!--工具箱-->
    <tools-container>
      <!--图层选择工具-->
      <layer-choose :layers="layers" :select-layers="selectLayers" @choose="layerChange"/>
    </tools-container>
  </app-container>
</template>
<script>
import L from 'leaflet'
import ToolsContainer from './components/toolsContainer'
import LayerChoose from './components/layerChoose'
import { mapGetters } from 'vuex'
var esri = require('esri-leaflet')
export default {
  name: 'Overview',
  components: { LayerChoose, ToolsContainer },
  data() {
    return {
      baseLayer: [],
      layers: this.baseConfig.layers, // 图层列表
      selectLayers: [0, 1, 2], // 选中图层列表
      map: null, // 地图对象
      layerGroups: [], // 图层组,用于控制一组内容显示或者隐藏
      maps: [], // 地图图层
      parts: [] // 部件图层
    }
  },
  computed: {
    ...mapGetters([
      'baseUrl',
      'partsUrl',
      'partsAllUrl',
      'shopUrl',
      'mapUrl',
      'gridUrl',
      'mapDtUrl'
    ])
  },
  mounted() {
    this.init()
  },
  methods: {
    // 部件图层切换
    layerChange(node, checked) {
      const selectItem = this.layers.filter(item => item.name === node.name)[0]

      if (!checked) {
        this.map.removeLayer(this.layerGroups[selectItem.id])
      } else {
        this.map.addLayer(this.layerGroups[selectItem.id])
      }
    },
    // 地图初始化
    init() {
      const map = L.map('map', {
        minZoom: 14,
        maxZoom: 25,
        center: this.baseConfig.center,
        zoom: this.baseConfig.zoom,
        zoomControl: false,
        attributionControl: false,
        crs: L.CRS.EPSG3857
      })
      map.doubleClickZoom.disable() // 禁止双击
      this.map = map // data挂载map
      window.map = map

      // 加载天地图底图和标注
      this.baseLayer.push(L.tileLayer(this.baseConfig.mapUrl).addTo(map))
      this.baseLayer.push(L.tileLayer(this.baseConfig.labelUrl).addTo(map))

      // 构建并加载layerGroup
      /* eslint-disable new-cap */
      this.addMapDtLyaer() // 底图
      this.addGridLayer() // 网格
      this.addShopLayer() // 商户

      // 部件图层组
      for (let i = 3; i < 10; i++) {
        this.addPartsLayer(i)
      }

      // 添加默认显示的图层
      this.selectLayers.forEach(item => {
        this.map.addLayer(this.layerGroups[item])
      })
    },
    // 添加底图图层
    addMapDtLyaer: function() {
      const mapDtGroup = new L.layerGroup() // 创建layerGroup

      // 创建图层并加载到layerGroup中
      const item = { url: `${this.baseUrl}${this.mapDtUrl}` }
      esri.dynamicMapLayer(item).addTo(mapDtGroup)

      this.layerGroups.push(mapDtGroup)
    },
    // 添加网格图层
    addGridLayer: function() {
      const gridGroup = new L.layerGroup() // 创建layerGroup

      // 创建图层并加载到layerGroup中
      const item = { url: `${this.baseUrl}${this.gridUrl}` }
      esri.featureLayer(item).addTo(gridGroup)

      this.layerGroups.push(gridGroup)
    },
    // 添加商户图层
    addShopLayer: function() {
      const shopGroup = new L.layerGroup() // 创建layerGroup

      // 创建图层并加载到layerGroup中
      const item = { url: `${this.baseUrl}${this.shopUrl}` }
      const layer = esri.featureLayer(item).addTo(shopGroup)

      const shopLabel = { url: `${this.baseUrl}${this.mapUrl}/2` }
      esri.featureLayer(shopLabel).addTo(shopGroup)

      const that = this
      layer.on('click', function(e) {
        // 获取要素的属性
        const properties = e.layer.feature.properties

        // 弹窗样式
        const popupStr = '<div class="popup-div">' +
          '<div class="popup-title">商户信息</div>' +
          '<div class="dashed-line"></div>' +
          '<div class="popup-item"><label>商户名称</label>' + properties.dutyname + '</div>' +
          '<div class="popup-item"><label>商户编号</label>' + properties.objid + '</div>' +
          '<div class="popup-item"><label>所在社区</label>' + properties.communame + '</div>' +
          '<div class="popup-item"><label>所在网格编号</label>' + properties.bgid + '</div>' +
          '<div class="popup-item"><label>三包责任单位</label>' + properties.deptname + '</div>' +
          '</div>'
        // 弹出窗口
        L.popup().setContent(popupStr).setLatLng(e.latlng).openOn(that.map)
      })

      this.layerGroups.push(shopGroup)
    },
    addPartsLayer: function(index) {
      const that = this
      const group = new L.layerGroup() // 创建layerGroup

      const domains = this.baseConfig.layers[index].domain
      const minZoom = this.baseConfig.layers[index].minZoom === undefined ? 18 : this.baseConfig.layers[index].minZoom
      domains.forEach(dom => {
        // 创建图层并加载到layerGroup中
        const item = { url: `${this.baseUrl}${this.partsUrl}/${dom}`, minZoom: minZoom }
        const layer = esri.featureLayer(item).addTo(group)

        layer.on('click', function(e) {
          // 获取要素的属性
          const properties = e.layer.feature.properties

          // 弹窗样式
          const popupStr = '<div class="popup-div">' +
            '<div class="popup-title">部件信息</div>' +
            '<div class="dashed-line"></div>' +
            '<div class="popup-item"><label>部件类型</label>' + properties.dl + ' / ' + properties.xl + '</div>' +
            '<div class="popup-item"><label>部件编号</label>' + properties.objid + '</div>' +
            '<div class="popup-item"><label>所在网格编号</label>' + properties.bgid + '</div>' +
            '<div class="popup-item"><label>权属部门</label>' + properties.deptname2 + '</div>' +
            '<div class="popup-item"><label>责任部门</label>' + properties.deptname1 + '</div>' +
            '<div class="popup-item"><label>养护部门</label>' + properties.deptname3 + '</div>' +
            '</div>'
          // 弹出窗口
          L.popup().setContent(popupStr).setLatLng(e.latlng).openOn(that.map)
        })

        that.layerGroups.push(group)
      })
    }
  }
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
  .leaflet_container{
    width: calc( 100vw - 208px );
    height: 83vh;
    background-color: white;
  }
</style>

<style>
  .leaflet-container a.leaflet-popup-close-button {
    top: 5px; /* 修改弹窗关闭按钮样式 */
    right: 10px; /* 修改弹窗关闭按钮样式 */
  }

  .leaflet-popup-content .popup-div {
    font-size: 15px;
    padding: 6px;
  }

  .leaflet-popup-content .popup-title {
    font-weight: bold;
  }

  .leaflet-popup-content .dashed-line {
    border-bottom: 1px dashed #dddddd;
    margin: 10px -10px;
  }

  .leaflet-popup-content .popup-item {
    padding-bottom: 6px;
  }

  .leaflet-popup-content .popup-item label {
    font-weight: bold;
    padding-right: 15px;
  }
</style>