派生自 wuyushui/SewerAndRainNetwork

徐旺旺
2021-04-29 150a37f948214be4bd183b30f3f2865a6f1c519f
src/components/LayerController/service/LayerFactory.js
@@ -1,30 +1,145 @@
import WfsLayerService from './WfsLayerService'
import BusiLayerService from './BusiLayerService'
import WmsLayerService from './WmsLayerService'
import EventLayerService from './EventLayerService'
import { clone } from '../../../utils/utils'
import { logicMapper } from '../../../conf/Constants'
import WmsLayerService from './WmsLayerService'
/**
 *  init 只初始化一次
 *  start 每次调用图层显示show()时,都会调用
 *  destory 每次调用图层隐藏hide()时,都会调用
 *
 */
class LayerFactory {
  constructor (options) {
    this.L = options.L
    this.map = window.map
    this.layers = {}
    this.layersLogic = {}
    this.minZoomLayers = {}
    this.wmsLayers = []
  }
  init (layerConfig) {
    this.initConfig(layerConfig)
    // wms服务只需要初始化一次
    this.wmsLayerService = new WmsLayerService(this.wmsLayers)
    this.wmsLayerService.init()
  }
  initConfig (layerConfig) {
    // 1. 遍历layer config
    if (layerConfig) {
      for (var i = 0; i < layerConfig.length; i++) {
        var config = layerConfig[i]
        var layers = config.layers
        var childLayer = config.childLayer
        var checked = config.checked
        /* if (config.groupName) {
          const wmsGroupLayerService = new WmsGroupLayerService(config)
          wmsGroupLayerService.init()
          continue
        } */
        layers && this.init(config.layers)
        childLayer && this.init(config.childLayer)
        var checked = config.checked
        checked && this.load(config)
        checked && this.toggleZoomByConfig(config)
        this.initMinZoom(config)
        this.loadLogic(config)
        checked && this.show(config)
      }
    }
  }
  initMinZoom (config) {
    const minZoom = parseInt(config.minZoom)
    if (minZoom) {
      var configs = this.minZoomLayers[minZoom]
      if (configs) {
        configs[configs.length] = config
      } else {
        configs = [config]
      }
      this.minZoomLayers[minZoom] = configs
    }
  }
  loadLogic (config) {
    var code = config.code
    var wfs = config.wfs
    var wmsLayers = config.wmsLayers
    const file = logicMapper[code]
    var logic = this.layersLogic[code]
    if (!logic) {
      if (file) {
        var BusiLayer = require('../logic/' + file)
        logic = new BusiLayer()
      } else if (wfs) {
        logic = new WfsLayerService(config)
      } else if (wmsLayers) {
        var layer = {}
        layer[config.code] = config
        this.wmsLayers.push(layer)
      }
    }
    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)
    var layer = (logic && logic.initLayer && logic.initLayer((this.L))) || this.L.featureGroup({})
    if (logic.bindTooltip) {
      // 全局tips位置
      layer.bindTooltip(logic.bindTooltip, { direction: 'top', offset: [0, -15], sticky: false })
    }
    // 调用click事件
    if (logic.clickListener) {
      layer.on('click', logic.clickListener)
    }
    layer.addTo(this.map)
    this.layers[code] = layer
    return layer
  }
  /**
   * 如果 存在已经加载了的对象,就直接加到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.start && logic.start()
    this.wmsLayerService && this.wmsLayerService.add(config)
  }
  hide (config) {
    const code = config.code
    const layer = this.layers[code]
    layer && this.map.removeLayer(layer)
    const logic = this.loadLogic(config)
    logic && logic.destory && logic.destory()
    this.wmsLayerService && this.wmsLayerService.remove(config)
  }
  /**
@@ -32,96 +147,30 @@
     * @param layerConfig
     */
  initEvent (layerConfig) {
    this.map.on('zoomend ', (e) => this.toggleZoomByLayer(layerConfig))
    // this.map.on('zoomend ', () => this.toggleByZoom())
  }
  toggleZoomByLayer (layerConfig) {
    var config = layerConfig
    if (Array.isArray(layerConfig)) {
      for (var i = 0, l = layerConfig.length; i < l; i++) {
        config = layerConfig[i]
        var layers = config.layers
        var childLayer = config.childLayer
        layers && this.toggleZoomByLayer(layers)
        childLayer && this.toggleZoomByLayer(childLayer)
        this.toggleZoomByConfig(config)
      }
    } else {
      this.toggleZoomByConfig(layerConfig)
    }
  }
  toggleZoomByConfig (config) {
  toggleByZoom () {
    const zoom = this.map.getZoom()
    var checked = config.checked
    if (checked && config.minZoom) {
      if (zoom > config.minZoom) {
        this.show(config)
      } else {
        this.hide(config)
      }
    }
  }
  load (config) {
    var code = config.code
    var wfs = config.wfs
    var wms = config.wms
    var url = config.url
    var checked = config.checked
    // 判断是否已经加载过,加载过就 直接得到对象调用 显示函数
    var layer = this.layers[code]
    // todo if是不是太多了
    if (checked) {
      if ((wfs || wms || url)) {
        if (layer) {
          this.show(code)
        } else {
          layer = this.L.featureGroup({}).addTo(this.map)
          this.layers[code] = layer
    for (var k in this.minZoomLayers) {
      const configs = this.minZoomLayers[k]
      for (var j in configs) {
        const config = configs[j]
        const checked = config.checked
        // console.log(zoom)
        // console.log(k)
        if (checked && zoom > k) {
          this.show(config)
        } else if (checked && zoom < k) {
          this.hide(config)
        }
      }
      // 2. 判断类型
      if (wfs) {
        // 3. 实例化具体service
        var wfsLayerService = new WfsLayerService(config)
        wfsLayerService.init(layer)
        this.setZIndex(layer)
      } else if (wms) {
        var wmsLayerService = new WmsLayerService(config)
        wmsLayerService.init(layer)
      } else if (url) {
        var busiLayerService = new BusiLayerService(config)
        busiLayerService.init(layer)
      }
    }
    var eventLayerService = new EventLayerService(config)
    eventLayerService.init()
  }
  show (config) {
    var layer = this.layers[config.code]
    if (layer) {
      layer.addTo(this.map)
      this.setZIndex(layer)
    } else {
      this.load(config)
    }
  }
  hide (config) {
    var layer = this.layers[config.code]
    layer && this.map.removeLayer(layer)
    // this.load(config)
  }
  toggle (code) {
  }
  /**
   *
   * 根据传的 feature对象定位
   * 根据传的 feature对象定位,
   * @param code
   * @param feature
   */
@@ -134,7 +183,7 @@
        break
      case 'MultiLineString':
        var coordinates = feature.geometry.coordinates
        point = clone(coordinates[parseInt(coordinates.length / 2)][0])
        point = coordinates[parseInt(coordinates.length / 2)][0]
        break
    }
    window.map.flyTo(point.reverse(), 15)
@@ -187,32 +236,8 @@
      this.findLayerById(layer.getLayers(), id)
    } else {
      layer.eachLayer(function (layer) {
        console.log(layer)
        // console.log(layer)
      })
    }
  }
  /**
     * todo 这里无效,貌似是因为geojson加载到地图也是个layergroup
     *
     * 设置index,线在最下面,点在上面
     * @param layerGroup 图层组
     */
  setZIndex (layer) {
    if (Array.isArray(layer)) {
      for (var i = 0; i < layer.length; i++) {
        this.setZIndex(layer[i])
      }
    } else {
      if (layer.getLayers) {
        this.setZIndex(layer.getLayers())
      } else {
        if (layer.feature && (layer.feature.geometry.type === 'LineString' || layer.feature.geometry.type === 'MultiLineString')) {
          layer.bringToBack && layer.bringToBack()
        } else {
          layer.bringToFront && layer.bringToFront()
        }
      }
    }
  }
}