Source: ext/layer/EasyLayer.js

class EasyLayer {
    /**
     * 图层基类
     * @constructor
     */
    constructor() {
        this.id = null
        this.layer = null
        this.map = null
        this._geometries = []
    }

    /**
     * 把图层添加到地图
     * @param {EasyMap} easyMap 目标地图
     */
    addTo(easyMap) {
        this.map = easyMap
        this.layer.addTo(easyMap.map)
    }

    /**
     * 添加图形
     * @param {Geom|Array.<Geom>} geometries 图形或图形数组
     */
    addGeometry(geometries) {
        if (!Array.isArray(geometries)) {
            geometries = [geometries]
        }
        const _geometries = []
        geometries.forEach(geom => {
            this._geometries.push(geom)
            _geometries.push(geom._geometry)
        })
        this.layer.addGeometry(_geometries)
    }

    /**
     * 根据id获取图形
     * @param {String} id 图形id
     * @returns {*}
     */
    getGeometryById(id) {
        let geometry = false
        this._geometries.forEach(e => {
            if (id === e.id) {
                geometry = e
            }
        })
        return geometry
    }

    /**
     * 获取图形,可以加过滤条件
     * @param {Function} filter 过滤方法
     * @param {Object} context 上下文
     * @returns {*}
     */
    getGeometries(filter = null, context = null) {
        if (!filter) {
            return this._geometries
        }
        const geometries = []
        this._geometries.forEach(e => {
            let filtered
            if (context) {
                filtered = filter.call(context, e);
            } else {
                filtered = filter(e);
            }
            if (filtered) {
                geometries.push(e)
            }
        })
        return geometries
    }

    /**
     *显示图层
     *
     * @return {*}
     * @memberof EasyLayer
     */
    show(){
        this.layer.show()
        return this
    }

    /**
     *隐藏图层
     *
     * @return {*}
     * @memberof EasyLayer
     */
    hide(){
        this.layer.hide()
        return this
    }

    /**
     * 事件绑定
     * @param {String} eventsOn 要注册的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    on(eventsOn, handler, context = null) {
        this.layer.on(eventsOn, handler, context)
    }

    /**
     * 事件绑定,别名
     * @param {String} eventsOn 要注册的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    addMapEventListener(eventsOn, handler, context = null) {
        this.layer.addEventListener(eventsOn, handler, context)
    }

    /**
     * 单次事件绑定,调用一次后移除
     * @param {String} eventTypes 要注册的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    once(eventTypes, handler, context = null) {
        this.layer.once(eventTypes, handler, context)
    }

    /**
     * 单次事件绑定,调用一次后移除,别名
     * @param {String} eventTypes 要注册的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    addMapEventListenerOnce(eventTypes, handler, context = null) {
        this.layer.once(eventTypes, handler, context)
    }

    /**
     * 事件移除
     * @param {String} eventsOff 要移除的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    un(eventsOff, handler, context = null) {
        this.layer.off(eventsOff, handler, context)
    }

    /**
     * 事件移除,别名
     * @param {String} eventsOff 要移除的事件类型
     * @param {*} handler 要调用的处理函数
     * @param {*} context 处理程序的上下文
     */
    removeMapEventListener(eventsOff, handler, context = null) {
        this.layer.removeEventListener(eventsOff, handler, context)
    }

    /**
     * 获取或设置options
     * @param {String|Object} conf 配置,不传时,表示获取所有options;传字符串时与confValue搭配使用,把名为conf的配置项设置成congValue;传对象时内容为要设置的配置项的键值对,可设置多个;
     * @param {*} confValue
     */
    config(conf = null, confValue = null) {
        if (arguments.length === 2) {
            this.layer.config(conf, confValue)
        } else if (arguments.length === 0) {
            this.layer.config()
        } else {
            this.layer.config(conf)
        }
    }

    /**
     * 获取图层所在地图
     * @returns {EasyMap}
     */
    getMap() {
        return this.map
    }

    /**
     * 从地图上删除图层本身
     * @returns {EasyLayer}
     */
    remove() {
        this.map.removeLayer(this)
        return this
    }
}

export default EasyLayer