From 7d02699a0b2d425f3f9f3dd6af872bbc1d352710 Mon Sep 17 00:00:00 2001 From: 徐旺旺 <11530253@qq.com> Date: 星期二, 20 四月 2021 11:46:36 +0800 Subject: [PATCH] 图层控制BUG修改 --- src/components/LayerController/service/LayerFactory.js | 201 +++++++++++++++++++++++++++++++++++++------------ 1 files changed, 151 insertions(+), 50 deletions(-) diff --git a/src/components/LayerController/service/LayerFactory.js b/src/components/LayerController/service/LayerFactory.js index d12719b..4b2814e 100644 --- a/src/components/LayerController/service/LayerFactory.js +++ b/src/components/LayerController/service/LayerFactory.js @@ -1,89 +1,190 @@ import WfsLayerService from './WfsLayerService' -import BusiLayerService from './BusiLayerService' import WmsLayerService from './WmsLayerService' - +import { clone } from '../../../utils/utils' +import { logicMapper } from '../../../conf/Constants' class LayerFactory { constructor (options) { this.L = options.L this.map = window.map this.layers = {} + this.layersLogic = {} } init (layerConfig) { // 1. 閬嶅巻layer config - for (var i = 0, l = layerConfig.length; i < l; i++) { - var config = layerConfig[i] - var layers = config.layers - layers && this.init(config.layers) + if (layerConfig) { + for (var i = 0; i < layerConfig.length; i++) { + var config = layerConfig[i] + var layers = config.layers + var childLayer = config.childLayer + var checked = config.checked + layers && this.init(config.layers) + childLayer && this.init(config.childLayer) - var checked = config.checked - checked && this.load(config) + this.loadLogic(config) + this.toggleZoomByConfig(config) + checked && this.show(config) + } } } - load (config) { + loadLogic (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. 瀹炰緥鍖栧叿浣搒ervice - var wfsLayerService = new WfsLayerService(config) - wfsLayerService.init(layer) - this.setZIndex(layer) + + const file = logicMapper[code] + var logic = this.layersLogic[code] + if (!logic) { + if (file) { + var BusiLayer = require('../logic/' + file) + logic = new BusiLayer() + } else if (wfs) { + logic = new WfsLayerService(config) + } else if (wms) { + logic = new WmsLayerService(config) } - 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锛歯ewLayer is null锛宲lease check !!!') - } else { - this.show(code) } + this.layersLogic[code] = logic + return logic + } + + addLayer (config) { + var code = config.code + var logic = this.loadLogic(config) + var layer = (logic && logic.initLayer && logic.initLayer((this.L))) || this.L.featureGroup({}) + layer.addTo(this.map) + this.layers[code] = layer + return layer } show (config) { var layer = this.layers[config.code] + var logic = this.loadLogic(config) if (layer) { - layer.addTo(this.map) - this.setZIndex(layer) + if (!this.map.hasLayer(layer)) { + layer.addTo(this.map) + } } else { - this.load(config) + logic && logic.init(this.addLayer(config), this.L) } + logic && logic.create && logic.create() } hide (config) { - var layer = this.layers[config.code] + const code = config.code + const layer = this.layers[code] layer && this.map.removeLayer(layer) - } - - toggle (code) { - + const logic = this.loadLogic(config) + logic && logic.destory && logic.destory() } /** - * 璁剧疆index,绾垮湪鏈�涓嬮潰锛岀偣鍦ㄤ笂闈� - * @param layerGroup 鍥惧眰缁� + * 鎺у埗鏄剧ず鐨勭骇鍒� + * @param layerConfig */ - setZIndex (layerGroup) { - var layers = layerGroup.getLayers() - if (layers.length > 0) { - var layer = layers[0] - if (layer.feature && (layer.feature.geometry.type === 'LineString' || layer.feature.geometry.type === 'MultiLineString')) { - layerGroup.bringToBack() - } else { - layerGroup.bringToFront() + 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.toggleZoomByConfig(config) } + } else { + this.toggleZoomByConfig(layerConfig) + } + } + + toggleZoomByConfig (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) + } + } + } + + /** + * + * 鏍规嵁浼犵殑 feature瀵硅薄瀹氫綅锛� + * @param code + * @param feature + */ + flyByFeature (feature, code) { + const type = feature.geometry.type + var point = [] + switch (type) { + case 'Point': + point = clone(feature.geometry.coordinates) + break + case 'MultiLineString': + var coordinates = feature.geometry.coordinates + point = coordinates[parseInt(coordinates.length / 2)][0] + break + } + window.map.flyTo(point.reverse(), 15) + code && this.openPopup(code, feature.id) + } + + openPopup (layerId, id) { + const layer = this.layers[layerId] + + if (layer.eachLayer) { + layer.eachLayer(function (layer) { + const layers = layer.getLayers() + for (var i = 0; i < layers.length; i++) { + const lay = layers[i] + const feature = lay.feature + lay.closePopup() + if (feature.id === id) { + lay.openPopup() + break + } + } + }) + } + /* for (var k in this.layers) { + var layerGroup = this.layers[k] + layerGroup.eachLayer(function (layer) { + console.log(layer) + console.log(layer.getAttribution()) + }) + var layers = layerGroup.getLayers() + if (layers) { + for (var m = 0; m < layers.length; m++) { + var layer = layers[m] + console.log(layer) + console.log(layer.getLayerId(val.id)) + /!* var feature = layer.feature + if (feature.id === layerId) { + this.map.flyToBounds(bound) + return layer + } *!/ + } + } + } */ + return null + } + + findLayerById (layer, id) { + const layers = layer.getLayers + if (layers) { + this.findLayerById(layer.getLayers(), id) + } else { + layer.eachLayer(function (layer) { + console.log(layer) + }) } } } -- Gitblit v1.8.0