管道基础大数据平台系统开发-【前端】-新系統界面
1
13693261870
2023-05-27 3c2b0d71b20da356c7a8a7a244b47ba244ceb249
src/views/Tools/LayerTree.vue
@@ -6,9 +6,9 @@
                   clearable
                   filterable
                   style="width :100%"
                   @change="setproChange"
                   @change="prjChanged"
                   placeholder="请选择项目">
          <el-option v-for="item in optionts"
          <el-option v-for="item in menus"
                     :key="item.code"
                     :label="item.name"
                     :value="item.code">
@@ -81,8 +81,6 @@
</template>
<script>
import ImageWMS from "ol/source/ImageWMS";
import Image from "ol/layer/Image";
import GeoJSON from "ol/format/GeoJSON.js";
import queryinfo from "./queryinfo.vue";
import { Vector as VectorSource } from "ol/source";
@@ -95,56 +93,35 @@
  data () {
    return {
      isBusy: false, // 正忙
      lastPrjCode: "", // 最后选择项目编码
      showProp: false, // 属性
      shwoHistogram: false, // 钻孔柱状图
      showLocal: false, // 定位
      showOpacity: false, // 不透明度
      menuVisible: false, // 菜单
      levelArray: [ // 调试数组
      levelArray: [ // 高程数组
        0, 40000000, 20000000, 10000000, 5000000, 2000000, 1000000, 500000,
        250000, 200000, 100000, 50000, 17000, 9000, 5000, 2000, 1000, 500, 200,
        100, 50, 25, 10, 0,
      ],
      eleId: "",
      isShow: false,
      currentData: "",
      currentNode: "",
      firstLevel: false,
      filterText: "",
      appendNodetitle: "",
      maxexpandId: 4,
      rightClickMenuStyle: {},
      handleTreeCheck: [],
      dialogVisible: false,
      showModelAttach: false,
      addFormServer: {
        opacity: 100,
        serveType: "WMS",
        type: 2,
      },
      filterText: "", // 关键字过滤
      currentData: "", // 当前数据
      currentNode: "", // 当前节点
      rightClickMenuStyle: {}, // 右键菜单样式
      handleTreeCheck: [], // 默认选中键
      layerId: [
        "m_pipeline",
        "th_strategic_channel",
        "bs_project",
        "m_sitepoint",
      ],
      treeData: [],
      defaultProps: {
      treeData: [], // 树数据
      defaultProps: { // 默认属性值
        children: "children",
        label: "cnName",
      },
      options: [{
        value: "WMS",
        label: "WMS",
      }, {
        value: "WFS",
        label: "WFS",
      },
      ],
      childOption: [],
      mptLayer: [],
      optionts: [],
      proValue: null,
      mptLayer: [], // Mpt图层
      menus: [] // 菜单项
    };
  },
  watch: {
@@ -153,7 +130,7 @@
    },
  },
  mounted () {
    this.getMenus()
    this.getMenus();
    this.$bus.$on("treeDataCopy", (res) => {
      this.$store.state.treeData = this.treeData;
      this.$store.state.checkedKeys = this.$refs.tree.getCheckedKeys();
@@ -170,7 +147,7 @@
    // 获取菜单
    async getMenus () {
      let data = await project_selectDirAll();
      if (data && data.code == 200) this.optionts = data.result;
      if (data && data.code == 200) this.menus = data.result;
    },
    // 初始化图层
    async layersStart () {
@@ -421,7 +398,7 @@
            cullRequestsWhileMovingMultiplier: 10, // 值越小能够更快的剔除:60
            preloadWhenHidden: true,
            preferLeaves: true, // 预装子节点:false
            maximumMemoryUsage: 512, // 内存分配变小有利于内存回收,提升性能体验
            maximumMemoryUsage: 768, // 内存分配变小有利于内存回收,提升性能体验
            progressiveResolutionHeightFraction: 0.5, // 数值偏于0能够让初始加载变得模糊
            dynamicScreenSpaceErrorDensity: 0.5, // 数值加大,能让周边加载变快
            dynamicScreenSpaceErrorFactor: 2, // 动态屏幕空间误差的系数
@@ -475,22 +452,21 @@
    },
    // 添加TMS图层
    addTMSLayers (layers) {
      let url = res.url;
      if (res.url.indexOf("{host}") != -1) {
        url = res.url.replace("{host}", iisHost);
      }
      for (let i in layers) {
        let res = layers[i];
        res.url = res.url.indexOf("{host}") > -1 ? res.url.replace("{host}", iisHost) : res.url;
      if (res.pubid) {
        this.setQueryPubid(res);
      } else {
        let layer = Viewer.imageryLayers.addImageryProvider(
          new Cesium.UrlTemplateImageryProvider({
            url: url,
            maximumLevel: 22,
          })
        );
        if (res.pubid) {
          this.setTMSLayerByPubid(res);
          continue;
        }
        let layer = Viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
          url: res.url,
          maximumLevel: 22,
        }));
        layer.id = res.id;
        layer.name = res.cnName;
        this.setChangeWMS();
      }
    },
    // 切换Mpt
@@ -515,19 +491,17 @@
    },
    // 添加Mpt图层
    addMptLayers (layers) {
      if (res.url.indexOf("{host}") != -1) {
        res.url = res.url.replace("{host}", iisHost);
      }
      let url = res.url.split(';')
      for (let i in layers) {
        let res = layers[i];
        if (res.url.indexOf("{host}") > -1) res.url = res.url.replace("{host}", iisHost);
        let urls = res.url.split(';')
      let layer = sgworld.Creator.createImageryProvider(res.cnName, "wms", {
        url: url[0],
        layers: url[1]
      }, "0", undefined, true, "");
      this.mptLayer.push(layer)
      setTimeout(() => {
        this.setChangeWMS();
      }, 500);
        let layer = sgworld.Creator.createImageryProvider(res.cnName, "wms", {
          url: urls[0],
          layers: urls[1]
        }, "0", undefined, true, "");
        this.mptLayer.push(layer);
      }
    },
    // 切换DEM
    setChangeDEM (layers, checked) {
@@ -597,203 +571,82 @@
      tileset._root.transform = matrix;
      // Viewer.flyTo(tileset);
    },
    async setQueryPubid (res) {
      const data = await comprehensive_selectPubById({ id: res.pubid })
      if (data.code != 200) {
        //
      } else {
        let url = data.result.url;
        if (res.url.indexOf("{host}") != -1) {
          url = res.url.replace("{host}", iisHost);
        }
        let min = data.result.min;
        let max = data.result.max;
        let layer;
        if (max > 0) {
          layer = Viewer.imageryLayers.addImageryProvider(
            new Cesium.UrlTemplateImageryProvider({
              url: url,
              minimumLevel: min,
              maximumLevel: max,
            })
          );
        } else {
          layer = Viewer.imageryLayers.addImageryProvider(
            new Cesium.UrlTemplateImageryProvider({
              url: url,
              minimumLevel: min,
            })
          );
    // 根据Pubid设置TMS图层
    async setTMSLayerByPubid (res) {
      const data = await comprehensive_selectPubById({ id: res.pubid });
      if (!data || data.code != 200) return;
      let provider = data.result.max > 0 ?
        new Cesium.UrlTemplateImageryProvider({
          url: res.url,
          minimumLevel: data.result.min,
          maximumLevel: data.result.max
        }) :
        new Cesium.UrlTemplateImageryProvider({
          url: res.url,
          minimumLevel: data.result.min
        });
      let layer = Viewer.imageryLayers.addImageryProvider(provider);
      layer.name = res.cnName;
      // if (data.result.geom) {
      //   let wkt = this.$wkt.parse(data.result.geom);
      //   Viewer.camera.flyTo({
      //     destination: Cesium.Cartesian3.fromDegrees(wkt.coordinates[1], wkt.coordinates[0], 2000)
      //   });
      // }
    },
    // 切换项目
    prjChanged (code) {
      this.$store.state.pigCode = code;
      if (code) {
        this.isBusy = true;
        let checkedLayers = this.getCheckedLayersByCode(code);
        let checkedKeys = [];
        for (let i in checkedLayers) {
          checkedKeys.push(checkedLayers[i].id);
        }
        layer.name = res.cnName;
        if (data.result.geom) {
          // let wkt = this.$wkt.parse(data.result.geom);
          // Viewer.camera.flyTo({
          //   destination: Cesium.Cartesian3.fromDegrees(wkt.coordinates[1], wkt.coordinates[0], 2000),
          // });
        }
        this.setChangeWMS();
        this.$refs.tree.setCheckedKeys(checkedKeys);
        sessionStorage.setItem("checkedLayers", JSON.stringify(checkedLayers));
        this.isBusy = false;
      }
      for (let i = 0, c = this.treeData.length; i < c; i++) {
        this.handleCheckChange(this.treeData[i], true);
      }
    },
    async setproChange (res) {
      if (res) {
        this.setCheeckedLayer = this.$refs.tree.getCheckedKeys();
        this.$store.state.pigCode = res;
        let st_code = this.optionts.filter(rs => {
          if (rs.code == res) {
            return rs
          }
        })
        let val = this.$store.state.oldTree.filter(rs => {
          if (rs.enName == st_code[0].code) {
            return rs
          }
        })
        this.removeAllLayer();
        let obj = {
          dirid: res,
          pageIndex: 1,
          pageSize: 10,
        }
        const data = await project_selectByDirid(obj);
        if (data.code != 200) {
          this.$message.error("列表获取失败");
          return;
        }
        if (data.result[0]) {
          let geom = data.result[0].geom
          if (geom) {
            let wkt = this.$wkt.parse(geom)
            Viewer.camera.flyTo({
              destination: Cesium.Cartesian3.fromDegrees(wkt.coordinates[0].toFixed(6), wkt.coordinates[1].toFixed(6), 5000),
            });
          }
        }
        //this.cannelTerrainLayer();
        //this.setTerrainMptLayer();
        //清空图层树选中状态
        this.$refs.tree.setCheckedKeys([]);
        if (val.length > 0) {
          if (val[0].type == 1 && val[0].isProject == 1) {//项目分类
            let std_check = [];
            for (let i in val) {
              let std_val = this.getNewTree([this.$refs.tree.getNode(val[i].id).data], [])
              for (let j in std_val) {
                std_check.push(std_val[j])
              }
            }
            let value = this.$store.state.isProjectLayer;
            for (let i in value) {
              std_check.push(value[i])
            }
            this.setProjectLayer(std_check);
          } else {
            this.setChangeProLayer();
          }
        } else {
          this.setChangeProLayer();
        }
      } else {
        this.removeAllLayer();
        this.$store.state.pigCode = null;
        this.$refs.tree.setCheckedKeys(this.setCheeckedLayer);
        let std = [];
        for (let i in this.setCheeckedLayer) {
          std.push(this.$refs.tree.getNode(this.setCheeckedLayer[i]).data)
        }
        this.setProjectLayer(std);
    // 根据项目编码获取选中图层
    getCheckedLayersByCode (code) {
      let layers = [];
      for (let i = 0, c = this.treeData.length; i < c; i++) {
        this.getCheckedChildLayersByCode(this.treeData[i], code, layers, false);
      }
      return layers;
    },
    removeAllLayer () {
      for (let j in Viewer.scene.primitives._primitives) {
        Viewer.scene.primitives.remove(Viewer.scene.primitives._primitives[j])
      }
      for (let i in window.Viewer.dataSources._dataSources) {
        window.Viewer.dataSources.remove(
          window.Viewer.dataSources._dataSources[i]
        );
      }
      for (let i = 0; i < window.Viewer.imageryLayers._layers.length; i++) {
        let val_id = window.Viewer.imageryLayers._layers[i].id;
        if (val_id == 'TMS') {
          window.Viewer.imageryLayers.remove(
            window.Viewer.imageryLayers._layers[i]
          );
        }
      }
      for (let i in this.mptLayer) {
        this.mptLayer[i].deleteObject();
        this.mptLayer.splice(i, 1)
      }
      this.mptLayer = [];
    },
    setProjectLayer (res) {
      let layerid = [];
      for (let j in res) {
        layerid.push(res[j].id)
      }
      this.$refs.tree.setCheckedKeys(layerid);
      // let value = this.$refs.tree.getCheckedNodes();
      // this.$bus.$emit("showMenuLayer", value);
      let listWMS = [];
      let listWFS = [];
      let listTileset = [];
      let listTMS = [];
      let listMpt = [];
      for (let i in res) {
        if (res[i].type == 2) {
          switch (res[i].serveType) {
            case 'WMS':
              listWMS.push(res[i])
              break;
            case 'WFS':
              listWFS.push(res[i])
              break;
            case '3DML':
            case 'Tileset':
              listTileset.push(res[i])
              break;
            case 'Mpt':
              listMpt.push(res[i])
              break;
            case 'TMS':
              listTMS.push(res[i])
              break;
    // 根据项目编码获取选中子图层
    getCheckedChildLayersByCode (data, code, layers, isPrj) {
      if (data.children && data.children.length) {
        for (let i = 0, c = data.children.length; i < c; i++) {
          let layer = data.children[i];
          if (layer.children && layer.children.length) {
            let flag = layer.type == 1 && layer.isProject && layer.enName == code;
            this.getCheckedChildLayersByCode(layer, code, layers, flag);
            continue;
          }
          if (layer.type == 2 && (layer.isProject || isPrj)) {
            layers.push(layer);
          }
        }
        return;
      }
      // this.setChangeProLayer();
      this.setChangeWMS(listWMS, true);
      this.setChangeWFS(listWFS, true);
      this.setChangeTileset(listTileset, true);
      this.setChangeTMS(listTMS, true);
      this.setChangeMpt(listMpt, true);
    },
    getNewTree (obj, result) {
      for (const i in obj) {
        console.log(obj[i].cnName)
        result.push(obj[i])
        if (obj[i].children && obj[i].children.length > 0) {
          this.getNewTree(obj[i].children, result)
        }
      }
      return result
    },
    setChangeProLayer () {
      let value = this.$store.state.isProjectLayer;
      if (value.length != 0) {
        let std = [];
        for (let i in value) {
          std.push(value[i].id)
        }
        this.$refs.tree.setCheckedKeys(std);
        this.$bus.$emit("showMenuLayer", value);
      if (data.type == 2 && (data.isProject || isPrj)) {
        layers.push(data);
      }
    },
    // 添加WFS图层 *