派生自 wuyushui/SewerAndRainNetwork

陈泽平
2021-05-21 071cbd45b47629736a983ed9acb90343430778c3
src/components/LayerController/service/LayerFactory.js
@@ -1,7 +1,13 @@
import WfsLayerService from './WfsLayerService'
import { logicMapper, SERVICE_TYPE } from '../../../conf/Constants'
import WmsLayerService from './WmsLayerService'
import { clone } from '../../../utils/utils'
import { logicMapper } from '../../../conf/Constants'
/**
 *  init 只初始化一次
 *  start 每次调用图层显示show()时,都会调用
 *  destory 每次调用图层隐藏hide()时,都会调用
 *
 */
class LayerFactory {
  constructor (options) {
    this.L = options.L
@@ -9,9 +15,18 @@
    this.layers = {}
    this.layersLogic = {}
    this.minZoomLayers = {}
    this.wmsLayers = []
    this.wmsLayerService = null
  }
  init (layerConfig) {
    // wms服务只需要初始化一次
    this.wmsLayerService = new WmsLayerService()
    this.wmsLayerService.init()
    this.initConfig(layerConfig)
  }
  initConfig (layerConfig) {
    // 1. 遍历layer config
    if (layerConfig) {
      for (var i = 0; i < layerConfig.length; i++) {
@@ -19,8 +34,13 @@
        var layers = config.layers
        var childLayer = config.childLayer
        var checked = config.checked
        layers && this.init(config.layers)
        childLayer && this.init(config.childLayer)
        /* if (config.groupName) {
          const wmsGroupLayerService = new WmsLayerGroupService(config)
          wmsGroupLayerService.init()
          continue
        } */
        layers && this.initConfig(config.layers)
        childLayer && this.initConfig(config.childLayer)
        this.initMinZoom(config)
        this.loadLogic(config)
@@ -44,8 +64,7 @@
  loadLogic (config) {
    var code = config.code
    var wfs = config.wfs
    var wms = config.wms
    var type = config.type
    const file = logicMapper[code]
    var logic = this.layersLogic[code]
@@ -53,16 +72,22 @@
      if (file) {
        var BusiLayer = require('../logic/' + file)
        logic = new BusiLayer()
      } else if (wfs) {
      } else if (type === SERVICE_TYPE.WFS) {
        logic = new WfsLayerService(config)
      } else if (wms) {
        logic = new WmsLayerService(config)
      }
    }
    this.layersLogic[code] = logic
    return logic
  }
  /**
   * 1. 先调用处理逻辑的 initLayer ,如果没有 就创建一个 featureGroup
   * 2. 如果存在事件逻辑的话,绑定tooltip,click事件
   * 3. 将layer添加到map
   * 4. 返回layer
   * @param config
   * @returns layer
   */
  addLayer (config) {
    var code = config.code
    var logic = this.loadLogic(config)
@@ -81,17 +106,45 @@
    return layer
  }
  showAll (configs) {
    if (Array.isArray(configs)) {
      for (let i = 0; i < configs.length; i++) {
        const config = configs[i]
        this.show(config)
      }
      this.wmsLayerService && this.wmsLayerService.addAll(configs)
    }
  }
  /**
   * 如果 存在已经加载了的对象,就直接加到map
   * 如果 不存在则 调用 addLayer 及 逻辑类的init 进行初始化操作
   * 如果 存在start函数,则调用
   * @param config
   */
  show (config) {
    var index = config.index
    var layer = this.layers[config.code]
    var logic = this.loadLogic(config)
    if (layer) {
      if (!this.map.hasLayer(layer)) {
        index && layer.setZIndex(index)
        layer.addTo(this.map)
      }
    } else {
      logic && logic.init(this.addLayer(config), this.L)
    }
    logic && logic.create && logic.create()
    logic && logic.start && logic.start()
    this.wmsLayerService && this.wmsLayerService.add(config)
  }
  hideAll (configs) {
    if (Array.isArray(configs)) {
      for (let i = 0; i < configs.length; i++) {
        this.hide(configs[i])
      }
      this.wmsLayerService && this.wmsLayerService.removeAll(configs)
    }
  }
  hide (config) {
@@ -100,6 +153,7 @@
    layer && this.map.removeLayer(layer)
    const logic = this.loadLogic(config)
    logic && logic.destory && logic.destory()
    this.wmsLayerService && this.wmsLayerService.remove(config)
  }
  /**
@@ -107,7 +161,7 @@
     * @param layerConfig
     */
  initEvent (layerConfig) {
    this.map.on('zoomend ', () => this.toggleByZoom())
    // this.map.on('zoomend ', () => this.toggleByZoom())
  }
  toggleByZoom () {
@@ -117,87 +171,14 @@
      for (var j in configs) {
        const config = configs[j]
        const checked = config.checked
        console.log(zoom)
        console.log(k)
        // console.log(zoom)
        // console.log(k)
        if (checked && zoom > k) {
          this.show(config)
        } else if (checked && zoom < k) {
          this.hide(config)
        }
      }
    }
  }
  /**
   *
   * 根据传的 feature对象定位,
   * @param code
   * @param feature
   */
  flyByFeature (feature, code) {
    const type = feature.geometry.type
    var point = []
    switch (type) {
      case 'Point':
        point = clone(feature.geometry.coordinates)
        break
      case 'MultiLineString':
        var coordinates = feature.geometry.coordinates
        point = coordinates[parseInt(coordinates.length / 2)][0]
        break
    }
    window.map.flyTo(point.reverse(), 15)
    code && this.openPopup(code, feature.id)
  }
  openPopup (layerId, id) {
    const layer = this.layers[layerId]
    if (layer.eachLayer) {
      layer.eachLayer(function (layer) {
        const layers = layer.getLayers()
        for (var i = 0; i < layers.length; i++) {
          const lay = layers[i]
          const feature = lay.feature
          lay.closePopup()
          if (feature.id === id) {
            lay.openPopup()
            break
          }
        }
      })
    }
    /* for (var k in this.layers) {
          var layerGroup = this.layers[k]
          layerGroup.eachLayer(function (layer) {
            console.log(layer)
            console.log(layer.getAttribution())
          })
          var layers = layerGroup.getLayers()
          if (layers) {
            for (var m = 0; m < layers.length; m++) {
              var layer = layers[m]
              console.log(layer)
              console.log(layer.getLayerId(val.id))
              /!* var feature = layer.feature
              if (feature.id === layerId) {
                this.map.flyToBounds(bound)
                return layer
              } *!/
            }
          }
        } */
    return null
  }
  findLayerById (layer, id) {
    const layers = layer.getLayers
    if (layers) {
      this.findLayerById(layer.getLayers(), id)
    } else {
      layer.eachLayer(function (layer) {
        console.log(layer)
      })
    }
  }
}