|
|
/**
|
* 基础图层类, 包含图层的创建,加载和清除等基础功能。
|
*/
|
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
|