import WfsLayerService from './WfsLayerService'
|
import BusiLayerService from './BusiLayerService'
|
import WmsLayerService from './WmsLayerService'
|
|
class LayerFactory {
|
constructor (options) {
|
this.L = options.L
|
this.map = window.map
|
this.layers = {}
|
}
|
|
init (layerConfig) {
|
// 1. 遍历layer config
|
if (layerConfig) {
|
for (var i = 0; i < layerConfig.length; i++) {
|
var config = layerConfig[i]
|
var layers = config.layers
|
var childLayer = config.childLayer
|
layers && this.init(config.layers)
|
childLayer && this.init(config.childLayer)
|
|
var checked = config.checked
|
checked && this.load(config)
|
checked && this.toggleZoomByConfnig(config)
|
}
|
}
|
}
|
|
/**
|
* 控制显示的级别
|
* @param layerConfig
|
*/
|
initEvent (layerConfig) {
|
this.map.on('zoomend ', (e) => this.toggleZoomByLayer(layerConfig))
|
}
|
|
toggleZoomByLayer (layerConfig) {
|
var config = layerConfig
|
if (Array.isArray(layerConfig)) {
|
for (var i = 0, l = layerConfig.length; i < l; i++) {
|
config = layerConfig[i]
|
var layers = config.layers
|
var childLayer = config.childLayer
|
layers && this.toggleZoomByLayer(layers)
|
childLayer && this.toggleZoomByLayer(childLayer)
|
this.toggleZoomByConfnig(config)
|
}
|
} else {
|
this.toggleZoomByConfnig(layerConfig)
|
}
|
}
|
|
toggleZoomByConfnig (config) {
|
const zoom = this.map.getZoom()
|
var checked = config.checked
|
if (checked && config.minZoom) {
|
if (zoom > config.minZoom) {
|
this.show(config)
|
} else {
|
this.hide(config)
|
}
|
}
|
}
|
|
load (config) {
|
var code = config.code
|
var wfs = config.wfs
|
var wms = config.wms
|
var url = config.url
|
// 判断是否已经加载过,加载过就 直接得到对象调用 显示函数
|
var layer = this.layers[code]
|
if (!layer) {
|
layer = this.L.featureGroup({}).addTo(this.map)
|
// 2. 判断类型
|
if (wfs) {
|
// 3. 实例化具体service
|
var wfsLayerService = new WfsLayerService(config)
|
wfsLayerService.init(layer)
|
this.setZIndex(layer)
|
}
|
if (wms) {
|
var wmsLayerService = new WmsLayerService(config)
|
wmsLayerService.init(layer)
|
}
|
// 请求业务数据接口
|
if (url) {
|
var busiLayerService = new BusiLayerService(config)
|
busiLayerService.init(layer)
|
}
|
layer ? (this.layers[code] = layer) : console.log('LayerFactory:newLayer is null,please check !!!')
|
} else {
|
this.show(code)
|
}
|
}
|
|
show (config) {
|
var layer = this.layers[config.code]
|
if (layer) {
|
layer.addTo(this.map)
|
this.setZIndex(layer)
|
} else {
|
this.load(config)
|
}
|
}
|
|
hide (config) {
|
var layer = this.layers[config.code]
|
layer && this.map.removeLayer(layer)
|
}
|
|
toggle (code) {
|
|
}
|
|
flyByLayerId (layerId, bound) {
|
for (var k in this.layers) {
|
var layerGroup = this.layers[k]
|
var layers = layerGroup.getLayers()
|
if (layers) {
|
for (var m = 0; m < layers.length; m++) {
|
var layer = layers[m]
|
console.log(layer.toGeoJSON())
|
/* var feature = layer.feature
|
if (feature.id === layerId) {
|
this.map.flyToBounds(bound)
|
return layer
|
} */
|
}
|
}
|
}
|
return null
|
}
|
|
/**
|
* todo 这里无效,貌似是因为geojson加载到地图也是个layergroup
|
*
|
* 设置index,线在最下面,点在上面
|
* @param layerGroup 图层组
|
*/
|
setZIndex (layer) {
|
if (Array.isArray(layer)) {
|
for (var i = 0; i < layer.length; i++) {
|
this.setZIndex(layer[i])
|
}
|
} else {
|
if (layer.getLayers) {
|
this.setZIndex(layer.getLayers())
|
} else {
|
if (layer.feature && (layer.feature.geometry.type === 'LineString' || layer.feature.geometry.type === 'MultiLineString')) {
|
layer.bringToBack && layer.bringToBack()
|
} else {
|
layer.bringToFront && layer.bringToFront()
|
}
|
}
|
}
|
}
|
}
|
|
export default LayerFactory
|