import L from 'leaflet' /** * 基础图层类, 包含图层的创建,加载和清除等基础功能。 */ class BaseVectorLayer { LOAD_TYPE_JSON = 'json' // GeoJson加载方法 LOAD_TYPE_URL = 'url' // ajax加载方法 /** * 初始化图层 * @param {*} options * * { * map : '地图引用' * params : 地图加载参数 * * code : 图层编号 * name : 图层名称 * loadType : 图层加载类型, json或者url * url : 请求数据的url地址 * data : 初始的GeoJson数据 * } * */ 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