Newer
Older
dcms_front / src / views / baseSource / overview.vue
StephanieGitHub on 18 Mar 2021 4 KB MOD:优化地图查询
<!-- 图层浏览 -->
<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 {
      layers: this.baseConfig.layers, // 图层列表
      selectLayers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], // 选中图层列表
      map: null, // 地图对象
      maps: [], // 地图图层
      parts: [] // 部件图层
    }
  },
  computed: {
    ...mapGetters([
      'baseUrl',
      'partsUrl',
      'partsAllUrl',
      'mapUrl'
    ])
  },
  mounted() {
    this.init()
  },
  methods: {
    // 部件图层切换
    layerChange(node, checked) {
      const selectItem = this.layers.filter(item => item.name === node.name)[0]
      // 如果选中底图,选中添加,没选中移除
      if (selectItem.type === 'map') {
        if (!checked) {
          for (const item of this.maps) {
            this.map.removeLayer(item)
          }
        } else {
          for (const item of this.maps) {
            this.map.addLayer(item)
          }
        }
      } else if (node.type === 'layer') { // 其他图层
        if (!checked) {
          for (let i = 0; i < selectItem.domain.length; i++) {
            this.map.removeLayer(this.parts[selectItem.domain[i] - 1])
          }
        } else {
          for (let i = 0; i < selectItem.domain.length; i++) {
            this.map.addLayer(this.parts[selectItem.domain[i] - 1])
          }
        }
      }
    },
    // 地图初始化
    init() {
      const map = L.map('map', {
        minZoom: 4,
        maxZoom: 21,
        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
      // 添加底图图层
      for (let i = 0; i <= 21; i++) {
        const item = { url: `${this.baseUrl}${this.mapUrl}/${i}` }
        this.maps.push(esri.featureLayer(item).addTo(map))
      }
      // 添加部件图层
      const partsLayer = this.baseConfig.partsLayer
      for (const parent of partsLayer) { // 遍历大类
        const childs = parent.children
        for (const child of childs) { // 遍历小类
          const item = { url: `${this.baseUrl}${this.partsUrl}/${child.layer}`, minZoom: 18 }
          console.log(item)
          var layer = esri.featureLayer(item).addTo(map)
          // 点击部件事件
          layer.on('click', function(e) {
            // 获取要素的属性
            const properties = e.layer.feature.properties
            // 弹窗样式
            var str = `<div class="pop-window">
                        <div class="pop-title">
                          ${properties['小类名称']}
                        </div>
                        <div class="pop-line"><col>大类:</col>${properties['大类名称']}</div>
                        <div class="pop-line"><col>小类:</col>${properties['小类名称']}</div>
                        <div class="pop-line"><col>部件编码:</col>${properties['编码']}</div>
                        <div class="pop-line"><col>权属单位:</col>${properties['权属单位'] ? properties.权属单位 : '未知'}</div>
                        <div class="pop-line"><col>详细地址:</col>${properties['详细地址'] ? properties.详细地址 : '未知'}</div>
                      <div>`
            var popup = L.popup().setContent(str)
            e.layer.dragging._marker.bindPopup(popup, { minWidth: 200 }).openPopup()
          })
          this.parts.push(layer)
        }
      }
    }
  }
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
  .leaflet_container{
    width: calc( 100% - 158px );
    height: 83vh;
    background-color: white;
  }
</style>