import { getToken } from "@/utils/auth"; //配置文件地址 // import config from "../../../../public/config/config"; import store from "@/store"; const server = { layerList: [], addTreeData(treeNode) { if (!treeNode.checked) { this.delLayer(treeNode.id); return; } //判断是否为代理 if (treeNode.proxy) { this.addProxyAddress(treeNode); //有代理 } else { this.addUrlAddress(treeNode); //无代理 } }, //代理地址 addProxyAddress(res) { //判断数据类型 switch (res.data) { case 1: //数字正射影像图 this.setDataType(res); break; case 2: //场景地形数据 this.setTerrainData(res); break; case 3: //数字高程模型(晕渲图) this.setDataType(res); break; case 4: //单波段栅格数据 this.setDataType(res); break; case 5: //多光谱栅格数据 this.setDataType(res); break; case 6: //高光谱栅格数据 this.setDataType(res); break; case 7: //矢量图层 this.setVectorData(res); break; case 8: //三维模型 this.setModelData(res); break; } }, //普通地址 addUrlAddress(res) { switch (res.category) { case 0: //其他 break; case 1: //GisServer this.addProxyAddress(res); break; case 2: //GeoServer this.addGeoServerAddress(res); break; case 3: //数简 this.addProxyAddress(res); break; } }, //Geoserver服务 addGeoServerAddress(res) { //判断数据类型 switch (res.data) { case 1: //数字正射影像图 this.setGeoDataType(res); break; case 2: //场景地形数据 this.setTerrainData(res); break; case 3: //数字高程模型(晕渲图) this.setGeoDataType(res); break; case 4: //单波段栅格数据 this.setGeoDataType(res); break; case 5: //多光谱栅格数据 this.setGeoDataType(res); break; case 6: //高光谱栅格数据 this.setGeoDataType(res); break; case 7: //矢量图层 this.setGeoVectorData(res); break; case 8: //三维模型 this.setModelData(res); break; } }, setGeoDataType(res) { switch (res.type) { case 0: //URL break; case 1: //TMS this.setAddTmsLayer(res); break; case 2: //WMTS this.setAddWmtsLayer(res); break; case 3: //WMS this.setAddGeoWmsLayer(res); break; } }, setGeoVectorData(res) { switch (res.type) { case 0: //URL break; case 3: //WMS this.setAddGeoWmsLayer(res); break; case 4: //WFS break; } }, setDataType(res) { switch (res.type) { case 0: //URL break; case 1: //TMS this.setAddTmsLayer(res); break; case 2: //WMTS this.setAddWmtsLayer(res); break; case 3: //WMS this.setAddWmsLayer(res); break; } }, setTerrainData(res) { switch (res.type) { case 0: //URL this.setAddTearrinLayer(res); break; case 1: //TMS this.setAddTearrinLayer(res); break; } }, setVectorData(res) { switch (res.type) { case 0: //URL break; case 3: //WMS this.setAddWmsLayer(res); break; case 4: //WFS break; } }, setModelData(res) { switch (res.type) { case 0: //Tileset this.setAddModelLayer(res); break; case 3: //WMS this.setAddModelLayer(res); break; case 5: //WFS break; } }, //获取服务地址 getLayrUrl(res) { var url; if (res.proxy) { const token = getToken(); url = config.proxy + res.proxy.replaceAll("{token}", token); } else { url = res.url; } return url; }, //加载TMS服务 setAddTmsLayer(res) { var url = this.getLayrUrl(res); let img_layer = earthCtrl.Creator.createUrlTemplateImageryProvider( "tms服务", { url: Cesium.buildModuleUrl(url + "/{z}/{x}/{reverseY}.png"), }, "0", undefined, true, "" ); this.layerList.push({ id: res.id, layerData: img_layer, type: "tms" }); }, //加载WMTS服务 setAddWmtsLayer(res) { var url = this.getLayrUrl(res); var urlTemplateImageryProvider = earthCtrl.factory.createImageryLayer({ sourceType: "wmts", url: url, layer: "", format: "image/png", tileMatrixSetID: "GoogleCRS84Quad01", tileMatrixLabels: [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", ], style: "", tilingScheme: new Cesium.GeographicTilingScheme({ ellipsoid: Cesium.Ellipsoid.MOON, }), }); this.layerList.push({ id: res.id, layerData: urlTemplateImageryProvider._primitive, type: "wmts", }); }, //加载地形服务 setAddTearrinLayer(res) { this.setChangeTearrinLayer(); var url = this.getLayrUrl(res); window.terrainLayer = new Cesium.CesiumTerrainProvider({ url: url, tilingScheme: new Cesium.GeographicTilingScheme({ ellipsoid: Cesium.Ellipsoid.MOON, }), }); Viewer.terrainProvider = window.terrainLayer; Viewer.scene.globe.terrainExaggeration = 1.0000001; this.layerList.push({ id: res.id, type: "dem" }); }, //加载WMS服务 setAddWmsLayer(res) { var url = this.getLayrUrl(res); var img_layer = sgworld.Creator.createImageryProvider( "giserver", "wms", { url: url, layers: "", parameters: { format: "image/png", transparent: true, }, }, "0", undefined, true, "" ); this.layerList.push({ id: res.id, layerData: img_layer, type: "wmts", }); }, //加载模型服务 setAddModelLayer(res) { var url = this.getLayrUrl(res); let tileset = Viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ name: res.cnName, url: url, skipLevelOfDetail: true, // 在遍历时候跳过详情:false baseScreenSpaceError: 1024, maximumScreenSpaceError: 64, // 最大屏幕空间错误:16,数值加大能让最终成像变模糊 skipScreenSpaceErrorFactor: 16, skipLevels: 1, immediatelyLoadDesiredLevelOfDetail: false, loadSiblings: true, // 自动从中心开始超清化模型:false cullWithChildrenBounds: true, // 使用子项边界体积的并集来剔除图块:true cullRequestsWhileMoving: true, cullRequestsWhileMovingMultiplier: 10, // 值越小能够更快的剔除:60 preloadWhenHidden: true, preferLeaves: true, // 预装子节点:false maximumMemoryUsage: 768, // 内存分配变小有利于内存回收,提升性能体验 progressiveResolutionHeightFraction: 0.5, // 数值偏于0能够让初始加载变得模糊 dynamicScreenSpaceErrorDensity: 0.5, // 数值加大,能让周边加载变快 dynamicScreenSpaceErrorFactor: 2, // 动态屏幕空间误差的系数 dynamicScreenSpaceError: true, // 减少离相机较远的屏幕空间错误:false,全屏加载完之后才清晰化房屋 }) ); tileset.readyPromise.then((tileset) => { tileset.id = res.id; }); this.layerList.push({ id: res.id, layerData: tileset, type: "tileset" }); }, //地形移除事件 setChangeTearrinLayer() { this.layerList.forEach((e, i) => { switch (e.type) { case "dem": window.Viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider( {} ); this.layerList.splice(i, 1); break; } }); }, //清除图层 delLayer(code) { this.layerList.forEach((e, i) => { if (e.id === code) { switch (e.type) { case "wmts": window.Viewer.imageryLayers.remove(e.layerData); break; case "tms": window.Viewer.imageryLayers.remove(e.layerData); break; case "dem": window.Viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider( {} ); break; case "tileset": window.Viewer.scene.primitives.remove(e.layerData) break; } this.layerList.splice(i, 1); } }); }, delLayerAll() { this.layerList.forEach((e, i) => { switch (e.type) { case "wmts": window.Viewer.imageryLayers.remove(e.layerData); break; case "tms": window.Viewer.imageryLayers.remove(e.layerData); break; case "dem": window.Viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider( {} ); break; case "tileset": window.Viewer.scene.primitives.remove(e.layerData) break; } this.layerList.splice(i, 1); }); }, //加载GeoServer-WMS服务 setAddGeoWmsLayer(res) { var url = this.getLayrUrl(res); var that = this var getFeatureInfoFormat = new SmartEarth.Cesium.GetFeatureInfoFormat("html", null, function (html) { that.getFeatureInfo(html) }); let layer = new SmartEarth.Cesium.WebMapServiceImageryProvider({ url: url, layers: res.tab, getFeatureInfoParameters: { info_format: 'text/html' }, enablePickFeatures: true, getFeatureInfoFormats: [getFeatureInfoFormat], parameters: { transparent: true, format: "image/png", srs: "EPSG:104903", styles: "", }, tileWidth: 512, tileHeight: 512, }); layer.name = `Wms_Layer${res.id}`; let img_layer = window.Viewer.imageryLayers.addImageryProvider(layer); this.layerList.push({ id: res.id, layerData: img_layer, type: "wmts" }); }, addGeoServerMmsLayers(layer, url) { var that = this var getFeatureInfoFormat = new SmartEarth.Cesium.GetFeatureInfoFormat("html", null, function (html) { that.getFeatureInfo(html) }); let wmslayer = new SmartEarth.Cesium.WebMapServiceImageryProvider({ url: url, layers: layer.toString(), getFeatureInfoParameters: { info_format: 'text/html' }, enablePickFeatures: true, getFeatureInfoFormats: [getFeatureInfoFormat], parameters: { transparent: true, format: "image/png", srs: "EPSG:104903", styles: "", }, tileWidth: 512, tileHeight: 512, }); wmslayer.name = `Wms_Layer_geo`; let img_layer = window.Viewer.imageryLayers.addImageryProvider(wmslayer); this.layerList.push({ id: 1001011, layerData: img_layer, type: "wmts" }); }, getFeatureInfo(html) { store.state.details.showDetails = false; 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 gindex = null; for (var i = 0; i < std.length; i++) { if (std[i].indexOf('gid') > -1) { gindex = i; break; } } if (!gindex) return var str = html.substr(html.indexOf(''), html.lastIndexOf('') - html.indexOf('') + 5).replaceAll(' ', '').replaceAll('\n', '').split('') var gid = parseInt(str[gindex].replaceAll( '', '' )) if (gid && tab) { store.state.details = { gid: gid, tab: tab, showDetails: true } } }, }; export default server;