diff --git a/src/views/aiSupervision/layerManage/resource/LayerDetails.vue b/src/views/aiSupervision/layerManage/resource/LayerDetails.vue index c4480b6..d5f7fdb 100644 --- a/src/views/aiSupervision/layerManage/resource/LayerDetails.vue +++ b/src/views/aiSupervision/layerManage/resource/LayerDetails.vue @@ -164,12 +164,16 @@ export default { value: '021102', label: 'ArcGISRest图层' }, + { + value: '081100', + label: 'SuperMapRest图层' + }, { value: '030300', label: 'WFS200' }, { - value: '113200', + value: '080100', label: 'S3M图层' }, { diff --git a/src/views/aiSupervision/waterSetting/runScene/layerTree/index.js b/src/views/aiSupervision/waterSetting/runScene/layerTree/index.js index ecc9c66..8198112 100644 --- a/src/views/aiSupervision/waterSetting/runScene/layerTree/index.js +++ b/src/views/aiSupervision/waterSetting/runScene/layerTree/index.js @@ -1,3 +1,4 @@ +import SuperMapImageryLayer from './supermapImageryLayer'; const createXyzLayer = (data) => new sycim.XyzLayer(data.id, { ...data, @@ -18,11 +19,32 @@ const layerTypeEnum = { '070100': 'BINGMAP', '040003': 'WFS', '021102': 'ARCGIS_DYNAMIC', - 113200: 'S3M' + '080100': 'S3M' }; // 图层响应动作 const layerActions = { + '011100': (data) => + new sycim.BaiduLayer(data.id, { + ...data, + style: data.layerTable, + crs: 'WGS84' + }), + '012000': (data) => new sycim.PrimitiveLayer(data.id), + '013000': (data) => new sycim.TilesetLayer(data.id), + '014000': createXyzLayer, + '021102': (data) => + new sycim.ArcgisDynamicLayer(data.id, { + url: data.url + }), + '030100': (data) => + new sycim.WmtsLayer(data.id, { + ...data, + url: data.url, + layer: data.layerTable, + tileMatrixSetID: data.tileMatrixSet, + style: data.style || '' + }), '030200': (data) => new sycim.WmsLayer(data.id, { ...data, @@ -40,14 +62,6 @@ const layerActions = { } return new sycim.WfsLayer(data.id, data.url, data.layerTable, options); }, - '030100': (data) => - new sycim.WmtsLayer(data.id, { - ...data, - url: data.url, - layer: data.layerTable, - tileMatrixSetID: data.tileMatrixSet, - style: data.style || '' - }), '030400': async (data) => { const options = {}; if (data.relationStyleId) { @@ -56,11 +70,10 @@ const layerActions = { } return new sycim.GeoJsonLayer(data.id, data.url, options); }, - '011100': (data) => - new sycim.BaiduLayer(data.id, { - ...data, - style: data.layerTable, - crs: 'WGS84' + '040003': (data) => + new sycim.WfsLayer(data.id, data.url, data.layerTable, { + cql_filter: data.filter, + propertyName: '*' }), '050100': (data) => { let url = `${data.proxyUrl}${data.url}`; @@ -77,22 +90,10 @@ const layerActions = { } }); }, + '060100': createXyzLayer, '070100': (data) => new sycim.BingMapLayer(data.id, { ...data - }), - '060100': createXyzLayer, - '014000': createXyzLayer, - '013000': (data) => new sycim.TilesetLayer(data.id), - '012000': (data) => new sycim.PrimitiveLayer(data.id), - '040003': (data) => - new sycim.WfsLayer(data.id, data.url, data.layerTable, { - cql_filter: data.filter, - propertyName: '*' - }), - '021102': (data) => - new sycim.ArcgisDynamicLayer(data.id, { - url: data.url }) }; @@ -116,9 +117,10 @@ function zoomToLayerByType(data) { defaultZoomToLayer(data); } } -const supermapTileLayer = {}; +const supermapLayer = {}; +// 超图s3m图层定位 function zoomToS3MLayer(data) { - if (supermapTileLayer[data.id]) { + if (supermapLayer[data.id]) { Cesium.Resource.fetchJson(data.url + '/scenes.json').then(function (scenes) { let sname = scenes && scenes[0].name; Cesium.Resource.fetchJson(data.url + '/scenes/' + sname + '.json').then(function (jsonData) { @@ -144,18 +146,16 @@ function zoomToS3MLayer(data) { } } +// 超图影像图层定位 +function zoomToSuperMapImageryLayer(data) { + if (supermapLayer[data.id]) { + supermapLayer[data.id].zoomToLayer(); + } +} + // 图层缩放响应动作 const zoomToLayerActions = { - '030200': zoomToLayerByType, - '030300': zoomToLayerByType, - '030100': zoomToLayerByType, - '030400': zoomToLayerByType, '011100': zoomToLayerByType, - '050100': zoomToLayerByType, - '070100': zoomToLayerByType, - '060100': zoomToLayerByType, - '014000': zoomToLayerByType, - '013000': zoomToLayerByType, '012000': (data) => { // modal const { modelInitPosition } = data; @@ -163,27 +163,47 @@ const zoomToLayerActions = { const p = JSON.parse(modelInitPosition); window.viewer.flyToPosition(new sycim.Position(p.lng, p.lat, p.alt + 500, 0, -90, 0)); }, - '040003': zoomToLayerByType, + '013000': zoomToLayerByType, + '014000': zoomToLayerByType, '021102': zoomToLayerByType, - 113200: zoomToS3MLayer + '030200': zoomToLayerByType, + '030300': zoomToLayerByType, + '030100': zoomToLayerByType, + '030400': zoomToLayerByType, + '040003': zoomToLayerByType, + '050100': zoomToLayerByType, + '060100': zoomToLayerByType, + '070100': zoomToLayerByType, + '080100': zoomToS3MLayer, + '081100': zoomToSuperMapImageryLayer }; // 添加图层 export async function addLayer(layerData) { const { layerType, url, id } = layerData; let action = null; - if (layerType === '113200') { - if (supermapTileLayer[id]) { - supermapTileLayer[id].show = true; + // 超图 S3M图层 + if (layerType === '080100') { + if (supermapLayer[id]) { + supermapLayer[id].show = true; } else { const layerPromise = window.viewer.scene.open(url, { autoSetView: false //不自动定位 }); layerPromise.then((layer) => { - supermapTileLayer[id] = layer?.[0]; + supermapLayer[id] = layer?.[0]; }); } return; + } else if (layerType === '081100') { + // 超图的影像图层 + if (supermapLayer[id]) { + supermapLayer?.[id]?.show(); + } else { + const layer = new SuperMapImageryLayer(url, { viewer: window.viewer }); + supermapLayer[id] = layer; + } + return; } if (!layerType || !(action = layerActions[layerType])) return; const layer = await action(layerData); @@ -207,14 +227,16 @@ export function removeLayer(layerData) { const { id, layerType } = layerData; if (!layerType) return; const type = layerTypeEnum[layerType]; - if (layerType === '113200') { - if (supermapTileLayer[id]) { - supermapTileLayer[id].show = false; + if (layerType === '080100') { + if (supermapLayer[id]) { + supermapLayer[id].show = false; } + } else if (layerType === '081100') { + supermapLayer?.[id]?.hide(); } else { window.viewer.removeLayer({ id, - type: sycim.LayerType[type] + type: SyCim.LayerType[type] }); } } diff --git a/src/views/aiSupervision/waterSetting/runScene/layerTree/supermapImageryLayer.js b/src/views/aiSupervision/waterSetting/runScene/layerTree/supermapImageryLayer.js new file mode 100644 index 0000000..356ac21 --- /dev/null +++ b/src/views/aiSupervision/waterSetting/runScene/layerTree/supermapImageryLayer.js @@ -0,0 +1,131 @@ +import axios from 'axios'; + +class SuperMapImageryLayer { + constructor(url, options) { + this.viewer = options.viewer; + this.options = options || {}; + this.layerUrl = url; + this.layerName = ''; + this.layerInfo = null; + this.layerProvider = null; + this.scales84 = []; + this.scalesweb = []; + this._delegate = null; + this.loadData(); + } + loadData() { + this.scales84 = [ + 3.38032714321e-9, 6.76065428641e-9, 1.352130857282e-8, 2.704261714564e-8, 5.408523429128e-8, 1.0817046858257e-7, + 2.1634093716514e-7, 4.3268187433028e-7, 8.6536374866056e-7, 1.73072749732112e-6, 3.46145499464224e-6, + 6.92290998928448e-6, 1.3845819978568952e-5, 2.7691639957137904e-5, 5.538327991427581e-5, 1.1076655982855162e-4, + 2.2153311965710323e-4, 4.4306623931420646e-4, 8.861324786284129e-4, 0.0017722649572568258, 0.0035445299145136517, + 0.007089059829027303 + ]; + + this.scalesweb = [ + 1.6901635716e-9, 3.38032714321e-9, 6.76065428641e-9, 1.352130857282e-8, 2.704261714564e-8, 5.408523429128e-8, + 1.0817046858257e-7, 2.1634093716514e-7, 4.3268187433028e-7, 8.6536374866056e-7, 1.73072749732112e-6, + 3.46145499464224e-6, 6.92290998928448e-6, 1.3845819978568952e-5, 2.7691639957137904e-5, 5.538327991427581e-5, + 1.1076655982855162e-4, 2.2153311965710323e-4, 4.4306623931420646e-4, 8.861324786284129e-4, 0.0017722649572568258, + 0.0035445299145136517, 0.007089059829027303 + ]; + axios + .get(`${this.layerUrl}.json`) + .then((res) => { + if (res.status !== 200) return; + const result = res.data; + this.layerName = this.options.name || result.name; + this.layerInfo = result; + const rectangle = sycim.Rectangle.fromDegrees(-180, -90, 180, 90); + const epsgcode = result.prjCoordSys.epsgCode; + let tilingScheme = ''; + let minlevel = 0; + let maxlevel = 22; + let originx = 0; + let originy = 0; + + if (epsgcode === 4326) { + tilingScheme = new sycim.GeographicTilingScheme({ + numberOfLevelZeroTilesX: 2, + numberOfLevelZeroTilesY: 1 + }); + originx = -180; + originy = 90; + if (this.options.minimumLevel !== undefined) { + minlevel = this.options.minimumLevel; + } else { + minlevel = 0; + } + if (this.options.maximumLevel !== undefined) { + maxlevel = this.options.maximumLevel; + } else { + maxlevel = 22; + } + } + if (epsgcode === 3857) { + tilingScheme = new sycim.WebMercatorTilingScheme(); + originx = -20037508.34; + originy = 20037508.34; + if (this.options.minimumLevel !== undefined) { + console.log('not undefined'); + minlevel = this.options.minimumLevel; + } else { + minlevel = 0; + } + if (this.options.maximumLevel !== undefined) { + maxlevel = this.options.maximumLevel; + } else { + maxlevel = 22; + } + } + + this.layerProvider = new sycim.Cesium.UrlTemplateImageryProvider({ + url: + this.layerUrl + + "/tileImage.png?transparent=true&cacheEnabled=true&width=256&height=256&x={x}&y={y}&scale={scale}&redirect=false&overlapDisplayed=false&origin={'x':" + + originx + + ",'y':" + + originy + + '}', + rectangle: rectangle, + minimumLevel: minlevel || 0, + maximumLevel: maxlevel || 22, + tilingScheme: tilingScheme, + customTags: { + scale: function (imageryProvider, x, y, level) { + if (epsgcode === 4326) { + return this.scales84[level]; + } + if (epsgcode === 3857) { + return this.scalesweb[level]; + } + }, + scales84: this.scales84, + scalesweb: this.scalesweb // Add the missing property "scalesweb" + } + }); + + this._delegate = viewer.imageryLayers.addImageryProvider(this.layerProvider); + }) + .catch((err) => { + console.log(err); + }); + } + zoomToLayer() { + if (!this._delegate) return; + const { left, bottom, right, top } = this.layerInfo.bounds; + this.viewer.camera.flyTo({ + destination: sycim.Rectangle.fromDegrees(left, bottom, right, top) + }); + } + show() { + if (!this._delegate) return; + this._delegate.show = true; + } + hide() { + if (!this._delegate) return; + this._delegate.show = false; + } +} + +export default SuperMapImageryLayer;