import mapConfig from './mapConfig.js'; import { zhangzitou_selectAll } from '@/api/mapView/map.js'; import WKT from 'terraformer-wkt-parser'; import store from '@/store'; // 服务加载 const mapServer = { serveType: null, layerList: [], addLayer(res) { const obj = this.getLayerChecked(res); if (obj) return; this.serveType = res.serveType; switch (this.serveType) { case 'tdMap': this.addTdLayer(res); break; case 'WMS': this.addWMSLayer(res); break; case 'Tileset': this.addTilesetLayer(res); break; case 'WFS': this.addWFSLayer(res); break; } }, addWFSLayer(res) { zhangzitou_selectAll({ limit: 1000000, page: 1, }).then((response) => { if (response.data.code != 200) return; const pois = response.data.result.pois; const cnName = res.cnName + '_' + res.id; const modelLayer = new Cesium.PrimitiveCollection(); modelLayer.name = cnName; window.Viewer.scene.primitives.add(modelLayer); pois.map((item) => { var geom = WKT.parse(item.geom).coordinates; const terrain = config.terrain; if (terrain.isShow && terrain.isUrl) { this.addTerrainGLB(item, geom, modelLayer); } else { this.addGLB(item, geom, modelLayer); } }); this.layerList.push({ id: res.id, name: cnName, layer: modelLayer, serveType: this.serveType, }); }); }, addTerrainGLB(item, geom, modelLayer) { var positions = [Cesium.Cartographic.fromDegrees(geom[0], geom[1])]; var promise = Cesium.sampleTerrainMostDetailed(window.Viewer.terrainProvider, positions); promise.then((updatedPositions) => { var terrainHeight = updatedPositions[0].height; var style = { longitude: geom[0], latitude: geom[1], altitude: terrainHeight, heading: 0, pitch: 0, roll: 0, }; const modelMatrix = mapConfig.getModelMatrix(style); const url = '/glb/' + item.type + '.glb'; modelLayer.add( Cesium.Model.fromGltf({ id: item, url: url, scale: 1, minimumPixelSize: 20, maximumScale: 20, modelMatrix: modelMatrix, primitive: item, }) ); }); }, addGLB(item, geom, modelLayer) { var style = { longitude: geom[0], latitude: geom[1], altitude: 0, heading: 0, pitch: 0, roll: 0, }; const modelMatrix = mapConfig.getModelMatrix(style); const url = '/glb/' + item.type + '.glb'; modelLayer.add( Cesium.Model.fromGltf({ id: item, url: url, scale: 1, minimumPixelSize: 20, maximumScale: 20, modelMatrix: modelMatrix, primitive: item, }) ); }, addTdLayer(res) { const url = res.url + config.tdToken; window.Viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url: url, }) ); }, getLayerChecked(res) { const obj = this.layerList.filter((item) => { if (item.id == res.id) { return item; } }); const boolen = obj.length > 0 ? true : false; return boolen; }, addWMSLayer(res) { const serverUrl = config.geoServer; const that = this; var getFeatureInfoFormat = new Cesium.GetFeatureInfoFormat('html', null, function (html) { that.getFeatureInfo(html); }); const layer = new Cesium.WebMapServiceImageryProvider({ url: serverUrl.url + serverUrl.wms, layers: res.url, getFeatureInfoParameters: { info_format: 'text/html' }, enablePickFeatures: true, getFeatureInfoFormats: [getFeatureInfoFormat], parameters: { transparent: true, format: 'image/png', srs: 'EPSG:4490', styles: '', cql_filter: '', }, tileWidth: 512, tileHeight: 512, }); const imageLayer = window.Viewer.imageryLayers.addImageryProvider(layer); const cnName = res.cnName + '_' + res.id; imageLayer.name = cnName; imageLayer.id = res.id; this.layerList.push({ id: res.id, name: cnName, layer: imageLayer, serveType: this.serveType, }); }, addTilesetLayer(res) { let url = res.url.indexOf('{host}') > -1 ? res.url.replace('{host}', iisHost) : res.url; var height = 0; if (res.bak) { height = JSON.parse(res.bak).height; } var model = window.earthCtrl.factory.create3DTilesets({ url: url, option: { height: height, id: res.id, }, }); const cnName = res.cnName + '_' + res.id; model.item.readyPromise.then((item) => { if (res.id != 'baseModel') { mapConfig.userSceneFlyTo(item); } this.layerList.push({ id: res.id, name: cnName, layer: model, serveType: this.serveType, }); }); }, removeLayer(res) { const cnName = res.cnName + '_' + res.id; this.layerList.map((item, index) => { if (cnName == item.name && res.id == item.id) { if (item.serveType == 'WMS') { window.Viewer.imageryLayers.remove(item.layer); this.layerList.splice(index, 1); } else if (item.serveType == 'Tileset') { item.layer.deleteObject(); this.layerList.splice(index, 1); } else if (item.serveType == 'WFS') { window.Viewer.scene.primitives.remove(item.layer); this.layerList.splice(index, 1); } } }); }, async getFeatureInfo(html) { var start = html.indexOf('') + ''.length; var end = html.indexOf(''); var tab = html.substr(start, end - start); var std = html .substr(html.indexOf(''), html.lastIndexOf('') - html.indexOf('') + 5) .replaceAll(' ', '') .replaceAll('\n', '') .split(''); var str = html .substr(html.indexOf(''), html.lastIndexOf('') - html.indexOf('') + 5) .replaceAll(' ', '') .replaceAll('\n', '') .split(''); var arr = []; for (var i in std) { var name, val; name = std[i]; val = str[i]; if (name == '') { continue; } if (name.indexOf('') > -1) { name = name.replaceAll('', ''); } if (val.indexOf('') > -1) { val = val.replaceAll('', ''); } if (name != '>') { arr.push({ name: name, val: val, }); } } store.dispatch('mapLayers/changeMapInfo', []); if (arr.length > 0) { // this.$store.geet.mapInfo = arr; store.dispatch('mapLayers/changeMapInfo', arr); } }, }; export default mapServer;