import { getToken } from "@/utils/auth"; //配置文件地址 // import config from "../../../../public/config/config"; import store from "@/store"; import { nextTick } from "vue"; const server = { layerList: [], graticules: null, alpha: null,//透明度 geoLayer: [], geoUrl: null, wmsLayerId: null, addTreeData(treeNode) { // if (!treeNode.checked) { // debugger // this.delLayer(treeNode.id); // return; // } this.alpha = this.getResLayersAlpha(treeNode); //判断是否为代理 if (treeNode.proxy) { this.addProxyAddress(treeNode); //有代理 } else { this.addUrlAddress(treeNode); //无代理 } if (this.graticules) { window.Viewer.imageryLayers.raiseToTop(this.graticules.imageryLayer); } }, showlonlatLine() { if (!this.graticules) { SmartEarth.Cesium.Ellipsoid.WGS84 = new SmartEarth.Cesium.Ellipsoid( 1737400.0, 1737400.0, 1737400.0 ); this.graticules = new SmartEarth.Cesium.Graticules( earthCtrl.Viewer, SmartEarth.Cesium.Color.PALEGREEN ); // graticules.makeCoordAxiss(); var that = this; earthCtrl.Viewer.scene.preUpdate.addEventListener(function () { that.graticules.update(); }); } else { this.graticules.enabled = !this.graticules.enabled; } }, //代理地址 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); this.setAddGeoWmsLayer(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); this.setAddGeoWmsLayer(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) { this.delLayer(res.id); var url = this.getLayrUrl(res); let urlTemplateImageryProvider = new Cesium.WebMapTileServiceImageryProvider({ sourceType: "wmts", url: url, layer: "", id: res.id, 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, }), }) var imageLayer = window.Viewer.imageryLayers.addImageryProvider(urlTemplateImageryProvider); imageLayer.id = res.id imageLayer.alpha = this.alpha; // urlTemplateImageryProvider.id = res.id this.layerList.push({ id: res.id, layerData: imageLayer, type: "wmts", alpha: imageLayer, }); }, //获取图层之前的透明度 getResLayersAlpha(result) { var std = this.layerList.filter(res => { if (res.id == result.id) { return res; } }); if (std.length <= 0) { return 1; } else { var id = std[0].id; var val = null; var layers = window.Viewer.imageryLayers._layers; for (var i in layers) { if (layers[i].id == id) { val = id; return layers[i].alpha; } } if (!null) { return 1 } } }, //加载地形服务 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 "wms": 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) => { this.setRemoveLayer(e); this.layerList.splice(i, 1); }); }, setRemoveLayer(e) { 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; } }, //加载GeoServer-WMS服务 setAddGeoWmsLayer(res, alpha) { // var url = res.url; var that = this; this.delLayer(res.id) var getFeatureInfoFormat = new SmartEarth.Cesium.GetFeatureInfoFormat( "html", null, function (html) { that.getFeatureInfo(html); } ); if (url.indexOf('{token}') > -1) { const token = getToken(); url = config.proxy + url.replaceAll("{token}", token); } else { url = url; } let layer = new SmartEarth.Cesium.WebMapServiceImageryProvider({ url: url, layers: res.tab, id: res.id, getFeatureInfoParameters: { info_format: "text/html", srs: "EPSG:104903" }, enablePickFeatures: true, getFeatureInfoFormats: [getFeatureInfoFormat], parameters: { transparent: true, format: "image/png", srs: "EPSG:104903", styles: "", }, tileWidth: 512, tileHeight: 512, }); let img_layer = window.Viewer.imageryLayers.addImageryProvider(layer); img_layer.name = `Wms_Layer${res.id}`; img_layer.id = res.id img_layer.alpha = alpha ? alpha : 1; this.layerList.push({ id: res.id, layerData: img_layer, type: "wmts" }); }, addGeoServerMmsLayers(layer, url) { this.geoLayer = layer; this.geoUrl = url; var that = this; var getFeatureInfoFormat = new SmartEarth.Cesium.GetFeatureInfoFormat( "html", null, function (html) { that.getFeatureInfo(html); } ); if (url.indexOf('{token}') > -1) { const token = getToken(); url = config.proxy + url.replaceAll("{token}", token); } else { url = url; } if (!this.wmsLayerId) { this.wmsLayerId = new Date(); } let wmslayer = new SmartEarth.Cesium.WebMapServiceImageryProvider({ url: url, id: this.wmsLayerId, layers: layer.toString(), getFeatureInfoParameters: { info_format: "text/html", srs: "EPSG:104903" }, enablePickFeatures: true, getFeatureInfoFormats: [getFeatureInfoFormat], parameters: { transparent: true, format: "image/png", srs: "EPSG:104903", styles: "", }, tileWidth: 512, tileHeight: 512, }); let img_layer = window.Viewer.imageryLayers.addImageryProvider(wmslayer); img_layer.id = this.wmsLayerId; this.layerList.push({ id: this.wmsLayerId, layerData: img_layer, type: "wmts" }); }, getGeoLayerChangeAlpha(res) { var std = []; for (var i in this.geoLayer) { if (this.geoLayer[i] != res.tab) { std.push(this.geoLayer[i]) } } this.geoLayer = []; this.geoLayer = std; var imageLayers = window.Viewer.imageryLayers._layers; for (var i in imageLayers) { if (imageLayers[i].id == this.wmsLayerId) { window.Viewer.imageryLayers.remove(imageLayers[i]) } } for (var i in this.layerList) { if (this.layerList[i].id == this.wmsLayerId) { this.layerList.splice(i, 1) } } if (this.geoLayer.length > 0) { this.addGeoServerMmsLayers(this.geoLayer, this.geoUrl) } this.setAddGeoWmsLayer(res); for (var i in this.layerList) { if (this.layerList[i].id == res.id) { return { id: i, layer: this.layerList[i] }; break; } } }, getFeatureInfo(html) { var start = html.indexOf('