瀏覽代碼

Merge branch 'master' of http://47.103.92.60:3003/skyversation/xujingtown_irflcmp_ui

# Conflicts:
#	src/components/Map.vue
wdq 9 月之前
父節點
當前提交
d839d6d2d4
共有 3 個文件被更改,包括 186 次插入100 次删除
  1. 12 7
      package-lock.json
  2. 111 88
      src/components/Map.vue
  3. 63 5
      src/views/HomeView.vue

+ 12 - 7
package-lock.json

@@ -1417,6 +1417,8 @@
       "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
       "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
       "dev": true,
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
@@ -1432,7 +1434,9 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
+      "dev": true,
+      "optional": true,
+      "peer": true
     },
     "node_modules/ajv-keywords": {
       "version": "3.5.2",
@@ -9477,15 +9481,14 @@
       "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
       "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
       "dev": true,
-      "requires": {
-        "ajv": "^8.0.0"
-      },
+      "requires": {},
       "dependencies": {
         "ajv": {
-          "version": "8.16.0",
-          "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
+          "version": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
           "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
           "dev": true,
+          "optional": true,
+          "peer": true,
           "requires": {
             "fast-deep-equal": "^3.1.3",
             "json-schema-traverse": "^1.0.0",
@@ -9497,7 +9500,9 @@
           "version": "1.0.0",
           "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
           "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-          "dev": true
+          "dev": true,
+          "optional": true,
+          "peer": true
         }
       }
     },

+ 111 - 88
src/components/Map.vue

@@ -5,8 +5,22 @@
 <script>
 export default {
   name: "Map",
+  data() {
+    return {
+      // viewer3DTiles实例《systemConfig.data3DTiles keys,tile》
+      viewer3DTiles: {},
+      // 3DTiles url集合《systemConfig.data3DTiles keys,url》
+      keysByUrl: {},
+    };
+  },
   mounted() {
     window.SkySceneryConfig = {};
+    for (let tileName in systemConfig.data3DTiles) {
+      for (let key in systemConfig.data3DTiles[tileName]) {
+        let url = systemConfig.data3DTiles[tileName][key];
+        this.keysByUrl[tileName + key] = url;
+      }
+    }
     this.getToken();
   },
   methods: {
@@ -20,13 +34,13 @@ export default {
       }
       fetch(oauthUrl + "/oauth/api/user/login", {
         method: "POST",
-        body: loginInfo
+        body: loginInfo,
       })
-        .then(resp => resp.json())
-        .then(data => {
+        .then((resp) => resp.json())
+        .then((data) => {
           SkySceneryConfig = {
             authUrl: oauthUrl,
-            token: data.message
+            token: data.message,
           };
           that.pushAllScripts();
         });
@@ -34,11 +48,11 @@ export default {
 
     pushAllScripts() {
       let that = this;
-      that.addScripts(scriptObj.main).then(function() {
-        let arr = scriptObj.plugins.map(function(src) {
+      that.addScripts(scriptObj.main).then(function () {
+        let arr = scriptObj.plugins.map(function (src) {
           return that.addScripts(src);
         });
-        Promise.all(arr).then(function() {
+        Promise.all(arr).then(function () {
           setTimeout(() => {
             if (SkyScenery) {
               that.creatMap();
@@ -60,18 +74,15 @@ export default {
         document.head.appendChild(script);
         if (script.readyState) {
           // IE
-          script.onreadystatechange = function() {
-            if (
-              script.readyState === "loaded" ||
-              script.readyState === "complete"
-            ) {
+          script.onreadystatechange = function () {
+            if (script.readyState === "loaded" || script.readyState === "complete") {
               script.onreadystatechange = null;
               resolve();
             }
           };
         } else {
           // 其他浏览器
-          script.onload = function() {
+          script.onload = function () {
             resolve();
           };
         }
@@ -95,12 +106,7 @@ export default {
               ctx.fillRect(0, 0, width, height);
               return canvas.toDataURL();
             })("#ffffff00"),
-            rectangle: SkyScenery.Rectangle.fromDegrees(
-              -180.0,
-              -90.0,
-              180.0,
-              90.0
-            )
+            rectangle: SkyScenery.Rectangle.fromDegrees(-180.0, -90.0, 180.0, 90.0),
           }),
           fullscreenButton: false, //是否显示全屏按钮
           geocoder: false, //是否显示geocoder小器件,右上角查询按钮
@@ -112,11 +118,11 @@ export default {
           navigationHelpButton: false, //是否显示右上角的帮助按钮
           scene3DOnly: true, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
           infoBox: false, //是否显示点击要素之后显示的信息
-          shouldAnimate: false //是否自动播放
+          shouldAnimate: false, //是否自动播放
         });
         setTimeout(() => {
           // 根据配置文件中的配置信息加载底图
-          systemConfig.imageryProviders.forEach(url => {
+          systemConfig.imageryProviders.forEach((url) => {
             that.loadTheWorldMapImage(url);
           });
           viewer.camera.setView({
@@ -133,14 +139,6 @@ export default {
           });
 
           this.$store.commit("createdMap", true);
-          // // 盘龙天地
-          // let tileName = "盘龙天地";
-          // for (let key in systemConfig.data3DTiles[tileName]) {
-          //   let v = systemConfig.data3DTiles[tileName][key];
-          //   this.add3DTiles(v, true);
-          // }
-          // // 西虹桥
-          // this.add3DTiles(systemConfig.data3DTiles["西虹桥"]["全部"], true);
           return;
         }, 0);
         // viewer.entities.add({
@@ -273,7 +271,7 @@ export default {
       viewer.imageryLayers.addImageryProvider(
         new SkyScenery.ArcGisMapServerImageryProvider({
           url:
-            "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer"
+            "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer",
         })
       );
     },
@@ -297,7 +295,7 @@ export default {
       //   }
       // };
 
-      SkyScenery.GeoJsonDataSource.load(url).then(function(dataSource) {
+      SkyScenery.GeoJsonDataSource.load(url).then(function (dataSource) {
         viewer.dataSources.add(dataSource);
         var entities = dataSource.entities.values;
         for (var i = 0; i < entities.length; i++) {
@@ -309,7 +307,7 @@ export default {
               width: 50,
               height: 50,
               pixelOffset: new SkyScenery.Cartesian2(0, -25),
-              heightReference: SkyScenery.HeightReference.CLAMP_TO_GROUND
+              heightReference: SkyScenery.HeightReference.CLAMP_TO_GROUND,
             });
           }
           if (entity.polyline) {
@@ -333,89 +331,114 @@ export default {
       });
     },
 
-    // 加载动态围墙
+    /**
+     * 加载动态围墙
+     * options = {
+     *    maxH: 100,
+     *    color: "#00c4ff80",
+     *    duration: 3000,
+     * }
+     */
     addDynamicWall(positions, options) {
-      /**
-       * options = {
-       *    maxH: 100,
-       *    color: "#00c4ff80",
-       *    duration: 3000,
-       * }
-       */
+      console.log("addDynamicWall", positions, options);
       return viewer.entities.add({
         name: "立体墙效果",
         wall: {
-          positions: positions.map(function(item) {
+          positions: positions.map(function (item) {
             return SkyScenery.Cartesian3.fromDegrees(item[0], item[1]);
           }),
           // 设置高度
           maximumHeights: new Array(positions.length).fill(options.maxH || 100),
           minimumHeights: new Array(positions.length).fill(0),
           material: new SkyScenery.DynamicWallMaterialProperty({
-            color: SkyScenery.Color.fromCssColorString(options.color), // "#"
+            color: SkyScenery.Color.fromCssColorString(options.color || "#00c4ff80"), // "#"
             trailImage: "/static/image/color.png",
-            duration: options.duration || 3000 // 3000
-          })
-        }
+            duration: options.duration || 3000, // 3000
+          }),
+        },
       });
     },
 
     /**
      * 加载3Dtiles
      * @author LiuMengxiang
-     * @param {*} url 3Dtiles的url地址
+     * @param {*} url 3Dtiles的systemConfig.data3DTiles keys
      * @param {*} flyto 是否自动飞行到3Dtiles
      */
-    add3DTiles(url, flyto) {
-      // let that = this;
-      let option = {
-        url: url + "/tileset.json",
-        skipLevelOfDetail: true, //开启跳级加载
-        maximumMemoryUsage: 1024, //最大内存占用  推荐显存的一般
-        preferLeaves: true,
-        maximumScreenSpaceError: 16,
-        maximumNumberOfLoadedTiles: 2000
-      };
-      // option = Object.assign(option, options);
-      var tile = new SkyScenery.Cesium3DTileset(option);
-      viewer.scene.primitives.add(tile);
+    add3DTiles(keys, flyto) {
+      if (this.viewer3DTiles[keys]) {
+        this.viewer3DTiles[keys].show = true;
+        if (flyto) {
+          viewer.zoomTo(this.viewer3DTiles[keys]);
+        }
+      } else {
+        let option = {
+          url: this.keysByUrl[keys] + "/tileset.json",
+          skipLevelOfDetail: true, //开启跳级加载
+          maximumMemoryUsage: 1024, //最大内存占用  推荐显存的一般
+          preferLeaves: true,
+          maximumScreenSpaceError: 16,
+          maximumNumberOfLoadedTiles: 2000,
+        };
+        var tile = new SkyScenery.Cesium3DTileset(option);
+        viewer.scene.primitives.add(tile);
 
-      if (flyto) {
-        tile.readyPromise.then(function(tileset) {
-          viewer.zoomTo(tile);
-          // if (url.indexOf("jz") != -1) {
-          //   setTimeout(() => {
-          //     that.remove3Dtiles(tile);
-          //   }, 5000);
-          // }
-        });
+        if (flyto) {
+          tile.readyPromise.then(function () {
+            viewer.zoomTo(tile);
+          });
+        }
+        this.viewer3DTiles[keys] = tile;
       }
-      return tile;
-
-      // let tile = SkyScenery.add3DTilesData(url + "/tileset.json", viewer);
-
-      // viewer.scene.primitives.add(tile);
-      // if (flyto) {
-      //   tile.readyPromise.then(function(tileset) {
-      //     viewer.zoomTo(tile);
-      //     if (url.indexOf("jz") != -1) {
-      //       setTimeout(() => {
-      //         that.remove3Dtiles(tile);
-      //       }, 5000);
-      //     }
-      //   });
-      // }
-      // return tile;
     },
     /**
      * 删除3DTiles(测试)
      * @author LiuMengxiang
      * @param tiles 3DTiles实例
      */
-    remove3Dtiles(tiles) {
-      viewer.scene.primitives.remove(tiles);
-    }
-  }
+    remove3Dtiles(keys) {
+      if (this.viewer3DTiles[keys]) {
+        viewer.scene.primitives.remove(this.viewer3DTiles[keys]);
+      }
+    },
+    /**
+     * 隐藏3DTiles(测试)
+     * @author LiuMengxiang
+     * @param tiles 3DTiles实例
+     */
+    hide3DTiles(keys) {
+      if (this.viewer3DTiles[keys]) {
+        this.viewer3DTiles[keys].show = false;
+      }
+    },
+    /**
+     * 根据首页下拉框值判断3DTiles加载状态
+     * @author LiuMengxiang
+     * @param cascaderValue 首页
+     */
+    HomeHandleChangeCascader(cascaderValue) {
+      if (this.$store.state.initMap) {
+        // 暂存首页下拉框选中值
+        let homeVs = [];
+        cascaderValue.forEach((item) => {
+          homeVs.push(item[0] + item[1]);
+        });
+        // 遍历所有的3Dtiles
+        for (let keys in this.keysByUrl) {
+          // 如果选中的话
+          if (homeVs.length > 0 && homeVs.indexOf(keys) != -1) {
+            this.add3DTiles(keys, true);
+          } else {
+            this.hide3DTiles(keys);
+          }
+        }
+      } else {
+        setTimeout(() => {
+          this.HomeHandleChangeCascader(cascaderValue);
+        }, 1000);
+      }
+    },
+  },
 };
 </script>
 

+ 63 - 5
src/views/HomeView.vue

@@ -2,7 +2,8 @@
   <div class="home">
     <Header />
     <Edge />
-    <Map />
+    <Map ref="map" />
+    <!-- 左侧图片区 -->
     <div class="home_LeftMainBox">
       <img style="width: 500px; height: 50px" src="../assets/images/LT1.png" />
       <img style="width: 500px; height: 246px" src="../assets/images/LM1.png" />
@@ -11,6 +12,18 @@
       <img style="width: 500px; height: 50px" src="../assets/images/LT3.png" />
       <img style="width: 500px; height: 246px" src="../assets/images/LM3.png" />
     </div>
+    <!-- 中上部分3DTiles控件 -->
+    <div class="home_CentralMainBox">
+      <el-cascader
+        placeholder="选择3DTiles模型渲染"
+        v-model="cascaderValue"
+        @change="handleChangeCascader"
+        :options="options"
+        :props="props"
+        clearable
+      ></el-cascader>
+    </div>
+    <!-- 右侧图片区 -->
     <div class="home_RightMainBox">
       <img style="width: 500px; height: 50px" src="../assets/images/RT1.png" />
       <img style="width: 500px; height: 246px" src="../assets/images/RM1.png" />
@@ -30,12 +43,45 @@ import CardTitle from "@/components/cards/CardTitle.vue";
 
 export default {
   name: "HomeView",
+  data() {
+    return {
+      props: { multiple: true },
+      options: [],
+      cascaderValue: [],
+    };
+  },
   components: {
     Map,
     Header,
     Edge,
-    CardTitle
-  }
+    CardTitle,
+  },
+  mounted() {
+    // 初始化3DTiles的下拉框options并默认显示
+    let options_ = [];
+    let cascaderValue_ = [];
+    for (let tileName in systemConfig.data3DTiles) {
+      let children_ = [];
+      for (let key in systemConfig.data3DTiles[tileName]) {
+        children_.push({ value: key, label: key });
+        cascaderValue_.push([tileName, key]);
+      }
+      options_.push({ value: tileName, label: tileName, children: children_ });
+    }
+    this.options = options_;
+    // 默认全选所有3DTiles模型
+    // this.$nextTick(() => {
+    //   setTimeout(() => {
+    //     this.cascaderValue = cascaderValue_;
+    //     this.$refs.map.HomeHandleChangeCascader(cascaderValue_);
+    //   });
+    // });
+  },
+  methods: {
+    handleChangeCascader(cascaderValue) {
+      this.$refs.map.HomeHandleChangeCascader(Object.assign([], cascaderValue));
+    },
+  },
 };
 </script>
 
@@ -56,9 +102,21 @@ export default {
     flex-direction: column;
     flex-wrap: nowrap;
     justify-content: space-between;
-    pointer-events: none;
+    // pointer-events: none;
     background: #00000064;
   }
+  &_CentralMainBox {
+    position: fixed;
+    z-index: 9999;
+    left: 520px;
+    top: 100px;
+    width: 350px;
+    overflow-x: hidden;
+    display: flex;
+    flex-direction: column;
+    flex-wrap: nowrap;
+    justify-content: space-between;
+  }
   &_RightMainBox {
     position: fixed;
     z-index: 9999;
@@ -71,7 +129,7 @@ export default {
     flex-direction: column;
     flex-wrap: nowrap;
     justify-content: space-between;
-    pointer-events: none;
+    // pointer-events: none;
     background: #00000064;
   }
 }