Forráskód Böngészése

模型修改字段

tianyabing 2 éve
szülő
commit
ce1102504d

+ 1 - 1
public/config.js

@@ -16,5 +16,5 @@ var systemConfig = {
 var SkySceneryConfig = {
     userName: "user001",
     password: "1234567890",
-    authUrl: '',// 留空则使用与dtb相同oauth登录系统
+    authUrl: '',// 留空
 }

+ 6 - 2
src/components/dataManage/ImportData.vue

@@ -133,8 +133,12 @@ export default {
         {title: '标题', fieldName: 'title', require: '是', newFieldName: 'title', dataType: [1,2,3,4,6], importType: [1,2,3]},
         {title: '描述', fieldName: 'content', require: '是', newFieldName: 'content', dataType: [1,2,3,4,6], importType: [1,2,3]},
         {title: '类别', fieldName: '数据类型', require: '是', newFieldName: '', dataType: [1,2,3,4,6], importType: [1,2,3]},
-        {title: 'url地址', fieldName: 'url', newFieldName: 'url', dataType: [4], importType: [1,2,3]},
-        {title: '媒体地址', fieldName: 'modelUrl', newFieldName: 'modelUrl', dataType: [6], importType: [1,2,3]},
+        {title: '媒体地址', fieldName: 'url', newFieldName: 'url', dataType: [6], importType: [1,2,3]},
+
+        {title: '模型类型', fieldName: 'modelType', newFieldName: 'modelType', dataType: [4,6], importType: [1,2,3]},
+        {title: '模型地址', fieldName: 'modelUrls', newFieldName: 'modelUrls', dataType: [4,6], importType: [1,2,3]},
+        {title: '模型数据', fieldName: 'modelData', newFieldName: 'modelData', dataType: [4,6], importType: [1,2,3]},
+
         {title: '纬度', fieldName: 'latStr', require: '是', newFieldName: '', dataType: [1,2,3,4,6], importType: [1]},
         {title: '经度', fieldName: 'lonStr', require: '是', newFieldName: '', dataType: [1,2,3,4,6], importType: [1]},
         {title: '高程', fieldName: 'elevation', require: '是', newFieldName: '', dataType: [2,4,6], importType: [1]},

+ 2 - 4
src/components/dataManage/dataDetail/IotDataDetail.vue

@@ -184,10 +184,6 @@ export default {
   },
   created() {
     this.modelType = ModelType;
-    console.log(this.modelType);
-    for (const modelTypeKey in this.modelType) {
-      console.log(modelTypeKey)
-    }
   },
   mounted() {
     this.getMenuData();
@@ -305,6 +301,8 @@ export default {
       delete params.createDate;
       delete params.updateDate;
       params['userName'] = app.$store.state.userInfo.username;
+      params['modelUrls'] = JSON.stringify(app.formData.modelUrls)
+      params['modelData'] = JSON.stringify(app.formData.modelData)
       api.updateData(params).then(res => {
         if (res.code === 200) {
           app.$message({message: '修改成功', type: 'success'})

+ 52 - 45
src/components/dataManage/dataDetail/ModelDataDetail.vue

@@ -46,14 +46,18 @@
           </el-button>
         </el-form-item>
         <br/>
-        <el-form-item label="模型数据:" prop="url" style="width: 100%">
-          <el-input v-model="formData.url" placeholder="请设置模型地址" :disabled="formData.isDataView">
-            <template #append>
-              <el-button @click="handleMapShow(true)" class="inputButtonStyle">
-                查看模型
-              </el-button>
-            </template>
-          </el-input>
+        <el-form-item label="模型类型:" prop="modelType" >
+          <el-select v-model="formData.modelType" placeholder="请选择模型类型" clearable :disabled="formData.isDataView">
+            <el-option v-for="(item,key) in modelType" :key="key" :label="key" :value="item"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-button plain style="display: inline-block;vertical-align: top" @click="handleMapShow">预览</el-button>
+        <br/>
+        <el-form-item label="模型地址:" prop="modelUrls" style="width: 100%" v-if="[1,2,4,5].indexOf(formData.modelType)>-1">
+          <TableInput :type="1" v-model:urls="formData.modelUrls" :is-view="formData.isDataView"></TableInput>
+        </el-form-item>
+        <el-form-item label="数据地址:" prop="modelData" style="width: 100%" v-if="[3,4,5].indexOf(formData.modelType)>-1">
+          <TableInput  v-model:urls="formData.modelData" :is-view="formData.isDataView"></TableInput>
         </el-form-item>
         <el-form-item label="地名地址库:" prop="address" style="width: 100%">
           <el-input v-model="formData.address" placeholder="请输入地名地址库名称" :disabled="formData.isDataView"/>
@@ -67,9 +71,11 @@
   </el-dialog>
   <CesiumMap v-if="isMapShow"
              :is-show="isMapShow"
-             :item="formData.modelUrl"
-             :type="mapType"
-             :close="handleMapShow">
+             :type="formData.modelType"
+             :model-urls="formData.modelUrls"
+             :model-data="formData.modelData"
+             :extra-params="extraParams"
+             :close="()=>{this.isMapShow=false}">
   </CesiumMap>
 
   <OlMap v-if="isLonLatShow"
@@ -97,6 +103,8 @@ import JsonDataView from "@/components/json/JsonDataView";
 import api from "@/api/data/ModelData";
 import menuApi from "@/api/data/MenuData";
 import HighOptionData from "@/components/dataManage/dataDetail/components/HighOptionData.vue"
+import TableInput from "@/components/dataManage/dataDetail/components/TableInput.vue";
+import ModelType from "@/static/datas/ModelType.json";
 
 export default {
   data() {
@@ -141,6 +149,8 @@ export default {
       },
       category: [],
       isMapShow: false,
+      modelType: {},
+      extraParams: {},
       mapType: 2,
       isLonLatShow: false,
 
@@ -156,11 +166,25 @@ export default {
     close: Function
   },
   watch: {
-
+    "formData.modelType":function (newVal, oldVal) {
+      if (oldVal) {
+        this.formData.modelUrls = [];
+        this.formData.modelData = [];
+      }
+    }
+  },
+  created() {
+    this.modelType = ModelType;
   },
   mounted() {
     this.getMenuData();
     this.formData = this.item;
+    if (this.formData.modelType && this.formData.modelType!='') {
+      this.formData.modelType = Number(this.formData.modelType)
+    }
+    if (this.formData.modelUrls && this.formData.modelUrls!='') {
+      this.formData.modelUrls = JSON.parse(this.formData.modelUrls)
+    }
     this.oriFormData = JSON.parse(JSON.stringify(this.formData))
   },
   components: {
@@ -168,44 +192,23 @@ export default {
     OlMap,
     JsonDataView,
     HighOptionData,
+    TableInput,
   },
   methods: {
     setProperties(item) {
       this.formData['properties'] = item;
     },
-    handleMapShow(flag) {
-      if (flag) {
-        if (this.formData.url && this.formData.url !== '') {
-          let token = this.$store.state.token;
-          let split = this.formData.url.split('?');
-          let url = split[0]
-          let queryParams = {};
-          if (split.length>1) {
-            let queryString = split[1].split('&');
-            for (let i = 0; i < queryString.length; i++) {
-              let param = queryString[i].split('=')
-              queryParams[param[0]] = param[1];
-            }
-          }
-          if (!queryParams['servertype'] || queryParams['servertype']==='') {
-            queryParams['servertype'] = this.formData.title
-          }
-          queryParams['token'] = token;
-          url = url+'?';
-          for (const queryParamsKey in queryParams) {
-            url = url+'&'+queryParamsKey+'='+queryParams[queryParamsKey];
-          }
-          this.formData.modelUrl = url;
-          if (this.formData.modelType == '水面-json') {
-            this.mapType = 4;
-          }
-          this.isMapShow = true
-        } else {
-          this.$message({message: '请输入模型地址', type: 'warning'})
-        }
-      } else {
-        this.isMapShow = false
-      }
+    handleMapShow() {
+      this.extraParams = {
+        lon: this.formData.lon,
+        lat: this.formData.lat,
+        elevation: this.formData.elevation,
+        heading: this.formData.azimuth,
+        pitch: this.formData.angleOfPitch,
+        roll: 0,
+        title: this.formData.title
+      };
+      this.isMapShow = true;
     },
     handleLonlatSelect(flag) {
       if (flag) {
@@ -277,6 +280,8 @@ export default {
       let params = JSON.parse(JSON.stringify(app.formData));
       params['menuNameOne'] = '模型数据'
       params['userName'] = app.$store.state.userInfo.username;
+      params['modelUrls'] = JSON.stringify(app.formData.modelUrls)
+      params['modelData'] = JSON.stringify(app.formData.modelData)
       api.addData(params).then(res => {
         if (res.code === 200) {
           app.$message({message: '录入成功', type: 'success'})
@@ -291,6 +296,8 @@ export default {
       delete params.createDate;
       delete params.updateDate;
       params['userName'] = app.$store.state.userInfo.username;
+      params['modelUrls'] = JSON.stringify(app.formData.modelUrls)
+      params['modelData'] = JSON.stringify(app.formData.modelData)
       api.updateData(params).then(res => {
         if (res.code === 200) {
           app.$message({message: '修改成功', type: 'success'})

+ 77 - 6
src/components/map/CesiumMap.vue

@@ -133,11 +133,11 @@ export default {
       }
       // 加载点位(3DTiles)
       else if (type === 4) {
-        app.addPositionTiles();
+        app.addPositionTiles(app.modelData, app.modelUrls);
       }
       // 加载点位(gltf/glb)
       else if (type === 5) {
-        app.addPositionGltf();
+        app.addPositionGltf(app.modelData, app.modelUrls);
       }
     },
     // 加载GeoJson
@@ -151,7 +151,6 @@ export default {
       })
       viewer.dataSources.add(res);
       res.then(() => {
-        debugger
         viewer.zoomTo(res, {heading: 2.718565, pitch: -0.415366, roll: 0.0,});
       }).catch(() => {
         app.$message({message: '加载失败', type: 'error'})
@@ -259,25 +258,97 @@ export default {
       });
     },
     // 添加点位(3DTiles)
-    addPositionTiles() {
+    addPositionTiles(jsonUrls, urls) {
+      let app = this;
+      let pos = {}
+      for (let i = 0; i < urls.length; i++) {
+        for (let j = 0; j < jsonUrls.length; j++) {
+          app.renderPositionTiles(jsonUrls[j], urls[i])
+        }
+      }
+      let lon = (pos.east+pos.west)/2
+      let lat = (pos.north+pos.south)/2
+      viewer.camera.flyTo({
+        destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(lon),SkyScenery.Math.toDegrees(lat), 300),
+        orientation: {
+          heading: SkyScenery.Math.toRadians(0),
+          pitch: SkyScenery.Math.toRadians(-90),
+          roll: 0,
+        }
+      })
+    },
+    renderPositionTiles(positionsUrl, url) {
+      let app = this;
+      let tile = new Cesium.Cesium3DTileset({
+        url: url,
+        maximumScreenSpaceError: 2,
+        maximumNumberOfLoadedTiles: 100000,
+      })
+      tile.tileFailed.addEventListener(function (err) {
+        app.$message({message: '模型加载失败', type: 'error'});
+        app.handleClose()
+      })
+      app.$util.request.get(positionsUrl).then(res=> {
+        if (res && res.positions) {
+          for (let i = 0; i < res.positions.length; i++) {
+            let positions = res.positions[i]
+            for (let j = 0; j < positions.length; j=j+2) {
+              tile.readyPromise.then(function (tileset) {
+                console.log(111)
+                viewer.scene.primitives.add(tileset);
+                let longitude = SkyScenery.Math.toDegrees(position[j]);
+                let latitude = SkyScenery.Math.toDegrees(position[j+1]);
+                let heightOffset = 1;
+                let boundingSphere = tileset.boundingSphere;
+                let cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
+                let offsetValue = Cesium.Cartographic.fromDegrees(longitude, latitude, heightOffset)
+                let surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
+                let offset = Cesium.Cartesian3.fromRadians(offsetValue.longitude, offsetValue.latitude, heightOffset);
+                let translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
+                tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
+                viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, tileset.boundingSphere.radius));
+              });
+            }
+          }
+        }
+      })
 
+      tile.readyPromise.then(function (tileset) {
+        let longitude = 113.0;
+        let latitude = 28.0
+        let heightOffset = 1;
+        let boundingSphere = tileset.boundingSphere;
+        let cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
+        let offsetvalue = Cesium.Cartographic.fromDegrees(longitude, latitude, heightOffset)
+        let surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
+        let offset = Cesium.Cartesian3.fromRadians(offsetvalue.longitude, offsetvalue.latitude, heightOffset);
+        let translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
+        tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
+        viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, tileset.boundingSphere.radius *
+            1.0));
+      });
     },
     // 添加点位(Gltf/glb)
     addPositionGltf(jsonUrls, gltfUrls) {
+      let app = this;
       let pos = {}
       for (let i = 0; i < gltfUrls.length; i++) {
         for (let j = 0; j < jsonUrls.length; j++) {
-          SkyScenery.addTree(jsonUrls[j],gltfUrls[i]).then((treeArr) => {
+          SkyScenery.addTree(app.addTokenToUrl(jsonUrls[j]), app.addTokenToUrl(gltfUrls[i])).then((treeArr) => {
             treeArr.map(function (item) {
               viewer.scene.primitives.add(item);
               pos.east = item.geometryInstances.geometry.rectangle.east;
               pos.north = item.geometryInstances.geometry.rectangle.north;
+              pos.west = item.geometryInstances.geometry.rectangle.west;
+              pos.south = item.geometryInstances.geometry.rectangle.south;
             })
           })
         }
       }
+      let lon = (pos.east+pos.west)/2
+      let lat = (pos.north+pos.south)/2
       viewer.camera.flyTo({
-        destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(east),SkyScenery.Math.toDegrees(north), 300),
+        destination: SkyScenery.Cartesian3.fromDegrees(SkyScenery.Math.toDegrees(lon),SkyScenery.Math.toDegrees(lat), 300),
         orientation: {
           heading: SkyScenery.Math.toRadians(0),
           pitch: SkyScenery.Math.toRadians(-90),

+ 2 - 2
vue.config.js

@@ -23,14 +23,14 @@ module.exports = defineConfig({
         port: 8080,
         proxy: {
             '/proxy_dtbserver/': {
-                target: 'http://121.43.55.7:10091/dtb',
+                target: 'http://122.228.28.40:10091/dtb',
                 changeOrigin: true,
                 pathRewrite: {
                     '^/proxy_dtbserver': ''
                 }
             },
             '/oauth/': {
-                target: 'http://121.43.55.7:10086/oauth',
+                target: 'http://122.228.28.40:10096/oauth',
                 changeOrigin: true,
                 pathRewrite: {
                     '^/oauth': ''