类名 leaflet/document/support/FeatureRenderView.js
import {
  BaseFeatureLayerView,
  Log,
  RendererType
} from '@mapgis/webclient-common'
import * as L from '@mapgis/leaflet'
import { reorderGraphicLayer } from './Utils'
import LeafletPlugin from '../../util/LeafletPlugin'
import ThemeRenderUtil from './ThemeRenderUtil'

// 要素渲染基类封装
class FeatureRenderView extends BaseFeatureLayerView {
  /**
   * 添加图层视图
   * @param {LayerEvent} event 图层事件
   * @return {Promise<LayerView>} 图层视图
   */
  onAdd(event) {
    return this._addInnerLayer()
  }

  /**
   * @description: 解析矢量数据
   * @return {FeatureSet}
   */
  _processData() {
    return new Promise((resolve) => {})
  }

  /**
   * 移除图层视图
   * @param {LayerEvent} event 图层事件
   * @return {Promise<LayerView>} 图层视图
   */
  onRemove(event) {
    super.onRemove(event)
    this.innerView.removeLayer(this.innerLayer)
    this.innerLayer = null
    return Promise.resolve(this)
  }

  /**
   * 更新图层视图
   * @param {LayerViewUpdateEvent} event 图层事件
   * @return {Promise<LayerView>} 图层视图
   */
  onUpdate(event) {
    const layer = this.layer
    const innerLayer = this.innerLayer
    if (event.updateContent && innerLayer) {
      event.updateContent.forEach((layerUpdateCotent) => {
        if (
          layerUpdateCotent &&
          layerUpdateCotent.operationType === 'property'
        ) {
          switch (layerUpdateCotent.name) {
            case 'opacity': {
              LeafletPlugin.setVisibleOpacity(
                this.innerLayer,
                layer._opacity,
                layer._visible
              )
              break
            }
            case 'visible': {
              const flag = layerUpdateCotent.params[0]
              LeafletPlugin.setVisibleOpacity(
                this.innerLayer,
                layer._opacity,
                flag
              )
              break
            }
            default: {
              break
            }
          }
        }
        if (layerUpdateCotent && layerUpdateCotent.operationType === 'method') {
          switch (layerUpdateCotent.name) {
            case 'refresh': {
              this.innerView.removeLayer(this.innerLayer)
              this._addInnerLayer()
              break
            }
            default: {
              break
            }
          }
        }
      })
    }
    return Promise.resolve(this)
  }

  _addInnerLayer() {
    return this._processData().then((featureSet) => {
      const layer = this.layer
      const self = this
      const innerView = this.innerView
      const renderer = layer.renderer
      return new Promise((reslove) => {
        reorderGraphicLayer(this, function () {
          // 初始化图层
          self._initInnerLayer(layer, innerView, featureSet, renderer)
          // 添加到视图
          self.innerLayer.addTo(innerView)
        })
        reslove(self)
      })
    })
  }

  /**
   * @description: 初始化innnerLayer
   * @param {Layer} 初始化图层
   * @param {Object} innerView 地图
   * @param {FeatureSet} 预渲染要素
   * @param {Renderer} renderer
   * @return {L.Layer | null}
   */
  _initInnerLayer(layer, innerView, featureSet, renderer) {
    renderer = renderer || {}
    let innerLayer
    // 是否是common renderer
    let isCommonRenderer = false
    if (this._isCommonRenderer(renderer)) {
      isCommonRenderer = true
      // 创建图层
      innerLayer = L.featureGroup()
    } else {
      switch (renderer.type) {
        case RendererType.cluster: {
          innerLayer = L.markerClusterGroup()
          ThemeRenderUtil.renderCluster(
            innerLayer,
            layer,
            innerView,
            featureSet.features
          )
          break
        }
        default: {
          Log.error('无法解析renderer信息')
        }
      }
    }
    // 初始化透明度
    LeafletPlugin.setVisibleOpacity(innerLayer, layer._opacity, layer._visible)
    // 设置排序id 和 图层 id
    innerLayer.commonLayerId = layer.id
    innerLayer._realIndex = layer._realIndex
    // 设置innerLayer
    this.innerLayer = innerLayer
    // common层渲染,目前仅支持统一/单值/分段
    if (isCommonRenderer) {
      // 初始化FeatureCollection
      this._initFeatures(featureSet.features, renderer)
    }
    return innerLayer
  }

  /**
   * @description: 重载基类方法,监听renderer变化
   * @param {*} event
   * @return {*}
   */
  _rendererChangeAction(event) {
    // 源事件
    const { sourceEventData = {} } = event
    // 切换renderer
    if (sourceEventData.key === 'renderer') {
      const lastRenderer = sourceEventData.oldValue
      const currentRenderer = sourceEventData.value
      if (
        !(
          this._isCommonRenderer(lastRenderer) &&
          this._isCommonRenderer(currentRenderer)
        )
      ) {
        // 重载图层渲染
        this.innerView.removeLayer(this.innerLayer)
        this._addInnerLayer()
        return
      }
    }
    const renderer = this.layer.renderer
    if (this._isCommonRenderer(renderer)) {
      // 非common层渲染
      super._rendererChangeAction(event)
    } else {
      ThemeRenderUtil.updateCluster(this.innerLayer, this.layer, this.view)
    }
  }

  /**
   * @description: 是否为common层渲染图层
   * @param {*} renderer
   * @return {*}
   */
  _isCommonRenderer(renderer) {
    return (
      renderer &&
      [
        RendererType.classBreak,
        RendererType.simple,
        RendererType.uniqueValue,
        RendererType.random,
        RendererType.rank
      ].some((v) => v === renderer.type)
    )
  }
}
export default FeatureRenderView
构造函数
成员变量
方法
事件