From bab3c509ded84f1caa3d8e79a65b7113db8913df Mon Sep 17 00:00:00 2001 From: Surpriseplus <845948745@qq.com> Date: 星期五, 24 三月 2023 16:04:47 +0800 Subject: [PATCH] 一张图图层控制修改,发布管理添加表格双击复制功能,发布管理页面模型附件管理页面修改,在线制图修改 --- src/components/preview_map.vue | 456 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 387 insertions(+), 69 deletions(-) diff --git a/src/components/preview_map.vue b/src/components/preview_map.vue index cb39621..e135114 100644 --- a/src/components/preview_map.vue +++ b/src/components/preview_map.vue @@ -21,6 +21,115 @@ > </el-tree> </div> + <div + v-if="editModelFlag" + class="modelLayer box_divm" + > + <el-form + ref="form" + :model="modelForm" + label-width="80px" + > + <el-form-item> + <el-button + size="small" + @click="locateTo" + >瀹氫綅</el-button> + <el-button + size="small" + @click="showTileset" + >鏄鹃殣</el-button> + <el-button + size="small" + @click="underground" + >鍦颁笅</el-button> + <el-button + size="small" + @click="pickupCoords" + >鎷惧彇</el-button> + <el-button + size="small" + @click="reload" + > + 閲嶈浇 + </el-button> + <el-button + size="small" + @click="resave" + >淇濆瓨</el-button> + </el-form-item> + <el-form-item label="缁忓害:"> + <el-input + size="small" + v-model="modelForm.lon" + @input="update" + ></el-input> + <el-slider + v-model="modelForm.lon" + @input="update" + :min="73" + :step="0.001" + :max="135" + ></el-slider> + </el-form-item> + <el-form-item label="绾害:"> + <el-input + size="small" + v-model="modelForm.lat" + @input="update" + ></el-input> + <el-slider + v-model="modelForm.lat" + @input="update" + :min="3" + :step="0.001" + :max="54" + ></el-slider> + </el-form-item> + <el-form-item label="楂樺害:"> + <el-input + size="small" + v-model="modelForm.height" + @input="update" + ></el-input> + <el-slider + v-model="modelForm.height" + :min="-800" + :step="1" + @input="update" + :max="8800" + ></el-slider> + </el-form-item> + <el-form-item label="瑙掑害:"> + <el-input + size="small" + v-model="modelForm.yaw" + @input="update" + ></el-input> + <el-slider + v-model="modelForm.yaw" + :min="0" + @input="update" + :step="0.1" + :max="360" + ></el-slider> + </el-form-item> + <el-form-item label="閫忔槑搴�:"> + <el-input + size="small" + v-model="modelForm.alpha" + @input="update" + ></el-input> + <el-slider + v-model="modelForm.alpha" + @input="update" + :min="0" + :step="0.01" + :max="1" + ></el-slider> + </el-form-item> + </el-form> + </div> <el-dialog :title="formInline.title" @@ -220,11 +329,14 @@ v-if="dialog.isJpg" class="pdfClass" > - <img + + <el-image style="width:100%; height:100%" :src="dialog.src" - alt="" - /> + :preview-src-list="[dialog.src]" + > + </el-image> + </div> </el-dialog> </div> @@ -237,7 +349,9 @@ comprehensive_insertModel, comprehensive_updateModel, comprehensive_selectFiles, - dataQuery_deletes + dataQuery_deletes, + publish_update, + comprehensive_selectPubById } from '../api/api.js'; import { getToken } from '@/utils/auth'; export default { @@ -299,6 +413,21 @@ isJpg: false, src: '' }, + modelType: ['ifc', 'fbx', 'rvt', '3dml'], + editModelFlag: false, + modelForm: { + lon: 119, + lat: 39, + height: 0, + yaw: 0, + alpha: 1 + }, + app: { + tileset: null, + isBusy: false, + under: false, + handler: null + } } }, mounted() { @@ -434,15 +563,25 @@ }, async EditData() { const data = await comprehensive_updateModel(this.formInline) + + if (data.code != 200) { this.$message.error('淇敼澶辫触'); - } else { - this.$message({ - message: '淇敼鎴愬姛', - type: 'success' - }); + return } - this.startModelData(); + + + this.$message({ + message: '淇敼鎴愬姛', + type: 'success' + }); + + var that = this; + that.dialogVisible = false; + this.formInline.title = this.formInline.name + that.dialogVisible = true; + + }, async InsertData() { var std = { @@ -456,13 +595,19 @@ const data = await comprehensive_insertModel(std) if (data.code != 200) { this.$message.error('娣诲姞澶辫触'); - } else { - this.$message({ - message: '娣诲姞鎴愬姛', - type: 'success' - }); } - this.startModelData(); + this.$message({ + message: '娣诲姞鎴愬姛', + type: 'success' + }); + + var that = this; + that.dialogVisible = false; + this.formInline.title = this.formInline.name + that.dialogVisible = true; + + + }, handleClose() { @@ -548,14 +693,56 @@ skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false }) ); + var that = this; tileset.readyPromise.then((tileset) => { tileset.id = res.cnName; tileset.layerId = res.id; - this.tileSet(tileset, parseFloat(res.elev)) - Viewer.flyTo(tileset); + that.getArgsTileset(tileset, res); }); } }, + + async getArgsTileset(tileset, res) { + + if (res.pubid > 0) { + const data = await comprehensive_selectPubById({ id: res.pubid }) + + if (data.code != 200) { + + } else { + this.reloadTile(tileset, data.result.json) + } + } else { + this.tileSet(tileset, parseFloat(res.elev)) + + } + }, + tileSet(tileset, height) { + //3dtile妯″瀷鐨勮竟鐣岀悆浣� + var boundingSphere = tileset.boundingSphere; + //杩崱灏旂┖闂寸洿瑙掑潗鏍�=>鍦扮悊鍧愭爣锛堝姬搴﹀埗锛� + var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center); + //鍦扮悊鍧愭爣锛堝姬搴﹀埗锛�=>杩崱灏旂┖闂寸洿瑙掑潗鏍� + var Cartesian3_original = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height); + var Cartesian3_offset = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height); + //鑾峰緱鍦伴潰鍜宱ffset鐨勮浆鎹� + var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3()); + //淇敼妯″瀷鐭╅樀 + tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + Viewer.flyTo(tileset); + }, + reloadTile(tileset, res) { + var vm = JSON.parse(res) + var pos = Cesium.Cartesian3.fromDegrees(vm.lon, vm.lat, vm.height); + var converter = Cesium.Transforms.eastNorthUpToFixedFrame; + var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(vm.yaw), 0, 0); + var matrix = Cesium.Transforms.headingPitchRollToFixedFrame(pos, hpr, Cesium.Ellipsoid.WGS84, converter); + tileset._root.transform = matrix; + Viewer.flyTo(tileset); + }, + + + handleCheckChange(data, checked, indeterminate) { if (data.type == 1) { this.getchilds(data); @@ -591,17 +778,12 @@ init3DMap() { //鍦板浘鍒濆鍖� window.sgworld = new SmartEarth.SGWorld("mapdiv", { - licenseServer: window.sceneConfig.licenseServer, }); - window.Viewer = window.sgworld._Viewer; - // Viewer.camera.flyTo({ // destination: Cesium.Cartesian3.fromDegrees(110, 33, 8000000), // }); - - Viewer._enableInfoOrSelection = false; //鏄剧ずfps Viewer.scene.debugShowFramesPerSecond = false; @@ -612,14 +794,20 @@ //寮�鍚繁搴︽娴� // sg.Analysis.depthTestAgainstTerrain(true) Viewer.scene.globe.depthTestAgainstTerrain = true; - - // window.elevationTool = new SmartEarth.ElevationTool(window.sg); // elevationTool.setContourColor("#F1D487"); + var option = { + url: window.sceneConfig.SGUrl, + layerName: window.sceneConfig.mptName, + requestVertexNormals: true, + }; + window.terrainLayer = sgworld.Creator.sfsterrainprovider("", option, "", true, ""); + + if (this.$store.state.previewLayer) { var res = this.$store.state.previewLayer; - + var type = res.type; if (res.url.indexOf('.png') != -1) { var wkt = this.$wkt.parse(res.geom); var height = this.getHeight(wkt.coordinates[2]) @@ -628,43 +816,182 @@ url: res.url, maximumLevel: 18 }) - ); Viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(wkt.coordinates[1], wkt.coordinates[0], height), }); } else if (res.url.indexOf('.json') != -1) { - var tileset = Viewer.scene.primitives.add( - new Cesium.Cesium3DTileset({ - url: res.url, //192.168.20.106,to4 - maximumScreenSpaceError: 64, // 鏈�澶у睆骞曠┖闂撮敊璇細16 - maximumMemoryUsage: 768, // 鏈�澶у唴瀛橈細512 - dynamicScreenSpaceError: true, // 鍑忓皯绂荤浉鏈鸿緝杩滅殑灞忓箷绌洪棿閿欒锛歠alse - skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false - }) - ); - tileset.readyPromise.then((tileset) => { - tileset.id = res.cnName; - tileset.layerId = res.id; - this.tileSet(tileset, 50) - Viewer.flyTo(tileset); - }); - } else if (res.url.indexOf('.mpt') != -1) { + if (this.app.tileset) viewer.scene.primitives.remove(this.app.tileset); + this.app.tileset = this.createTileset(res); + var that = this; + Viewer.scene.primitives.add(this.app.tileset).readyPromise.then(function (ts) { + that.setModleLocatin() + Viewer.flyTo(ts); + }); + + } else if (res.url.indexOf('.mpt') != -1) { Viewer.imageryLayers.removeAll(); var url = res.url.split(';') - - sgworld.Creator.createImageryProvider('mpt褰卞儚', "wms", { url: url[0], layers: url[1] }, "0", undefined, true, ""); - } else if (res.url.indexOf('menuLayer') != -1) { this.setShowModelLayer(); } } }, + async resave() { + this.$store.state.previewLayer.json = JSON.stringify(this.modelForm); + + const data = await publish_update(this.$store.state.previewLayer); + if (data.code != 200) { + this.$message.error('鏁版嵁淇濆瓨澶辫触'); + } else { + this.$message({ + message: '鏁版嵁淇濆瓨鎴愬姛', + type: 'success' + }); + } + this.reload(); + }, + reload() { + var json = JSON.stringify(this.modelForm); + var url = this.$store.state.previewLayer.url; + if (!url) return; + if (this.app.tileset) Viewer.scene.primitives.remove(this.app.tileset); + + this.app.isBusy = true; + this.app.tileset = this.createTileset(this.$store.state.previewLayer); + var that = this; + Viewer.scene.primitives.add(this.app.tileset).readyPromise.then(function (ts) { + that.modelForm = JSON.parse(json); + var pos = Cesium.Cartesian3.fromDegrees(parseFloat(that.modelForm.lon), parseFloat(that.modelForm.lat), parseFloat(that.modelForm.height)); + + + var converter = Cesium.Transforms.eastNorthUpToFixedFrame; + var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(parseFloat(that.modelForm.yaw)), 0, 0); + var matrix = Cesium.Transforms.headingPitchRollToFixedFrame(pos, hpr, Cesium.Ellipsoid.WGS84, converter); + that.app.tileset._root.transform = matrix; + Viewer.flyTo(ts); + that.app.isBusy = false; + }); + }, + + //鎷惧彇 + pickupCoords() { + if (this.app.handler) { + this.app.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); + this.app.handler = undefined; + return; + } + var that = this; + this.app.handler = new Cesium.ScreenSpaceEventHandler(Viewer.scene.canvas); + this.app.handler.setInputAction(function (event) { + + var ray = Viewer.camera.getPickRay(event.position); + var cartesian = Viewer.scene.globe.pick(ray, Viewer.scene); + var cartographic = Cesium.Cartographic.fromCartesian(cartesian); + var x = that.toFixed(Cesium.Math.toDegrees(cartographic.longitude), 7); + var y = that.toFixed(Cesium.Math.toDegrees(cartographic.latitude), 7); + var z = that.toFixed(cartographic.height, 3); + + that.modelForm.lon = x; + that.modelForm.lat = y; + that.modelForm.height = z; + that.pickupCoords(); + }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + }, + // 淇濈暀灏忔暟浣� + toFixed(d, n) { + var p = Math.pow(10, n); + + return Math.round(d * p) / p; + }, + update() { + this.setTilesetArgs(this.modelForm); + sgworld.Analysis.UndergroundMode(this.app.under, this.modelForm.alpha) + }, + setTilesetArgs(f) { + + if (!this.app.tileset || this.app.isBusy) return; + + var pos = Cesium.Cartesian3.fromDegrees(parseFloat(f.lon), parseFloat(f.lat), parseFloat(f.height)); + + var converter = Cesium.Transforms.eastNorthUpToFixedFrame; + var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(parseFloat(f.yaw)), 0, 0); + var matrix = Cesium.Transforms.headingPitchRollToFixedFrame(pos, hpr, Cesium.Ellipsoid.WGS84, converter); + var model = this.app.tileset + model._root.transform = matrix; + }, + //鍦颁笅 + underground() { + this.app.under = !this.app.under; + sgworld.Analysis.UndergroundMode(this.app.under, this.modelForm.alpha) + }, + //鏄鹃殣 + showTileset() { + if (!this.app.tileset) return; + this.app.tileset.show = !this.app.tileset.show; + }, + //瀹氫綅 + locateTo() { + if (!this.app.tileset) return; + Viewer.flyTo(this.app.tileset); + }, + createTileset(res) { + return new Cesium.Cesium3DTileset({ + url: res.url, + name: 'tsTest', + skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false + baseScreenSpaceError: 1024, + maximumScreenSpaceError: 64, // 鏈�澶у睆骞曠┖闂撮敊璇細16锛屾暟鍊煎姞澶ц兘璁╂渶缁堟垚鍍忓彉妯$硦 + skipScreenSpaceErrorFactor: 16, + skipLevels: 1, + immediatelyLoadDesiredLevelOfDetail: false, + loadSiblings: true, // 鑷姩浠庝腑蹇冨紑濮嬭秴娓呭寲妯″瀷锛歠alse + cullWithChildrenBounds: true, // 浣跨敤瀛愰」杈圭晫浣撶Н鐨勫苟闆嗘潵鍓旈櫎鍥惧潡锛歵rue + cullRequestsWhileMoving: true, + cullRequestsWhileMovingMultiplier: 10, // 鍊艰秺灏忚兘澶熸洿蹇殑鍓旈櫎锛�60 + preloadWhenHidden: true, + preferLeaves: true, // 棰勮瀛愯妭鐐癸細false + maximumMemoryUsage: 256, // 鍐呭瓨鍒嗛厤鍙樺皬鏈夊埄浜庡唴瀛樺洖鏀讹紝鎻愬崌鎬ц兘浣撻獙 + progressiveResolutionHeightFraction: 0.5, // 鏁板�煎亸浜�0鑳藉璁╁垵濮嬪姞杞藉彉寰楁ā绯� + dynamicScreenSpaceErrorDensity: 0.5, // 鏁板�煎姞澶э紝鑳借鍛ㄨ竟鍔犺浇鍙樺揩 + dynamicScreenSpaceErrorFactor: 2, // 鍔ㄦ�佸睆骞曠┖闂磋宸殑绯绘暟 + dynamicScreenSpaceError: true // 鍑忓皯绂荤浉鏈鸿緝杩滅殑灞忓箷绌洪棿閿欒锛歠alse锛屽叏灞忓姞杞藉畬涔嬪悗鎵嶆竻鏅板寲鎴垮眿 + }); + }, + setEditModelLayer(res) { + this.editModelFlag = true; + if (res.json) { + var json = JSON.parse(res.json) + this.modelForm = json; + this.reload(); + } else { + this.getTilesetArgs(); + } + + }, + setModleLocatin() { + var res = this.$store.state.previewLayer; + var type = res.type; + if (this.modelType.indexOf(type) != -1) { + this.setEditModelLayer(res) + } + }, + getTilesetArgs() { + this.app.isBusy = true; + var cm = this.app.tileset._root.transform; + var cartesian = new Cesium.Cartesian3(cm[12], cm[13], cm[14]); + var carto = Cesium.Cartographic.fromCartesian(cartesian); + this.modelForm.lon = Cesium.Math.toDegrees(carto.longitude).toFixed(7); + this.modelForm.lat = Cesium.Math.toDegrees(carto.latitude).toFixed(7); + this.modelForm.height = carto.height.toFixed(3); + this.app.isBusy = false; + }, + async setShowModelLayer() { const data = await perms_selectLayers(); if (data.code != 200) { @@ -694,19 +1021,10 @@ window.pickedColor = window.pickedFeature.color window.pickedFeature.color = Cesium.Color.RED.withAlpha(0.3); that.setShowModelInfo(pickedFeature); - // this.$store.state.catModel = true; - // this.$store.state.catModelInfo = { - // id: pickedFeature.getProperty("id"), - // name: pickedFeature.getProperty("name"), - // layerId: pickedFeature.primitive.layerId, - // layerName: pickedFeature.primitive.id - // }; } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK) - - } }, setTreeData(source) { @@ -720,19 +1038,19 @@ return father.pid == 430; // 杩斿洖涓�绾ц彍鍗� }); }, - tileSet(tileset, height) { - //3dtile妯″瀷鐨勮竟鐣岀悆浣� - var boundingSphere = tileset.boundingSphere; - //杩崱灏旂┖闂寸洿瑙掑潗鏍�=>鍦扮悊鍧愭爣锛堝姬搴﹀埗锛� - var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center); - //鍦扮悊鍧愭爣锛堝姬搴﹀埗锛�=>杩崱灏旂┖闂寸洿瑙掑潗鏍� - var Cartesian3_original = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height); - var Cartesian3_offset = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height); - //鑾峰緱鍦伴潰鍜宱ffset鐨勮浆鎹� - var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3()); - //淇敼妯″瀷鐭╅樀 - tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); - }, + // tileSet(tileset, height) { + // //3dtile妯″瀷鐨勮竟鐣岀悆浣� + // var boundingSphere = tileset.boundingSphere; + // //杩崱灏旂┖闂寸洿瑙掑潗鏍�=>鍦扮悊鍧愭爣锛堝姬搴﹀埗锛� + // var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center); + // //鍦扮悊鍧愭爣锛堝姬搴﹀埗锛�=>杩崱灏旂┖闂寸洿瑙掑潗鏍� + // var Cartesian3_original = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height); + // var Cartesian3_offset = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height); + // //鑾峰緱鍦伴潰鍜宱ffset鐨勮浆鎹� + // var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3()); + // //淇敼妯″瀷鐭╅樀 + // tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + // }, getHeight(level) { if (level > 0 && level < 23) { return this.levelArray[level] @@ -756,7 +1074,7 @@ border: 1px solid #409eff; margin: 10px; - max-height: 300px; + max-height: 600px; overflow: auto; } .pdfClass { -- Gitblit v1.9.3