派生自 wuyushui/SewerAndRainNetwork

YANGDL
2021-02-08 b27e031827eae0f535d17bb20ff4809699151a17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
 
/**
 * 基础图层类, 包含图层的创建,加载和清除等基础功能。
 */
class BaseVectorLayer {
    LOAD_TYPE_JSON = 'json' // GeoJson加载方法
    LOAD_TYPE_URL = 'url' // ajax加载方法
    /**
     * 初始化图层
     * @param {*} options
     * <code>
     * {
     *   map : '地图引用'
     *   params : 地图加载参数
     *
     *   code : 图层编号
     *   name : 图层名称
     *   loadType : 图层加载类型, json或者url
     *   url : 请求数据的url地址
     *   data : 初始的GeoJson数据
     * }
     * </code>
     */
    constructor (options) {
      this.map = options.map // 必填项
      this.params = options.params // 必填项,加载图层数据的参数, 子类需要,可以是{}空对象
 
      this.layerCode = options.code || '' // 图层编码
      this.layerName = options.name || '' // 图层名称
      this.layerLoadType = options.loadType || BaseVectorLayer.LOAD_TYPE_JSON // 图层加载类型
      this.layerUrl = options.url || '' // 数据请求地址
      this.layerData = options.data || '' // 原始GeoJson数据
 
      this.layerHandler = null // 图层引用
 
      this.features = [] // 所有被构建出来的Features
      this.featuresArray = [] // 所有被构建出来的Features保存备份,避免再次被加载。 load方法全生命周期只被调用一次
 
      this.featuresGroup = new Map() // 对加载的数据进行分组,便于后续控制。 但在数据初始化时,需要手动分组。否则,分组
 
      this._init(this.map, this.params)
    }
 
    /**
     * 初始化基本的图层并加载到map中
     */
    _init (map) {
      this.layerHandler = L.layerGroup().addTo(map)
    }
 
    /**
     * 加载数据
     * @param boolean isAddToMap 是否直接将marker添加到地图中, 默认是加载
     */
    load (isAddToMap = true) {
      if (this.layerHandler) { // 默认,应该只会加载一次,但是如果有的图层要定时刷新,则需要先清除原图层的数据
        this.layerHandler.clearLayers()
      }
 
      const features = []
 
      // 依据加载方式加载数据
      if (this.layerLoadType === BaseVectorLayer.LOAD_TYPE_JSON) {
        this.features = this._loadFromJSON()
      } else if (this.layerLoadType === BaseVectorLayer.LOAD_TYPE_URL) {
        this.features = this._loadFromURL()
      } else {
        console.log('图层【' + this.layerCode + '_' + this.layerName + '】的' + this.loadType + '加载方式暂不支持!')
      }
 
      if (isAddToMap) { // 添加到地图中
        this.layerHandler.addLayer(features)
      }
    }
 
    _loadFromJSON () {
      console.log('该方法是抽象方法,在子类尚未实现!')
    }
 
    _loadFromURL () {
      console.log('该方法是抽象方法,在子类尚未实现!')
    }
 
    /**
     * 显示图层, 如果groups参数,则只显示group对应的图层
     * @param {} groups 数组,元素之与layerGroups键值对应。
     */
    show (groups) {
      if (typeof groups !== 'undefined') { // 如果传递了groups, 则按分组的要求加载图层
        if (this.layerHandler) {
          for (let i = 0, len = groups.length; i < len; i++) {
            const gFeaturesArray = this.featuresGroup.get(groups[i])
            if (gFeaturesArray || gFeaturesArray.length > 0) {
              gFeaturesArray.forEach(element => {
                this.layerHandler.removeLayer(element) // 避免被重复加载
                this.layerHandler.addLayer(element)
              })
            }
          }
        }
      } else { // 否则加载全部的数据
        if (this.layerHandler) {
          this.layerHandler.clearLayers()
          for (let i = 0, len = this.featuresArray.length; i < len; ++i) {
            this.layerHandler.addLayer(this.featuresArray[i])
          }
        }
      }
    }
 
    /**
     * 隐藏图层, 如果groups参数,则只隐藏group对应的图层
     * @param {} groups 数组,元素之与layerGroups键值对应。 如果图层在初始加载时,没有对数据分组,该方法不会有效果。
     */
    hide (groups) {
      if (typeof groups !== 'undefined') { // 如果传递了groups, 则按分组的要求加载图层
        if (this.layerHandler) {
          for (let i = 0, len = groups.length; i < len; i++) {
            const gFeaturesArray = this.featuresGroup.get(groups[i])
            if (gFeaturesArray || gFeaturesArray.length > 0) {
              gFeaturesArray.forEach(element => {
                this.layerHandler.removeLayer(element)
              })
            }
          }
        }
      } else { // 否则卸载全部的数据
        if (this.layerHandler) {
          this.layerHandler.clearLayers()
        }
      }
    }
}
 
export default BaseVectorLayer