From cb85033879c74f34925a303402c1ad3e4a8646f2 Mon Sep 17 00:00:00 2001 From: 徐旺旺 <11530253@qq.com> Date: 星期一, 10 五月 2021 17:03:54 +0800 Subject: [PATCH] 搜索更换为geoserver wfs,图层顺序,弹窗定位等 --- src/components/LayerController/service/LayerFactory.js | 273 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 164 insertions(+), 109 deletions(-) diff --git a/src/components/LayerController/service/LayerFactory.js b/src/components/LayerController/service/LayerFactory.js index d475fb6..f781247 100644 --- a/src/components/LayerController/service/LayerFactory.js +++ b/src/components/LayerController/service/LayerFactory.js @@ -1,30 +1,145 @@ import WfsLayerService from './WfsLayerService' -import BusiLayerService from './BusiLayerService' +import { clone } from '../../../utils/utils' +import { logicMapper, SERVICE_TYPE } from '../../../conf/Constants' import WmsLayerService from './WmsLayerService' -import EventLayerService from './EventLayerService' +/** + * init 鍙垵濮嬪寲涓�娆� + * start 姣忔璋冪敤鍥惧眰鏄剧ずshow()鏃讹紝閮戒細璋冪敤 + * destory 姣忔璋冪敤鍥惧眰闅愯棌hide()鏃讹紝閮戒細璋冪敤 + * + */ class LayerFactory { constructor (options) { this.L = options.L this.map = window.map this.layers = {} + this.layersLogic = {} + this.minZoomLayers = {} + this.wmsLayers = [] + this.clickSwitch = true // 鍥惧眰鐐瑰嚮寮圭獥寮�鍏� } init (layerConfig) { + this.initConfig(layerConfig) + // wms鏈嶅姟鍙渶瑕佸垵濮嬪寲涓�娆� + this.wmsLayerService = new WmsLayerService(this.wmsLayers) + this.wmsLayerService.init() + } + + initConfig (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 + var checked = config.checked + /* if (config.groupName) { + const wmsGroupLayerService = new WmsGroupLayerService(config) + wmsGroupLayerService.init() + continue + } */ layers && this.init(config.layers) childLayer && this.init(config.childLayer) - var checked = config.checked - checked && this.load(config) - checked && this.toggleZoomByConfig(config) + this.initMinZoom(config) + this.loadLogic(config) + checked && this.show(config) } } + } + + initMinZoom (config) { + const minZoom = parseInt(config.minZoom) + if (minZoom) { + var configs = this.minZoomLayers[minZoom] + if (configs) { + configs[configs.length] = config + } else { + configs = [config] + } + this.minZoomLayers[minZoom] = configs + } + } + + loadLogic (config) { + var code = config.code + var type = config.type + + const file = logicMapper[code] + var logic = this.layersLogic[code] + if (!logic) { + if (file) { + var BusiLayer = require('../logic/' + file) + logic = new BusiLayer() + } else if (type === SERVICE_TYPE.WFS) { + logic = new WfsLayerService(config) + } else if (type === SERVICE_TYPE.WMS) { + var layer = {} + layer[config.code] = config + this.wmsLayers.push(layer) + } + } + this.layersLogic[code] = logic + return logic + } + + /** + * 1. 鍏堣皟鐢ㄥ鐞嗛�昏緫鐨� initLayer 锛屽鏋滄病鏈� 灏卞垱寤轰竴涓� featureGroup + * 2. 濡傛灉瀛樺湪浜嬩欢閫昏緫鐨勮瘽锛岀粦瀹歵ooltip,click浜嬩欢 + * 3. 灏唋ayer娣诲姞鍒癿ap + * 4. 杩斿洖layer + * @param config + * @returns layer + */ + addLayer (config) { + var code = config.code + var logic = this.loadLogic(config) + var layer = (logic && logic.initLayer && logic.initLayer((this.L))) || this.L.featureGroup({}) + + if (logic.bindTooltip) { + // 鍏ㄥ眬tips浣嶇疆 + layer.bindTooltip(logic.bindTooltip, { direction: 'top', offset: [0, -15], sticky: false }) + } + // 璋冪敤click浜嬩欢 + if (logic.clickListener) { + layer.on('click', logic.clickListener) + } + layer.addTo(this.map) + this.layers[code] = layer + return layer + } + + /** + * 濡傛灉 瀛樺湪宸茬粡鍔犺浇浜嗙殑瀵硅薄锛屽氨鐩存帴鍔犲埌map + * 濡傛灉 涓嶅瓨鍦ㄥ垯 璋冪敤 addLayer 鍙� 閫昏緫绫荤殑init 杩涜鍒濆鍖栨搷浣� + * 濡傛灉 瀛樺湪start鍑芥暟锛屽垯璋冪敤 + * @param config + */ + show (config) { + var index = config.index + var layer = this.layers[config.code] + var logic = this.loadLogic(config) + if (layer) { + if (!this.map.hasLayer(layer)) { + index && layer.setZIndex(index) + layer.addTo(this.map) + } + } else { + logic && logic.init(this.addLayer(config), this.L) + } + logic && logic.start && logic.start() + this.wmsLayerService && this.wmsLayerService.add(config) + } + + hide (config) { + const code = config.code + const layer = this.layers[code] + layer && this.map.removeLayer(layer) + const logic = this.loadLogic(config) + logic && logic.destory && logic.destory() + this.wmsLayerService && this.wmsLayerService.remove(config) } /** @@ -32,95 +147,59 @@ * @param layerConfig */ initEvent (layerConfig) { - this.map.on('zoomend ', (e) => this.toggleZoomByLayer(layerConfig)) + // this.map.on('zoomend ', () => this.toggleByZoom()) } - 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) { + toggleByZoom () { 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 checked = config.checked - // 鍒ゆ柇鏄惁宸茬粡鍔犺浇杩囷紝鍔犺浇杩囧氨 鐩存帴寰楀埌瀵硅薄璋冪敤 鏄剧ず鍑芥暟 - var layer = this.layers[code] - // todo if鏄笉鏄お澶氫簡 - if (checked) { - if ((wfs || wms || url)) { - if (layer) { - this.show(code) - } else { - layer = this.L.featureGroup({}).addTo(this.map) - this.layers[code] = layer + for (var k in this.minZoomLayers) { + const configs = this.minZoomLayers[k] + for (var j in configs) { + const config = configs[j] + const checked = config.checked + // console.log(zoom) + // console.log(k) + if (checked && zoom > k) { + this.show(config) + } else if (checked && zoom < k) { + this.hide(config) } } - // 2. 鍒ゆ柇绫诲瀷 - if (wfs) { - // 3. 瀹炰緥鍖栧叿浣搒ervice - var wfsLayerService = new WfsLayerService(config) - wfsLayerService.init(layer) - this.setZIndex(layer) - } else if (wms) { - var wmsLayerService = new WmsLayerService(config) - wmsLayerService.init(layer) - } else if (url) { - var busiLayerService = new BusiLayerService(config) - busiLayerService.init(layer) - } - } - var eventLayerService = new EventLayerService(config) - eventLayerService.init() - } - - 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) - this.load(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 + var coordinate = coordinates[parseInt(coordinates.length / 2)][0] + if (coordinate.length > 2) { + point = [coordinate[0], coordinate[1]] + } + break + case 'LineString': + var lineString = feature.geometry.coordinates + point = lineString[parseInt(lineString.length / 2)][0] + break + } + console.log(point) + window.map.flyTo(point.reverse(), 17) + code && this.openPopup(code, feature.id) } - toggle (code) { - - } - - flyByLayerId (code, id) { - const layer = this.layers[code] + openPopup (layerId, id) { + const layer = this.layers[layerId] if (layer.eachLayer) { layer.eachLayer(function (layer) { @@ -165,32 +244,8 @@ this.findLayerById(layer.getLayers(), id) } else { layer.eachLayer(function (layer) { - console.log(layer) + // console.log(layer) }) - } - } - - /** - * 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() - } - } } } } -- Gitblit v1.8.0