surprise
2024-01-02 b2fdf4f25251229adbe9a6963cb35fb7fc868172
GLB模型添加.修改,删除
已添加14个文件
已修改18个文件
6518 ■■■■ 文件已修改
README.md 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/index.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/api.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/model/隔离带.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/model/飞机.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/new/mapSplit.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/new/topBar.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/new/topBar1.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Layer/mapViewer.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Layer/model.js 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/drag.js 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/index.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/left/layerTree/Layer.vue 513 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/left/layerTree/modelEdit.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/left/layerTree/modelLayer.vue 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/history.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/viewer.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/menu/bottom-menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/menu/menulist.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/right/right-bottom.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/right/right-top.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/mapSplit.js 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/SmartEarthSDK/Workers/TreeTool.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/data/layerData.js 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/image/隔离带.png 补丁 | 查看 | 原始文档 | blame | 历史
static/image/飞机.png 补丁 | 查看 | 原始文档 | blame | 历史
static/layers.json 4848 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -1,6 +1,6 @@
# swzjxt
> äº¦åº„一张图系统
> æ±Ÿè‹äº¤æŽ§æ™ºæ…§é«˜é€Ÿç³»ç»Ÿ
## Build Setup
config/index.js
@@ -36,13 +36,13 @@
    cssSourceMap: true,
    proxyTable: {
      // è¿™é‡Œé…ç½® '/api' å°±ç­‰ä»·äºŽ target , ä½ åœ¨é“¾æŽ¥é‡Œè®¿é—® /api === http://localhost:54321
      '/api': {
        target: 'http://10.10.4.121:8070',
      '/JiangSu': {
        target: 'http://localhost/JiangSu',
        // secure: true, // å¦‚果是 https ,需要开启这个选项
        changeOrigin: true, // æ˜¯å¦æ˜¯è·¨åŸŸè¯·æ±‚?肯定是啊,不跨域就没有必要配置这个proxyTable了.
        pathRewrite: { // é‡å†™è·¯å¾„  ä¾‹å¦‚浏览器请求地址http://localhost:12345/xxx,实际请求的是你代理的地址:http:xxx/11111
          // è¿™é‡Œæ˜¯è¿½åŠ é“¾æŽ¥,比如真是接口里包含了 /api,就需要这样配置.
          '^/api': '', // å’Œä¸‹è¾¹ä¸¤ç§å†™æ³•,因人而异根据需求。
          '^/JiangSu': '', // å’Œä¸‹è¾¹ä¸¤ç§å†™æ³•,因人而异根据需求。
          // ç­‰ä»·äºŽ    /api + /api  ==  http://localhost:54321/api
          // å¦‚果写为 '^/api' : '/'
          // ç­‰ä»·äºŽ   /api + /  ==  http://localhost:54321/
index.html
@@ -4,7 +4,7 @@
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>时空一张图</title>
  <title>江苏交控智慧高速</title>
  <!-- <link rel="icon" href="./static/img/favicon.ico" type="image/x-icon" /> -->
  <link rel="stylesheet" href="./static/SmartEarthSDK/Cesium/Widgets/widgets.css">
  <link rel="stylesheet" href="./static/iconfont/iconfont.css">
@@ -83,10 +83,11 @@
  <script src="./static/othersMap/othersMap.js"></script>
<script src="./static/data/layerData.js"></script>
  <script type="text/javascript">
    // å¯ä»¥è¿›è¡Œif判断区分不用域名
    var BMAP_RESORCE_TILE = "10.10.4.116:8085/yzAdapter/SosoService";
    var BMAP_RESORCE_IP = "10.10.4.116:8085/yzAdapter/SosoService";
    // var BMAP_RESORCE_TILE = "10.10.4.116:8085/yzAdapter/SosoService";
    // var BMAP_RESORCE_IP = "10.10.4.116:8085/yzAdapter/SosoService";
  </script>
</head>
src/api/api.js
@@ -22,6 +22,21 @@
export function updateUserPwd(params) {
  return service.put('system/user/profile/updatePwd', params);
}
export function Op_SelectByPage(params){
  //请求地址
  return service.get("/Op/SelectByPage", { params: params });
}
export function Op_Insert(params) {
  //请求地址
  return service.post("/Op/Insert", params);
}
export function Op_UpdateById(params){
  //请求地址
  return service.post("/Op/UpdateById", params);
}
//京办登录
// export function loginById(params) {
//   return request.post('/sign/loginById', params);
src/assets/img/model/¸ôÀë´ø.png
src/assets/img/model/·É»ú.png
src/assets/img/new/mapSplit.png
src/assets/img/new/topBar.png

src/assets/img/new/topBar1.png
src/assets/js/Layer/mapViewer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
import store from "../../../store";
import model from "./model";
const mapViewer = {
    leftClick: null,
    rightClick: null,
    addClick() {
        this.addLeftClick();
        this.addRightClick();
    },
    addLeftClick() {
        this.leftClick = new Cesium.ScreenSpaceEventHandler(window.Viewer.canvas);
        this.leftClick.setInputAction(function (event) {
            let cartesian =  window.Viewer.camera.pickEllipsoid(event.position);
            let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
            let lng = Cesium.Math.toDegrees(cartographic.longitude); // ç»åº¦
            let lat = Cesium.Math.toDegrees(cartographic.latitude); // çº¬åº¦
            let alt = cartographic.height; // é«˜åº¦ï¼Œæ¤­çƒé¢height永远等于
            let coordinate = {
                longitude: Number(lng.toFixed(6)),
                latitude: Number(lat.toFixed(6)),
                altitude: Number(alt.toFixed(2)),
                heading: 0,
                pitch: 0,
                roll: 0,
                scale: 1,
            };
            if(store.state.addModelFlag){
                model.setModelCoord(coordinate);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
    },
    addRightClick() {
        this.rightClick = new Cesium.ScreenSpaceEventHandler(window.Viewer.canvas);
        this.rightClick.setInputAction(function (event) {
            let pickedObject = window.Viewer.scene.pick(event.position);
            console.log(pickedObject)
        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
    },
}
export default mapViewer;
src/assets/js/Layer/model.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
import store from "../../../store";
import Bus from "@tools/Bus";
const model = {
    title: null,
    modelLayer: null,
    titleSet: null,
    from: null,
    changeLayer(item, res) {
        store.state.addModelFlag = res;
        this.title = item;
        this.setModelMouseMove();
    },
    setModelCoord(res) {
        store.state.addModelFlag = false;
        this.setModelMouseMove();
        if (res) {
            var id = new Date().getTime();
            var obj = {
                id: id,
                sourceType: 'GLB',
                name: this.title.name,
                style: {
                    url: this.title.url,
                    name: this.title.name,
                    longitude: res.longitude,
                    latitude: res.latitude,
                    altitude: res.altitude,
                    heading: res.heading,
                    pitch: res.pitch,
                    roll: res.roll,
                    scale: res.scale,
                    url: this.title.url,
                    id: id,
                    sourceType: 'GLB',
                }
            }
            Bus.$emit("addOtherData", "对象", obj);
        }
    },
    setModelMouseMove() {
        if (store.state.addModelFlag) {
            document.getElementById("myImage").src = layerData.config.img_url + this.title.imgUrl;
            document.onmousemove = (event) => {
                this.setMouseMove(event)
            }
        } else {
            document.getElementById("myImage").src = "";
            $("#imageModel").hide();
        }
    },
    setMouseMove(res) {
        if (!store.state.addModelFlag) return;
        var odiv = document.getElementById("imageModel");
        odiv.style.top = (res.clientY - 15) + "px";
        odiv.style.left = (res.clientX + 15) + "px";
        $("#imageModel").show();
    },
    addModelLayer(res) {
        if (!res) return;
        this.getModelLayer();
        var modelMatrix = this.getModelMatrix(res.style);
        var url = layerData.config.Model_URL + res.style.url;
        var model = this.modelLayer.add(Cesium.Model.fromGltf({
            id: res.id,
            url: url,
            scale: res.scale,
            minimumPixelSize: 64,
            modelMatrix: modelMatrix
        }));
        model.name = res.name;
        setTimeout(() => {
            this.updateGlbModel(model, res.style)
        }, 200);
    },
    setDelGLBModel(res) {
        for (var i = 0; i < this.modelLayer._primitives.length; i++) {
            var model = this.modelLayer._primitives[i]
            if (model.id == res.id) {
                this.modelLayer.remove(this.modelLayer._primitives[i]);
            }
        }
    },
    flyTo(res) {
        for (var i = 0; i < this.modelLayer._primitives.length; i++) {
            var model = this.modelLayer._primitives[i]
            if (model.id == res.id) {
                // Viewer.trackedEntity = this.modelLayer._primitives[i]
                Viewer.scene.camera.flyTo(this.modelLayer._primitives[i])
            }
        }
    },
    getEditModelLayer(res) {
        for (var i = 0; i < this.modelLayer._primitives.length; i++) {
            var model = this.modelLayer._primitives[i]
            if (model.id == res.id) {
                this.titleSet = this.modelLayer._primitives[i];
            }
        }
        if (!this.titleSet) return;
        var cm = this.titleSet.modelMatrix; // èŽ·å–å½“å‰æ¨¡åž‹modelMatrix
        var cartesian = new Cesium.Cartesian3(cm[12], cm[13], cm[14]);
        var carto = Cesium.Cartographic.fromCartesian(cartesian);
        var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Matrix4.getTranslation(cm, new Cesium.Cartesian3()), Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());
        var m3 = Cesium.Matrix4.multiply(Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()), cm, new Cesium.Matrix4());
        var mat3 = Cesium.Matrix4.getRotation(m3, new Cesium.Matrix3());
        var q = Cesium.Quaternion.fromRotationMatrix(mat3);
        var hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);
        this.form = {
            id: this.titleSet.id,
            sourceType: 'GLB',
            name: this.titleSet.name,
            style: {
                url: res.style.url,
                name: this.titleSet.name,
                altitude: Math.round(carto.height * 10) / 10,
                longitude: res.style.longitude,
                latitude: res.style.latitude,
                heading: Math.round(Cesium.Math.toDegrees(hpr.heading)),
                pitch: Math.round(Cesium.Math.toDegrees(hpr.pitch)),
                roll: Math.round(Cesium.Math.toDegrees(hpr.roll)),
                scale: this.titleSet.scale,
                url: res.style.url,
                id: this.titleSet.id,
                sourceType: 'GLB',
            }
        }
        store.state.showModelFlag = false;
        store.state.isShowEditLayer = true;
    },
    setEditChanege(res, flag) {
        this.form = res;
        Bus.$emit("updataTreeNode", this.form.id, this.form);
        if (flag == 2) {
            this.updateGlbModel(this.titleSet, this.form.style)
        }
    },
    updateGlbModel(model, res) {
        if (!res.longitude) return
        var cm = model.modelMatrix; // èŽ·å–å½“å‰æ¨¡åž‹modelMatrix
        var nc = Cesium.Cartesian3.fromDegrees(res.longitude, res.latitude, res.altitude);
        var newHeading = Cesium.Math.toRadians(res.heading); //改变Heading值
        var newPitch = Cesium.Math.toRadians(res.pitch); // pitch值填当前模型pitch,上文介绍过如何获取
        var newRoll = Cesium.Math.toRadians(res.roll); // åŒä¸Š
        var headingPitchRoll = new Cesium.HeadingPitchRoll(newHeading, newPitch, newRoll);
        var m = Cesium.Transforms.headingPitchRollToFixedFrame(nc, headingPitchRoll, Cesium.Ellipsoid.WGS84, Cesium.Transforms.eastNorthUpToFixedFrame, new Cesium.Matrix4());
        model.modelMatrix = m;
        model.scale = res.scale;
        var sm = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(res.scale, res.scale, res.scale), new Cesium.Matrix4());
        model.modelMatrix = Cesium.Matrix4.multiply(model.modelMatrix, sm, model.modelMatrix);
    },
    getModelMatrix(res) {
        var headingPitchRoll = new Cesium.HeadingPitchRoll(res.heading, res.pitch, res.roll);
        var position = Cesium.Cartesian3.fromDegrees(res.longitude, res.latitude, res.altitude);
        var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
            position, headingPitchRoll, Cesium.Ellipsoid.WGS84,
            Cesium.Transforms.eastNorthUpToFixedFrame,
            new Cesium.Matrix4());
        return modelMatrix;
    },
    getModelLayer() {
        if (this.modelLayer == null) {
            this.modelLayer = new Cesium.PrimitiveCollection();
            this.modelLayer.id = "model_layer";
            Viewer.scene.primitives.add(this.modelLayer);
        }
    },
}
export default model;
src/assets/js/drag.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
import Vue from 'vue';
//使用Vue.directive()定义一个全局指令
//1.参数一:指令的名称,定义时指令前面不需要写v-
//2.参数二:是一个对象,该对象中有相关的操作函数
//3.在调用的时候必须写v-
const drag = Vue.directive('drag', {
    //1.指令绑定到元素上回立刻执行bind函数,只执行一次
    //2.每个函数中第一个参数永远是el,表示绑定指令的元素,el参数是原生js对象
    //3.通过el.focus()是无法获取焦点的,因为只有插入DOM后才生效
    bind: function (el) { },
    //inserted表示一个元素,插入到DOM中会执行inserted函数,只触发一次
    inserted: function (el) {
        el.onmousedown = function (e) {
            var disx = e.pageX - el.offsetLeft;
            var disy = e.pageY - el.offsetTop;
            document.onmousemove = function (e) {
                el.style.left = e.pageX - disx + 'px';
                el.style.top = e.pageY - disy + 'px';
            }
            document.onmouseup = function () {
                document.onmousemove = document.onmouseup = null;
            }
        }
    },
    //当VNode更新的时候会执行updated,可以触发多次
    updated: function (el) { }
})
export default drag;
src/components/index.vue
@@ -1,11 +1,11 @@
<template>
  <div class="mapViewer">
    <div class="cacheImage">
    <img style="display: none;" src="@assets/img/new/rightCircle-y.png" alt="" />
    <img style="display: none;" src="@assets/img/new/leftCircle-y.png" alt="" />
    <img style="display: none;" src="@assets/img/new/treeClose-y.png" alt="" />
    <img style="display: none;" src="@assets/img/new/h1.png" alt="" />
  </div>
      <img style="display: none;" src="@assets/img/new/rightCircle-y.png" alt="" />
      <img style="display: none;" src="@assets/img/new/leftCircle-y.png" alt="" />
      <img style="display: none;" src="@assets/img/new/treeClose-y.png" alt="" />
      <img style="display: none;" src="@assets/img/new/h1.png" alt="" />
    </div>
    <div class="tooltip" :class="{ tooltiphide: !tooltipShow }">
@@ -21,9 +21,8 @@
      </div>
    </div>
    <viewer1 class="mapViewer" :key="switchKey" v-show="viewer1Show" :style="viewer1Style"
      @mousemove.native="viewer1MouseMove" />
    <viewer class="mapViewer" ref="mapViewer" :style="viewerStyle" @mousemove.native="viewerMouseMove" />
    <viewer1 class="mapViewer" id="mapOl" :key="switchKey" v-show="viewer1Show" :style="viewer1Style" />
    <viewer class="mapViewer" id="mapView" ref="mapViewer" :style="viewerStyle" />
    <div class="controlPanel" :style="{
      width: `${size}`,
      height: `${size}`,
@@ -45,10 +44,14 @@
      <right ref="Right" />
      <leftpanel ref="Left" />
      <menupanel />
      <bottommenu ref="bottommenu" />
      <!-- <bottommenu ref="bottommenu" /> -->
      <signalling v-if="signallingShow"></signalling>
      <setting v-if="showSetting" />
      <qycharts v-if="$store.state.qyEchartsShow" />
    </div>
    <div id="imageModel" class="imageModel">
      <img id="myImage" class="image" src="">
    </div>
  </div>
</template>
@@ -96,7 +99,7 @@
      offset: "0%",
      tooltipInfo: "请稍后。。。",
      tooltipShow: false,
      signallingShow:false,
      signallingShow: false,
      switchKey: 0,
      // viewer1Show: false,
    };
@@ -138,7 +141,7 @@
    changePwd() {
      console.log(111);
    },
    changeMode(mode){
    changeMode(mode) {
      this.$refs.mapViewer.changeMode(mode);
    },
    detectZoom() {
@@ -170,7 +173,7 @@
    cameraMoveEnd() {
      // var p = {
      //   destination: sgworld.Navigate.getPosition(),
      // };
      // sgworld1.Viewer.camera.setView(p);
    },
@@ -197,13 +200,13 @@
    sgworldEvenListener() {
      // sgworld1.Viewer.camera.setView({
      //   destination: sgworld.Viewer.camera.position.clone(),
      // });
    },
    sgworld1EvenListener() {
      // sgworld.Viewer.camera.setView({
      //   destination: sgworld1.Viewer.camera.position.clone(),
      // });
    },
    closeHighLight() {
@@ -227,15 +230,16 @@
      this.$store.commit("showHistory", false);
    },
  },
  beforeDestroy(){
  beforeDestroy() {
    this.$refs.bottommenu.switchMenu(0);
  },
};
</script>
<style scoped>
.cacheImage{
.cacheImage {
  display: none !important;
}
.mapViewer {
  height: 100%;
}
@@ -247,8 +251,8 @@
}
#headlog {
  width: 965px;
  height: 70px;
  width: 1920px;
  height: 100px;
  position: absolute;
  left: 50%;
  top: 0;
@@ -337,4 +341,17 @@
.searchBtn {
  width: 40px;
}
.imageModel {
  z-index: 40;
  position: absolute;
  display: none;
}
.imageModel .image {
  width: 30px;
  height: 30px;
}
</style>
src/components/left/layerTree/Layer.vue
@@ -8,127 +8,62 @@
      <div class="treeContainer">
        <div class="treeTitle">
          <span class="closePanel" @click="closeLayer">×</span>
          <el-upload
            class="button-group"
            action=""
            :auto-upload="false"
            :show-file-list="false"
            :on-change="loadJsonFromFile"
            accept=".json"
          >
            <el-button
              class="button-user"
              type="primary"
              slot="trigger"
              icon="el-icon-folder-opened"
              title="打开本地配置文件"
            ></el-button>
            <el-button
              class="button-user"
              type="primary"
              icon="el-icon-download"
              title="保存为本地配置文件"
              @click.stop="save"
            ></el-button>
            <el-button
              class="button-user"
              type="primary"
              icon="el-icon-delete"
              title="清除所有标绘"
              @click.stop="deleteAllPlot"
            ></el-button>
            <el-button
              class="button-user"
              type="primary"
              icon="el-icon-upload"
              title="上传至服务器"
              @click.stop="saveHistoryPlot"
            ></el-button>
          <el-upload class="button-group" action="" :auto-upload="false" :show-file-list="false"
            :on-change="loadJsonFromFile" accept=".json">
            <el-button class="button-user" type="primary" slot="trigger" icon="el-icon-folder-opened"
              title="打开本地配置文件"></el-button>
            <el-button class="button-user" type="primary" icon="el-icon-download" title="保存为本地配置文件"
              @click.stop="save"></el-button>
            <!-- <el-button class="button-user" type="primary" icon="el-icon-delete" title="清除所有标绘"
              @click.stop="deleteAllPlot"></el-button> -->
            <el-button class="button-user" type="primary" icon="el-icon-upload" title="上传至服务器"
              @click.stop="saveHistoryPlot"></el-button>
            <el-button
              class="button-user historyBtn"
              type="primary"
              icon="el-icon-s-order"
              title="历史记录"
              @click.stop="histotyPlotting"
            ></el-button>
            <!-- <el-button class="button-user historyBtn" type="primary" icon="el-icon-s-order" title="历史记录"
              @click.stop="histotyPlotting"></el-button> -->
          </el-upload>
        </div>
        <el-tree
          ref="tree"
          :data="treeData"
          show-checkbox
          node-key="id"
          draggable
          :allow-drop="allowDrop"
          :expand-on-click-node="false"
          :auto-expand-parent="false"
          :default-expanded-keys="defaultExpanded"
          :default-checked-keys="defaultCheck"
          @node-expand="changeNodeExpand($event, true)"
          @node-collapse="changeNodeExpand($event, false)"
          @check="check"
          @node-contextmenu="rightClick"
        >
          <span
            class="custom-tree-node"
            slot-scope="{ data }"
            @dblclick="flyTo(data)"
            @click="select(data)"
          >
        <el-tree ref="tree" :data="treeData" show-checkbox node-key="id" draggable :allow-drop="allowDrop"
          :expand-on-click-node="false" :auto-expand-parent="false" :default-expanded-keys="defaultExpanded"
          :default-checked-keys="defaultCheck" @node-expand="changeNodeExpand($event, true)"
          @node-collapse="changeNodeExpand($event, false)" @check="check" @node-contextmenu="rightClick">
          <span class="custom-tree-node" slot-scope="{ data }" @dblclick="flyTo(data)" @click="select(data)">
            <span>
              <i v-if="data.children" class="el-icon-folder"></i>
              <i
                v-else
                :class="
                  data.sourceType === 'location'
                    ? 'el-icon-location-outline'
                    : ''
                "
              ></i>
              <el-input
                v-if="data.rename"
                v-model="data.name"
                size="mini"
                placeholder="请输入名称"
                @change="rename(data)"
                @blur="rename(data)"
              ></el-input>
              <i v-else :class="data.sourceType === 'location'
                ? 'el-icon-location-outline'
                : ''
                "></i>
              <el-input v-if="data.rename" v-model="data.name" size="mini" placeholder="请输入名称" @change="rename(data)"
                @blur="rename(data)"></el-input>
              <span v-else>{{ data.name }}</span>
            </span>
          </span>
        </el-tree>
      </div>
      <div
        class="rightClickMenu"
        v-if="rightClickMenuDisplay"
        @click.stop="closeRightClick"
        :style="{ ...rightClickMenuStyle }"
      >
      <div class="rightClickMenu" v-if="rightClickMenuDisplay" @click.stop="closeRightClick"
        :style="{ ...rightClickMenuStyle }">
        <ul>
          <li @click="addFold"><i class="el-icon-plus"></i>添加目录</li>
          <li @click="addLayer"><i class="el-icon-plus"></i>添加图层</li>
          <li @click="editDemoAnimation">
          <!-- <li @click="addFold"><i class="el-icon-plus"></i>添加目录</li>
          <li @click="addLayer"><i class="el-icon-plus"></i>添加图层</li> -->
          <!-- <li @click="editDemoAnimation">
            <i class="el-icon-plus"></i>添加动画
          </li>
          <li @click="addPosition">
          </li> -->
          <!-- <li @click="addPosition">
            <i class="el-icon-location-outline"></i>添加定位
          </li>
          </li> -->
          <li v-if="!isClickParent" @click="editTreeNode">
            <i class="el-icon-edit"></i>编辑
          </li>
          <li @click="openRename"><i class="el-icon-edit"></i>重命名</li>
          <!-- <li @click="openRename"><i class="el-icon-edit"></i>重命名</li> -->
          <li @click="deleteTreeNode"><i class="el-icon-delete"></i>删除</li>
        </ul>
      </div>
      <add-terrain ref="addTerrain" @success="addSceneData" />
      <add-online-map
        ref="addOnlineMap"
        @success="addOtherData('影像', $event)"
      />
      <add-online-map ref="addOnlineMap" @success="addOtherData('影像', $event)" />
      <add-image ref="addImage" @success="addSceneData" />
      <add-model ref="addModel" @success="addSceneData" />
      <add-pathLayer ref="addPathLayer" @success="addSceneData" />
@@ -139,11 +74,7 @@
      <get-scene ref="getScene" @success="openScene" />
      <save-scene ref="saveScene" @success="saveScene" />
      <select-data ref="select" @success="openThisTypePop" />
      <animationEdit
        ref="animationEdit"
        @success="updateAnimation"
        @setAnimation="setAnimation"
      />
      <animationEdit ref="animationEdit" @success="updateAnimation" @setAnimation="setAnimation" />
    </div>
  </div>
</template>
@@ -166,6 +97,8 @@
import AddOnlineMap from "./AddOnlineMap.vue";
import GetScene from "./GetScene.vue";
import SaveScene from "./SaveScene.vue";
import { Op_SelectByPage, Op_Insert, Op_UpdateById } from '../../../api/api.js'
import model from "../../../assets/js/Layer/model";
// å·¥ç¨‹æ ‘工具
let _treeTool;
function arrGroup(arr, fn) {
@@ -214,6 +147,9 @@
      isNewFold: false,
      newFoldName: undefined,
      serverURL: "http://192.168.109.128:8080",
      uploading: false,
      layersId: null
    };
  },
  mounted() {
@@ -231,19 +167,25 @@
    } else if (this.treeData.length) {
      // å­˜åœ¨ç¼“存数据
      // åŠ è½½åœºæ™¯æ•°æ®
      this.loadDataToScene();
      // this.loadDataToScene();
      this.setTreeData([]);
      this.initData({});
    } else {
      // é»˜è®¤æ ‘结构
      // this.setTreeData([{ id: "82A0C3DE", name: "我的资源", children: [] }]);
      this.setTreeData([]);
      this.initData({});
      // åŠ è½½åœºæ™¯æ•°æ®
      this.loadDataToScene();
      // this.loadDataToScene();
    }
    // æ‰“开弹窗
    //this.$refs.layer.open();
    // å®šä¹‰ä¸­è½¬ç«™äº‹ä»¶
    this.initBusEvent();
    this.initData({});
    this.$nextTick(() => {
      this.histotyPlotting();
      // å®šä¹‰ä¸­è½¬ç«™äº‹ä»¶
      this.initBusEvent();
    })
  },
  destroyed() {
    _treeTool = undefined;
@@ -358,138 +300,184 @@
    // æ ‡ç»˜ä¸Šä¼ è‡³æœåС噍
    saveHistoryPlot() {
      if (this.treeData.length == 0) {
        this.$message.error("请先进行标绘");
        this.$message.error("请先进行数据加载");
        return;
      } else if (this.treeData.length > 1) {
        this.$message.error("格式不正确,请修改后重新保存");
        return;
      }
      this.$confirm("是否将当前会议保障标绘数据上传至服务器?", "上传", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          let oricontent = JSON.stringify(this.treeData);
          let content = oricontent.replace(
            /"checked":true/g,
            '"checked":false'
          );
          const uploading = this.$loading({
            lock: true,
            text: "会议保障标绘数据上传中,请稍后",
            spinner: "el-icon-loading",
            background: "rgba(0, 0, 0, 0.7)",
          });
          axios({
            method: "POST",
            url: "http://10.10.4.121:8070/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/add",
            data: {
              userId: this.$store.state.userId,
              userName: this.$store.state.userName,
              geojsonName: this.treeData[0].name,
              geojsonString: content,
            },
          }).then(
            (response) => {
              uploading.close();
              if (response.data.code == 200) {
                this.$message({
                  message: "保存成功",
                  type: "success",
                });
              } else {
                this.$message.error("保存失败!");
              }
            },
            (error) => {
              uploading.close();
              this.$message.error("数据上传失败");
              // console.log("错误", error.message);
            }
          );
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消上传",
          });
        });
      var that = this;
      // this.$confirm("是否将当前场景数据上传至服务器?", "上传", {
      //   confirmButtonText: "确定",
      //   cancelButtonText: "取消",
      //   type: "warning",
      // })
      //   .then(() => {
      let oricontent = JSON.stringify(this.treeData);
      let content = oricontent.replace(
        /"checked":true/g,
        '"checked":false'
      );
      this.uploading = this.$loading({
        lock: true,
        text: "场景数据上传中,请稍后",
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)",
      });
      if (this.layersId) {
        var obj = {
          name: "江苏交控智慧高速",
          json: oricontent,
          id: this.layersId,
        }
        this.editLayerData(obj);
      } else {
        var obj = {
          name: "江苏交控智慧高速",
          json: oricontent
        }
        this.addLayerData(obj);
      }
      // axios({
      //   method: "POST",
      //   url: "http://10.10.4.121:8070/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/add",
      //   data: {
      //     userId: this.$store.state.userId,
      //     userName: this.$store.state.userName,
      //     geojsonName: this.treeData[0].name,
      //     geojsonString: content,
      //   },
      // }).then(
      //   (response) => {
      //     uploading.close();
      //     if (response.data.code == 200) {
      //       this.$message({
      //         message: "保存成功",
      //         type: "success",
      //       });
      //     } else {
      //       this.$message.error("保存失败!");
      //     }
      //   },
      //   (error) => {
      //     uploading.close();
      //     this.$message.error("数据上传失败");
      //     // console.log("错误", error.message);
      //   }
      // );
      // })
      // .catch(() => {
      //   this.$message({
      //     type: "info",
      //     message: "已取消上传",
      //   });
      // });
    },
    async addLayerData(res) {
      const data = await Op_Insert(res);
      if (data.status == 200) {
        this.uploading.close();
      }
    },
    async editLayerData(res) {
      const data = await Op_UpdateById(res);
      if (data.status == 200) {
        this.uploading.close();
      }
    },
    // åŠ è½½åŽ†å²æ ‡ç»˜æ•°æ®
    histotyPlotting() {
      this.$confirm(
        "该操作将会导致当前标绘数据被覆盖,是否继续?",
        "会议保障历史数据",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
          // customClass: "msgbox",
    async histotyPlotting() {
      const data = await Op_SelectByPage({ pageSize: 1000000, pageIndex: 1, name: '' });
      if (data.status == 200 && data.data.length > 0) {
        var val_data = data.data;
        for (var i in val_data) {
          var json = val_data[i].json;
          var val = JSON.parse(json)
          if (val.length > 0) {
            this.layersId = val_data[i].id;
            let plottingArr = [];
            plottingArr.push(val[0]);
            const newArr = arrGroup(plottingArr, (item) => item.name);
            let finalPlotting = [];
            newArr.map((a) => {
              let newObj = {};
              a.map((b) => {
                if (newObj.children) {
                  newObj.children = newObj.children.concat(b.children);
                } else {
                  newObj = b;
                }
              });
              finalPlotting.push(newObj);
            });
            let json = {
              name: "江苏交控智慧高速",
              id: 1,
              open: true,
              children: finalPlotting,
            };
            this.initData(json);
          }
        }
      )
        .then(() => {
          const downloading = this.$loading({
            lock: true,
            text: "会议保障历史数据加载中,请稍后",
            spinner: "el-icon-loading",
            background: "rgba(0, 0, 0, 0.7)",
          });
          let that = this;
          axios({
            method: "GET",
            // method: "POST",
            // url: "/api/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/list",
            url: "http://10.10.4.121:8070/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/list",
            // data: {
            //   userId: this.$store.state.userId,
            // },
          }).then(
            (response) => {
              setTimeout(() => {
                downloading.close();
                let plottingArr = [];
                response.data.result.forEach((item) => {
                  let geoJsonObj = JSON.parse(item.geojsonString);
                  plottingArr.push(geoJsonObj[0]);
                });
                const newArr = arrGroup(plottingArr, (item) => item.name);
                let finalPlotting = [];
                newArr.map((a) => {
                  let newObj = {};
                  a.map((b) => {
                    if (newObj.children) {
                      newObj.children = newObj.children.concat(b.children);
                    } else {
                      newObj = b;
                    }
                  });
                  finalPlotting.push(newObj);
                });
                let json = {
                  name: "一张图",
                  id: 1,
                  open: true,
                  children: finalPlotting,
                };
                that.initData(json);
              }, 2000);
            },
            (error) => {
              setTimeout(() => {
                downloading.close();
                // console.log("错误", error.message);
                this.$message.error("数据请求失败");
              }, 2000);
            }
          );
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消加载",
          });
        });
      }
      // const downloading = this.$loading({
      //   lock: true,
      //   text: "会议保障历史数据加载中,请稍后",
      //   spinner: "el-icon-loading",
      //   background: "rgba(0, 0, 0, 0.7)",
      // });
      // let that = this;
      // axios({
      //   method: "GET",
      //   // method: "POST",
      //   // url: "/api/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/list",
      //   url: "http://10.10.4.121:8070/PM20221203225_OpenAPI3_Service-0.0.1-SNAPSHOT/biaoHui/list",
      //   // data: {
      //   //   userId: this.$store.state.userId,
      //   // },
      // }).then(
      //   (response) => {
      //     setTimeout(() => {
      //       downloading.close();
      //
      //       response.data.result.forEach((item) => {
      //         let geoJsonObj = JSON.parse(item.geojsonString);
      //         plottingArr.push(geoJsonObj[0]);
      //       });
      //       const newArr = arrGroup(plottingArr, (item) => item.name);
      //       let finalPlotting = [];
      //       newArr.map((a) => {
      //         let newObj = {};
      //         a.map((b) => {
      //           if (newObj.children) {
      //             newObj.children = newObj.children.concat(b.children);
      //           } else {
      //             newObj = b;
      //           }
      //         });
      //         finalPlotting.push(newObj);
      //       });
      //       let json = {
      //         name: "江苏交控智慧高速",
      //         id: 1,
      //         open: true,
      //         children: finalPlotting,
      //       };
      //       that.initData(json);
      //     }, 2000);
      //   },
      //   (error) => {
      //     setTimeout(() => {
      //       downloading.close();
      //       // console.log("错误", error.message);
      //       this.$message.error("数据请求失败");
      //     }, 2000);
      //   }
      // );
    },
    // æ¸…除本地所有标绘信息
    deleteAllPlot() {
@@ -541,7 +529,7 @@
        }
        // åˆå§‹å®šä½
        document.title = sessionStorage.getItem("SmartEarthTitle") || "一张图";
        document.title = sessionStorage.getItem("SmartEarthTitle") || "江苏交控智慧高速";
      } else {
        setTimeout(() => {
          this.loadDataToScene();
@@ -562,9 +550,12 @@
        if (addData && node._children) {
          node._children.forEach((item) => {
            _treeTool.addData(item);
            this.setAddGLBLayer(item);
          });
        } else {
          addData && _treeTool.addData(node);
          this.setAddGLBLayer(node);
        }
      }
      if (node.children && node.children.length) {
@@ -584,11 +575,19 @@
    // å‹¾é€‰
    check(treeNode, data) {
      let isCheck = data.checkedKeys.indexOf(treeNode.id) > -1;
      // å‹¾é€‰èŠ‚ç‚¹
      this.checkTreeNode({ id: treeNode.id, checked: isCheck });
      // æ›´æ–°åœºæ™¯æ•°æ®
      _treeTool.checkNode(treeNode, isCheck);
      if (treeNode.sourceType === 'GLB') {
        if (isCheck) {
          model.addModelLayer(treeNode);
        } else {
          model.setDelGLBModel(treeNode);
        }
      }
      // åªèƒ½åŒæ—¶åŠ è½½ä¸€ä¸ªåœ°å½¢
      if (
        isCheck &&
@@ -648,7 +647,7 @@
          };
          this.addData(data, newChild);
        })
        .catch(() => {});
        .catch(() => { });
    },
    // é€‰æ‹©æ•°æ®
    selectData(data) {
@@ -705,6 +704,8 @@
        case "pathLayer":
          this.$refs.addPathLayer.open(type, editData, defaultData);
          break;
      }
    },
    openScene(filedata) {
@@ -716,7 +717,7 @@
          let json = data.data;
          this.initData(json);
        })
        .catch(() => {});
        .catch(() => { });
    },
    saveScene(data) {
      let fileName = data.name;
@@ -739,7 +740,7 @@
            alert("保存成功!");
          }
        })
        .catch(() => {});
        .catch(() => { });
    },
    // æ·»åŠ æ•°æ®åˆ°åœºæ™¯
    addSceneData(data, isEdit) {
@@ -765,6 +766,7 @@
    // æ·»åŠ æ ‘èŠ‚ç‚¹
    addData(data, value) {
      !value.rename && (value.rename = false);
      this.addTreeChildren({ pid: data && data.id, item: value });
      this.expandedNode(data);
@@ -784,7 +786,7 @@
    addOtherData(parentName, data) {
      let parentNode = this.getParentNodeByName(parentName);
      data.checked = true;
      this.setAddGLBLayer(data);
      if (!parentNode) {
        parentNode = {
          id: window.sgworld.Core.getuid(),
@@ -799,6 +801,14 @@
      } else {
        this.addData(parentNode, { ...data, item: undefined });
        _treeTool.treeData && _treeTool.treeData.set(data.id, data.item);
      }
    },
    setAddGLBLayer(res) {
      if (res.sourceType == "GLB" && res.checked) {
        model.addModelLayer(res);
      }
    },
    // æ·»åŠ æ¼”ç¤ºåŠ¨ç”»
@@ -820,7 +830,7 @@
          this.addOtherData("演示动画", data);
          this.$refs.animationEdit.open(id);
        })
        .catch(() => {});
        .catch(() => { });
    },
    //更新动画
    updateAnimation(id, data) {
@@ -848,7 +858,12 @@
      if (treeNode.animationDatas) {
        this.$refs.animationEdit.start(treeNode.animationDatas);
      } else {
        _treeTool.flyTo(treeNode);
        if (treeNode.sourceType === 'GLB') {
          model.flyTo(treeNode);
        } else {
          _treeTool.flyTo(treeNode);
        }
      }
    },
    select() {
@@ -913,7 +928,6 @@
    rightClick(e, data, node, comp) {
      this.isClickParent = !!data.children;
      this.selectNode = data;
      console.log(this.selectNode);
      this.rightClickMenuStyle = { top: e.pageY + "px", left: e.pageX + "px" };
      this.rightClickMenuDisplay = true;
      document.onclick = (e) => {
@@ -926,9 +940,15 @@
    },
    // å³é”®åˆ é™¤æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    deleteTreeNode() {
      if (this.selectNode.sourceType === "GLB") {
        model.setDelGLBModel(this.selectNode)
      }
      this.remove(this.selectNode);
      this.$refs.tree && this.$refs.tree.setCurrentKey(null);
      this.selectNode = undefined;
    },
    // å³é”®ç¼–辑按钮编辑树节点
    editTreeNode() {
@@ -948,6 +968,8 @@
            this.selectNode.id,
            this.selectNode.animationDatas
          );
        } else if (this.selectNode.sourceType === "GLB") {
          model.getEditModelLayer(this.selectNode);
        } else {
          this.openThisTypePop(this.selectNode.sourceType, this.selectNode);
        }
@@ -1032,9 +1054,11 @@
/deep/.button-user i {
  color: #ffffff !important;
}
.historyBtn {
  margin-left: 10px;
}
.closeBtn {
  color: white;
  position: relative;
@@ -1074,6 +1098,7 @@
  padding: 10px 0px;
  box-sizing: border-box;
}
.closePanel {
  position: absolute;
  right: 12px;
@@ -1089,12 +1114,14 @@
  z-index: 999;
  color: white;
}
.treeContainer {
  width: 100%;
  height: 100%;
  .treeTitle {
    margin: 0px 0px 10px 10px;
    button {
      background-color: rgba(155, 155, 155, 0.7) !important;
      width: 30px;
@@ -1103,6 +1130,7 @@
      padding: 5px 3px !important;
      border: none;
    }
    /deep/ .el-upload {
      margin-right: 10px;
    }
@@ -1119,7 +1147,7 @@
    background-color: rgba(245, 247, 250, 0.2);
  }
  /deep/ .el-tree-node:focus > .el-tree-node__content {
  /deep/ .el-tree-node:focus>.el-tree-node__content {
    background-color: rgba(245, 247, 250, 0.2);
  }
@@ -1136,7 +1164,7 @@
    }
  }
  /deep/ .el-checkbox > .is-disabled {
  /deep/ .el-checkbox>.is-disabled {
    display: none;
  }
}
@@ -1170,6 +1198,7 @@
.rightClickMenu ul li:hover {
  background-color: #ebeef5;
}
.wdzy::-webkit-scrollbar {
  /*滚动条整体样式*/
  width: 5px;
src/components/left/layerTree/modelEdit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
<template>
  <div class="modelBox" v-drag>
    <div>
      <div class="modleTitle ">
        <div>模型编辑</div>
        <div class="modelClose" @click="$store.state.isShowEditLayer = false"> X</div>
      </div>
    </div>
    <div class="modelContent">
      <el-form :model="modelOption" label-width="80px">
        <el-form-item label="名称">
          <el-input v-model="modelOption.name" @change="setModelFormChange(1)" />
        </el-form-item>
        <el-form-item label="经度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" v-model="modelOption.style.longitude"
            :step="0.001" />
        </el-form-item>
        <el-form-item label="维度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" v-model="modelOption.style.latitude"
            :step="0.001" />
        </el-form-item>
        <el-form-item label="高度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" :min="-100" :max="1000"
            v-model="modelOption.style.altitude" :step="1" />
        </el-form-item>
        <el-form-item label="偏移角度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" :min="-180" :max="180"
            v-model="modelOption.style.heading" :step="1" />
        </el-form-item>
        <el-form-item label="俯仰角度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" :min="-90" :max="90"
            v-model="modelOption.style.pitch" :step="1" />
        </el-form-item>
        <el-form-item label="旋转角度">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" :min="-90" :max="90"
            v-model="modelOption.style.roll" :step="1" />
        </el-form-item>
        <el-form-item label="比例">
          <el-input-number style="width: 100%;" @change="setModelFormChange(2)" :min="0.1" :step="0.1" :max="10"
            v-model="modelOption.style.scale" />
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>
<script>
import model from '../../../assets/js/Layer/model';
export default {
  name: "modelEdit",
  components: {
  },
  data() {
    return {
      modelOption: {
        id: null,
        sourceType: null,
        name: "",
        style: {
          url: null,
          name: null,
          altitude: null,
          longitude: null,
          latitude: null,
          heading: null,
          pitch: null,
          roll: null,
          scale: null,
          url: null,
          id: null,
          sourceType: null,
        }
      },
    };
  },
  mounted() {
    this.setLayerStart();
  },
  destroyed() {
  },
  methods: {
    setModelFormChange(res) {
      if (res == 1) {
        this.modelOption.style.name = this.modelOption.name;
      }
      model.setEditChanege(this.modelOption, res);
    },
    setLayerStart() {
      this.modelOption = model.form;
    },
  }
};
</script>
<style scoped lang="less">
.modelBox {
  width: 360px;
  height: 60%;
  border: 1px solid white;
  top: 70px;
  right: 20px;
  background-color: rgba(0, 0, 0, 0.6); // #0048fd69 !important
  z-index: 9999;
  position: absolute;
  .modleTitle {
    height: 42px;
    width: 90%;
    background: #0048fd69 !important;
    border-bottom: 1px solid white;
    color: white;
    font-weight: 700px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0% 5%;
    .modelClose {
      height: 16px;
      width: 16px;
      display: flex;
      align-items: center;
      justify-content: center;
      background: rgba(128, 128, 128, 0.6);
      font-size: 14x;
    }
  }
  .modelContent {
    width: 90%;
    height: calc(95% - 42px);
    margin: 5%;
    display: flex;
    justify-content: space-between;
    flex-flow: row wrap;
    .modelType {
      width: 47.5%;
      height: 20%;
      border: 1px solid #909399;
      .imgIcon {
        width: 100%;
        height: 100%;
      }
    }
    .modelType :hover {
      border: 1px solid #409EFF;
    }
  }
  /deep/.el-form-item__label {
    color: white;
  }
}
</style>
src/components/left/layerTree/modelLayer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
<template>
  <div class="modelBox" v-drag >
    <div>
      <div class="modleTitle "  >
        <div>模型添加</div>
        <div class="modelClose" @click="$store.state.showModelFlag = false"> X</div>
      </div>
    </div>
    <div class="modelContent">
      <div class="modelType" v-for="(item, index) in modelOption" :key="index" @click="setModelAddLayer(item)">
        <img class="imgIcon" :src="require('../../../assets/img/model/' + item.imgUrl)" />
      </div>
    </div>
  </div>
</template>
<script>
import model from '../../../assets/js/Layer/model';
export default {
  name: "modelLayer",
  components: {
  },
  data() {
    return {
      modelOption: [
      ],
    };
  },
  mounted() {
    this.setLayerStart();
  },
  destroyed() {
  },
  methods: {
    setLayerStart() {
      this.modelOption = layerData.modelData;
    },
    setModelAddLayer(item) {
      // model
      model.changeLayer(item,true);
    },
  }
};
</script>
<style scoped lang="less">
.modelBox {
  width: 360px;
  height: 60%;
  border: 1px solid white;
  top: 70px;
  right: 20px;
  background-color: rgba(0, 0, 0, 0.6); // #0048fd69 !important
  z-index: 9999;
  position: absolute;
  .modleTitle {
    height: 42px;
    width: 90%;
    background: #0048fd69 !important;
    border-bottom: 1px solid white;
    color: white;
    font-weight: 700px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0% 5%;
    .modelClose {
      height: 16px;
      width: 16px;
      display: flex;
      align-items: center;
      justify-content: center;
      background: rgba(128, 128, 128, 0.6);
      font-size: 14x;
    }
  }
  .modelContent {
    width: 90%;
    height: calc(95% - 42px);
    margin: 5%;
    display: flex;
    justify-content: space-between;
    flex-flow: row wrap;
    .modelType {
      width: 47.5%;
      height: 20%;
      border: 1px solid #909399;
      .imgIcon {
        width: 100%;
        height: 100%;
      }
    }
    .modelType :hover {
      border: 1px solid #409EFF;
    }
  }
}
</style>
src/components/map/history.vue
@@ -46,8 +46,9 @@
        target: "mapContainer",
        layers: [],
        view: new View({
          center: olProj.fromLonLat([108.945951, 34.465262]),
          center: [105.02, 34.9],
          zoom: 5,
          projection: "EPSG:4326",
        }),
        controls: [],
      });
src/components/map/viewer.vue
@@ -42,6 +42,7 @@
import jiejing from "@/assets/img/new/jiejing.png";
import "animate.css";
import Bus from "@tools/Bus";
import mapViewer from "../../assets/js/Layer/mapViewer";
let activeLi, nLayer, LWLayer;
export default {
@@ -132,8 +133,8 @@
      Viewer.scene.globe.translucency.frontFaceAlpha = 0.5;
      Viewer.scene.globe.undergroundColor = undefined;
      //开启编辑并启用属性弹窗
      sgworld.Creator.SimpleGraphic.setEdit(true, {
        editProp: true,
      sgworld.Creator.SimpleGraphic.setEdit(false, {
        editProp: false,
        editPropData: {
          offset: "r",
          height: "60%",
@@ -196,6 +197,8 @@
      //初始化弹窗事件
      // that.showBottom();
      that.initLayerOpen();
      //添加鼠标点击事件
      mapViewer.addClick();
    });
    let size = this.detectZoom();
    this.scale = (100 / size).toFixed(2);
src/components/menu/bottom-menu.vue
@@ -289,7 +289,7 @@
let video4;
let heatMapItem;
import { mapState, mapMutations } from "vuex";
import { queryBySquare } from "@/utils/request";
// import { queryBySquare } from "@/utils/request";
import Bus from "../tools/Bus";
import { roman } from "../../assets/json/index.js";
import URLInCode from "@/assets/js/urlInCode";
src/components/menu/menulist.vue
@@ -12,6 +12,14 @@
        :src="switchMenuImage"
      />
      <div class="menubtnlist" v-show="panelActive">
        <div class="menubtn" @click="showSceneCard()">
          <img
            class="bhImg"
            title="场景数据"
            src="@/assets/img/left/specialeffect4.png"
          />
          <span>场景</span>
        </div>
        <div class="menubtn" @click="setMenuTool(1)">
          <img class="bhImg" title="标绘" src="@/assets/img/right/bh1.png" />
          <span>标绘</span>
@@ -24,14 +32,15 @@
          <img class="bhImg" title="漫游" src="@/assets/img/right/my11.png" />
          <span>漫游</span>
        </div>
        <!-- <div class="menubtn" @click="setMenuTool(4)">
       <div class="menubtn" @click="showModelCard()">
          <img
            class="bhImg"
            title="专题"
            src="@/assets/img/left/specialanalyse4.png"
          />
          <span>专题</span>
        </div> -->
          <span>模型</span>
        </div>
        <div class="menubtn" @click="setMenuTool(5)">
          <img class="bhImg" title="分析" src="@/assets/img/right/cx-s.png" />
          <span>分析</span>
@@ -52,6 +61,7 @@
          />
          <span>设置</span>
        </div>
      </div>
    </div>
    <div class="menutools">
@@ -282,6 +292,12 @@
    showSettingCard() {
      this.$store.commit("showSetBox", true);
    },
    showModelCard(){
      this.$store.commit("showModelBox", true);
    },
    showSceneCard(){
      this.$store.commit("showSceneBox", "");
    },
    closeAllHighLight(type) {
      // !(type == "plotting") && this.$refs.plotting.clearHighLight();
      // !(type == "roam") && this.$refs.roam.clearActive();
src/components/right/right-bottom.vue
@@ -36,7 +36,7 @@
          popper-class="item_tooltip"
        >
          <div class="legend-bg" @click="fovViewer">
            <img class="dwImg" src="@/assets/img/new/location.png" />
            <img class="dwImg" src="@/assets/img/new/mapSplit.png" />
          </div>
        </el-tooltip>
      </div>  
@@ -303,6 +303,7 @@
let _index = 0;
import rightLegend from "./right-legend";
import Bus from "../tools/Bus";
import { mapState, mapMutations } from "vuex";
export default {
  name: "right-bottom",
  components: {
@@ -339,7 +340,11 @@
      isActive: true,
    };
  },
  computed: {
    ...mapState(["viewer1Show", "isLand", "yqfk", "qyEchartsShow"]),
  },
  mounted() {
    //关闭我的资源弹窗
    Bus.$on("closeLegendPop", (data) => {
      if (data) {
@@ -351,6 +356,7 @@
    Bus.$off("closeLegendPop");
  },
  methods: {
    ...mapMutations(["setViewer1Show", "setqyEchartsShow"]),
    // ç›¸æœºå‚æ•°
    getcamera() {
      let p = sgworld.Navigate.getCameraInfo();
@@ -405,13 +411,14 @@
      }
    },
    fovViewer() {
      this.isWideAngle = !this.isWideAngle;
      if (this.isWideAngle) {
        this.wideAngle = window.Viewer.camera.frustum.fov;
        window.Viewer.camera.frustum.fov = 2;
      } else {
        window.Viewer.camera.frustum.fov = this.wideAngle;
      }
      this.setViewer1Show(!this.viewer1Show);
      // this.isWideAngle = !this.isWideAngle;
      // if (this.isWideAngle) {
      //   this.wideAngle = window.Viewer.camera.frustum.fov;
      //   window.Viewer.camera.frustum.fov = 2;
      // } else {
      //   window.Viewer.camera.frustum.fov = this.wideAngle;
      // }
    },
    flyBack() {
      sgworld.Navigate.flyToPointsInterest({
src/components/right/right-top.vue
@@ -1,50 +1,27 @@
<template>
  <div class="trigger" style="margin-top: 140px; margin-right: 10px">
    <div class="user">
      <el-avatar
        class="user_btn"
        :size="70.6"
        icon="el-icon-user-solid"
        alt="个人中心"
      ></el-avatar>
    <!-- <div class="user">
      <el-avatar class="user_btn" :size="70.6" icon="el-icon-user-solid" alt="个人中心"></el-avatar>
      <div class="transition-box">
        <ul>
          <li @click="showLayer()">标绘数据</li>
          <!-- <li @click="dialogFormVisible = true">修改密码</li> -->
          <li @click="dialogFormVisible = true">修改密码</li>
        </ul>
      </div>
    </div>
    <el-dialog
      append-to-body
      title="修改密码"
      :visible.sync="dialogFormVisible"
      width="30%"
      :close-on-click-modal="false"
      custom-class="psdDialog"
    >
    </div> -->
    <el-dialog append-to-body title="修改密码" :visible.sync="dialogFormVisible" width="30%" :close-on-click-modal="false"
      custom-class="psdDialog">
      <el-form :model="form" ref="pwdForm" :rules="rules">
        <el-form-item label="原密码">
          <el-input
            show-password
            v-model="form.oldPassword"
            autocomplete="off"
          ></el-input>
          <el-input show-password v-model="form.oldPassword" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPassword">
          <el-input
            show-password
            v-model="form.newPassword"
            autocomplete="off"
          ></el-input>
          <el-input show-password v-model="form.newPassword" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="确认密码" prop="checkPassword">
          <el-input
            show-password
            v-model="form.checkPassword"
            autocomplete="off"
          ></el-input>
          <el-input show-password v-model="form.checkPassword" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
@@ -69,7 +46,11 @@
 
    </div> -->
    <div class="user_menu" v-show="isShowLayer"><Layer ref="Layer" /></div>
    <div class="user_menu" v-show="$store.state.isShowLayer">
      <Layer ref="Layer" />
    </div>
    <model-layer v-show="$store.state.showModelFlag"></model-layer>
    <model-edit v-if="$store.state.isShowEditLayer"></model-edit>
    <querydata ref="drawer" />
    <div class="resByMouseBox" v-if="showRangeBox">
@@ -85,13 +66,13 @@
            <div class="listBox" v-for="(son, index) in fa" :key="index">
              {{
                son.properties["部件编码"]
                  ? son.properties["部件编码"]
                  : son.properties["井编号"]
                ? son.properties["部件编码"]
                : son.properties["井编号"]
              }}
              {{
                son.properties["部件名称"]
                  ? son.properties["部件名称"]
                  : son.properties["井名称"]
                ? son.properties["部件名称"]
                : son.properties["井名称"]
              }}
              &nbsp; &nbsp; &nbsp;
              <el-link @click.stop="showDetail(son)">详情</el-link>
@@ -146,12 +127,7 @@
      <div class="right-close" v-show="isShow" @click="simulationHoverOff">
        Ã—
      </div>
      <el-tabs
        type="border-card"
        :tab-position="tabPosition"
        v-model="activeName"
        @tab-click="tabclick"
      >
      <el-tabs type="border-card" :tab-position="tabPosition" v-model="activeName" @tab-click="tabclick">
        <div v-show="isShowLocation" class="rightcontent">
          <transition name="el-fade-in-linear">
            <location v-show="isShowLocation" ref="location" />
@@ -159,12 +135,7 @@
        </div>
        <el-tab-pane label="标绘" name="标绘">
          <span slot="label" @click="simulationHoverOn('标绘')">
            <img
              class="bhImg"
              title="标绘"
              v-if="!isShowPlotting"
              src="@/assets/img/right/bh1.png"
            />
            <img class="bhImg" title="标绘" v-if="!isShowPlotting" src="@/assets/img/right/bh1.png" />
            <img v-else title="标绘" src="@/assets/img/right/bh-l.png" />
          </span>
          <div v-show="isShowPlotting" class="rightcontent">
@@ -175,12 +146,7 @@
        </el-tab-pane>
        <el-tab-pane label="量算" name="量算">
          <span slot="label" @click="simulationHoverOn('量算')">
            <img
              class="lsImg"
              title="量算"
              v-if="!isShowMeasure"
              src="@/assets/img/right/ls-s.png"
            />
            <img class="lsImg" title="量算" v-if="!isShowMeasure" src="@/assets/img/right/ls-s.png" />
            <img v-else title="量算" src="@/assets/img/right/ls-l.png" />
          </span>
          <div v-show="isShowMeasure" class="rightcontent">
@@ -191,12 +157,7 @@
        </el-tab-pane>
        <el-tab-pane label="空间查询" name="空间查询">
          <span slot="label" @click="simulationHoverOn('空间查询')">
            <img
              class="cxImg"
              title="空间查询"
              v-if="!isShowQuery"
              src="@/assets/img/right/cx-s.png"
            />
            <img class="cxImg" title="空间查询" v-if="!isShowQuery" src="@/assets/img/right/cx-s.png" />
            <img v-else title="空间查询" src="@/assets/img/right/cx-ll.png" />
          </span>
          <div v-show="isShowQuery" class="rightcontent">
@@ -207,12 +168,7 @@
        </el-tab-pane>
        <el-tab-pane label="漫游" name="漫游">
          <span slot="label" @click="simulationHoverOn('漫游')">
            <img
              class="myImg"
              title="漫游"
              v-if="!isShowRoam"
              src="@/assets/img/right/my11.png"
            />
            <img class="myImg" title="漫游" v-if="!isShowRoam" src="@/assets/img/right/my11.png" />
            <img v-else title="漫游" src="@/assets/img/right/my-l.png" />
          </span>
          <div v-show="isShowRoam" class="rightcontent">
@@ -227,16 +183,8 @@
        </el-tab-pane> -->
        <el-tab-pane label="专题分析" name="专题分析">
          <span slot="label" @click="simulationHoverOn('专题分析')">
            <img
              class="specialImg"
              v-if="!isShowSpeAnalyseImg"
              src="@/assets/img/left/specialanalyse4.png"
            />
            <img
              class="specialImg"
              v-else
              src="@/assets/img/left/specialanalyse4-s.png"
            />
            <img class="specialImg" v-if="!isShowSpeAnalyseImg" src="@/assets/img/left/specialanalyse4.png" />
            <img class="specialImg" v-else src="@/assets/img/left/specialanalyse4-s.png" />
          </span>
          <div v-show="isShowSpeAnalyse" class="leftContent">
            <leftztfx ref="ZTFX" />
@@ -244,25 +192,16 @@
        </el-tab-pane>
        <el-tab-pane label="特效" name="特效">
          <span slot="label" @click="simulationHoverOn('特效')">
            <img
              class="speEffectImg"
              v-if="!isShowSpeEffectImg"
              src="@/assets/img/left/specialeffect4.png"
            />
            <img
              class="speEffectImg"
              v-else
              src="@/assets/img/left/specialeffect4-s.png"
            />
            <img class="speEffectImg" v-if="!isShowSpeEffectImg" src="@/assets/img/left/specialeffect4.png" />
            <img class="speEffectImg" v-else src="@/assets/img/left/specialeffect4-s.png" />
          </span>
          <div v-show="isShowSpeEffect" class="leftContent">
            <lefttx ref="TX" />
          </div>
        </el-tab-pane>
        <el-tab-pane label="清除" name="清除">
          <span slot="label" @click="simulationHoverOn('清除')"
            ><img title="清除" class="qcImg" src="@/assets/img/right/qc-s.png"
          /></span>
          <span slot="label" @click="simulationHoverOn('清除')"><img title="清除" class="qcImg"
              src="@/assets/img/right/qc-s.png" /></span>
        </el-tab-pane>
      </el-tabs>
    </div>
@@ -304,6 +243,7 @@
  z-index: 1000;
  box-sizing: border-box;
}
.resByMouseBox .closeBtn {
  color: #fff;
  position: absolute;
@@ -311,9 +251,11 @@
  top: 3px;
  font-size: 24px;
}
.el-link.el-link--default {
  color: #409eff;
}
.detailBox {
  width: 200px;
  /* height: 300px; */
@@ -327,6 +269,7 @@
  padding: 20px 10px 10px;
  position: relative;
}
.detailcCloseBtn {
  font-size: 24px;
  position: absolute;
@@ -334,6 +277,7 @@
  top: 5px;
  /* float: right; */
}
.detailBox :not(:first-child) {
  margin-top: 5px;
}
@@ -394,9 +338,11 @@
  margin-top: 0px !important;
  /* border-radius: 3px !important; */
}
.user:hover .transition-box {
  display: block;
}
.transition-box {
  display: none;
  width: 130px;
@@ -411,19 +357,23 @@
  box-sizing: border-box;
  z-index: 9999;
}
.transition-box ul li {
  /* min-width: 154px; */
  height: 35px;
  text-align: center;
  line-height: 35px;
}
.transition-box ul li:hover {
  background: rgba(18, 80, 172, 0.6);
  box-shadow: 0px 0px 10px 5px rgba(0, 132, 255, 0.7) inset;
}
.psdDialog .el-form-item {
  margin-bottom: 0px;
}
/* .psdDialog,
.psdDialog /deep/ .el-pager li {
    background-color: rgba(255, 0, 0, 0.0);
@@ -489,6 +439,7 @@
.trigger {
  pointer-events: all;
}
.specialTool {
  position: absolute;
  bottom: 60px;
@@ -512,6 +463,7 @@
  cursor: pointer;
  /* box-shadow: 0px 0px 5px 5px #fff; */
}
.top-btn-active {
  background: #0987ff !important;
}
@@ -678,19 +630,23 @@
  margin: 1px;
  margin: 20px 0;
}
.searchElBg{
.searchElBg {
  background-image: url("~@/assets/img/new/leftCircle.png") !important;
  background-size: 48px 48px !important;
}
.searchBtn {
  margin-top: 3px;
  width: 40px;
  pointer-events: none;
}
.searchElBg:hover{
.searchElBg:hover {
  background-image: url("~@/assets/img/new/leftCircle-y.png") !important;
  background-size: 48px 48px !important;
}
.searchBg {
  position: absolute;
  left: -4px;
@@ -699,6 +655,7 @@
  height: 56px;
  z-index: -10;
}
.active {
  background: #0987ff !important;
}
@@ -711,9 +668,11 @@
  height: 71px;
  background-image: url("~@/assets/img/new/rightCircle.png");
}
.user:hover {
  background-image: url("~@/assets/img/new/rightCircle-y.png");
}
.user .el-avatar {
  background-color: transparent;
  margin: 3px auto 0;
@@ -723,6 +682,7 @@
  margin-right: 0px !important;
  font-size: 28.9px;
}
.fcfhBox {
  position: relative;
  top: -50px;
@@ -731,33 +691,40 @@
  background-color: rgba(24, 87, 175, 0.7);
  border-radius: 4px;
}
.fcfhactive {
  background-color: #17a8fc !important;
}
.fcfhBox button {
  background-color: rgba(24, 64, 118, 1);
}
.closeBtn {
  font-size: 24px;
  color: #fff;
  vertical-align: top;
  margin-left: 5px;
}
.resByMouseBox /deep/ .el-collapse-item__header {
  background-color: transparent;
  color: #fff;
  height: 37px;
  padding-left: 15px;
}
.resByMouseBox /deep/ .el-collapse-item__wrap {
  background-color: transparent;
  /* color: #fff; */
  /* height: 37px; */
  /* padding-left: 15px; */
}
.bottomWrap {
  margin-top: 28px;
}
.bottomWrap /deep/ .el-collapse-item__content {
  /* max-height: 308px; */
  /* overflow: auto; */
@@ -765,6 +732,7 @@
  padding-left: 15px;
  padding-bottom: 0;
}
.listBox {
  width: 90%;
  margin: 3px 0;
@@ -788,9 +756,10 @@
import common from "@/components/common";
import { mapState, mapMutations } from "vuex";
import Bus from "../tools/Bus";
import { queryBySquare } from "@/utils/request";
// import { queryBySquare } from "@/utils/request";
import FCFH from "@/components/right/FCFH";
import modelLayer from "@/components/left/layerTree/modelLayer.vue";
import  modelEdit from '@/components/left/layerTree/modelEdit.vue';
//交通图层
let trafficLayer, panoramaLayer;
let flyPoint;
@@ -807,6 +776,8 @@
    lefttx,
    Layer,
    FCFH,
    modelLayer,
    modelEdit
  },
  name: "right-top",
  data() {
@@ -1306,7 +1277,7 @@
    closeall() {
      try {
        this.$refs.measure.clearMeasure();
      } catch (e) {}
      } catch (e) { }
      this.isShow = false;
      this.isShowLocation = false;
      this.isShowPlotting = false;
@@ -1367,7 +1338,7 @@
      layuiLayer.close(SmartEarthPopupData.layerProp);
      sgworld.drawObj &&
        (sgworld.drawObj.drawHandler && sgworld.drawObj.drawHandler.destroy(),
        sgworld.drawObj.end && sgworld.drawObj.end());
          sgworld.drawObj.end && sgworld.drawObj.end());
      this.isShowInput = !this.isShowInput;
      !this.isShowInput && this.$refs.search.clear();
@@ -1379,7 +1350,7 @@
      layuiLayer.close(SmartEarthPopupData.layerProp);
      sgworld.drawObj &&
        (sgworld.drawObj.drawHandler && sgworld.drawObj.drawHandler.destroy(),
        sgworld.drawObj.end && sgworld.drawObj.end());
          sgworld.drawObj.end && sgworld.drawObj.end());
      this.isShowLocation = !this.isShowLocation;
      if (!this.isShowLocation) {
@@ -1412,7 +1383,7 @@
      layuiLayer.close(SmartEarthPopupData.layerProp);
      sgworld.drawObj &&
        (sgworld.drawObj.drawHandler && sgworld.drawObj.drawHandler.destroy(),
        sgworld.drawObj.end && sgworld.drawObj.end());
          sgworld.drawObj.end && sgworld.drawObj.end());
      this.isShowTraffic = !this.isShowTraffic;
src/main.js
@@ -16,7 +16,8 @@
// å¼•å…¥echarts
import * as echarts from 'echarts';
Vue.prototype.$echarts = echarts
import drag from './assets/js/drag';
Vue.directive("drag",drag);
Vue.use(contentmenu)
Vue.config.productionTip = false
src/store/index.js
@@ -1,6 +1,7 @@
import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from "vuex-persistedstate"; //持久化所有state
import mapSplit from "./mapSplit";
// import { login } from '@/api/api';
// var encrypt = new JSEncrypt();
@@ -33,7 +34,11 @@
    selectedLayers: [],
    userId: "",
    userName: "",
    // layerData: {}
    showModelFlag:false,//模型添加编辑
    isShowLayer:false,
    addModelFlag:false,
    addModelLayer:null,
    isShowEditLayer:false,
  },
  mutations: {
    selectedLayer(state, b) {
@@ -58,10 +63,13 @@
    },
    setViewer1Show(state, b) {
      state.viewer1Show = b;
      if (b) {
        mapSplit.init();
      }
    },
    setqyEchartsShow(state, b) {
      state.qyEchartsShow = b;
      console.log(b);
    },
    setLayerTreeTwoScreen(state, b) {
      state.layerTreeTwoScreen = b;
@@ -81,8 +89,14 @@
    },
    showSetBox(state, b) {
      state.showSetting = b;
      console.log(b)
    },
    showModelBox(state,b){
      state.showModelFlag = b;
    },
    showSceneBox(state,b){
      state.isShowLayer = !state.isShowLayer;
    },
    // å®šä¹‰å·¥ç¨‹æ ‘数据
    setTreeData(state, data = []) {
      ergodicNode(data);
src/store/mapSplit.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
const mapSplit = {
    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,
    ],
    isSplitFlag: 0,
    init() {
        setTimeout(() => {
            window.map.updateSize();
            this.showSplitMap();
            this.isSplitFlag = 1;
            this.skdToOl();
        }, 500)
    },
    skdToOl() {
        var position = window.Viewer.camera.position
        var ellipsoid = window.Viewer.scene.globe.ellipsoid;
        var cartographic = ellipsoid.cartesianToCartographic(position)
        var lat = Cesium.Math.toDegrees(cartographic.latitude)
        var lng = Cesium.Math.toDegrees(cartographic.longitude)
        var level = this.getLevel(cartographic.height)
        console.log(lng, lat, level)
        window.map.getView().setCenter([parseFloat(lng), parseFloat(lat)])
        window.map.getView().setZoom(level)
    },
    getLevel(height) {
        var levelArray = this.levelArray;
        for (var i = 1, len = levelArray.length; i < len - 1; i++) {
            if (height >= (levelArray[i] + levelArray[i + 1]) / 2) {
                return i
            }
        }
        return levelArray.length - 1
    },
    getHeight(level) {
        var levelArray = this.levelArray;
        if (level > 0 && level < 23) {
            return levelArray[level]
        }
        return levelArray[levelArray.length - 1]
    },
    showSplitMap() {
        var that = this;
        $("#mapView")
            .off()
            .on("mousemove", function () {
                if (that.isSplitFlag == 1) {
                    window.Viewer.camera.changed.addEventListener(that.skdToOl())
                }
            })
            .on("mouseout", function () {
                if (that.isSplitFlag == 1) {
                    window.Viewer.camera.changed.removeEventListener(that.skdToOl())
                }
            });
        let mapZoomAndMove = function (event) {
            var position = window.map.getView().getCenter()
            var pos = position
            var level = that.getHeight(parseInt(window.map.getView().getZoom()))
            window.Viewer.camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(pos[0], pos[1], level),
            })
        }
        $("#mapOl")
            .off()
            .on("mousemove", function () {
                if (that.isSplitFlag == 1) {
                    that.olzoomAndMove(mapZoomAndMove)
                }
            })
            .on("mouseout", function () {
                if (that.isSplitFlag == 1) {
                    that.clearolzoomAndMove()
                }
            })
    }, clearolzoomAndMove() {
        let registerOnZoomArr = window.map.get("registerOnZoom")
        if (registerOnZoomArr && registerOnZoomArr.length > 0) {
            for (let i = 0; i < registerOnZoomArr.length; i++) {
                window.map.un("moveend", registerOnZoomArr[i])
            }
        }
    }, olzoomAndMove(eventListen, notListenMove) {
        // è®°å½•地图缩放,用于判断拖动
        window.map.lastZoom =
            window.map.lastZoom || window.map.getView().getZoom()
        // åœ°å›¾ç¼©æ”¾äº‹ä»¶
        let registerOnZoom = function (e) {
            // ä¸ç›‘听地图拖动事件
            if (notListenMove) {
                if (window.map.lastZoom != window.map.getView().getZoom()) {
                    eventListen && eventListen(e)
                }
            } else {
                eventListen && eventListen(e)
            }
            window.map.lastZoom = window.map.getView().getZoom()
        }
        // ä¿å­˜ç¼©æ”¾å’Œæ‹–动事件对象,用于后期移除
        let registerOnZoomArr = map.get("registerOnZoom") || []
        registerOnZoomArr.push(registerOnZoom)
        // ä½¿ç”¨åœ°å›¾ set æ–¹æ³•保存事件对象
        window.map.set("registerOnZoom", registerOnZoomArr)
        // ç›‘听地图移动结束事件
        window.map.on("moveend", registerOnZoom)
        return eventListen
    },
}
export default mapSplit;
src/utils/request.js
@@ -1,72 +1,10 @@
import axios from "axios";
// import { Message } from "element-ui";
// import router from "../router"
// create an axios instance
import axios from "axios";
const service = axios.create({
    baseURL: 'http://10.10.4.116:8089/', // api的base_url
    timeout: 35000, // è¯·æ±‚è¶…æ—¶æ—¶é—´
    headers: {
        "content-type": "application/json;charset=UTF-8",
    },
    withCredentials: true,
    baseURL: layerData.config.BASE_URL, // api的base_url
    timeout: -1, // è¯·æ±‚è¶…æ—¶æ—¶é—´
});
const GISSERVER = axios.create({
    baseURL: 'http://10.10.4.116:8070/gisserver/', // api的base_url
    timeout: 35000, // è¯·æ±‚è¶…æ—¶æ—¶é—´
});
// gisserver åå­—查询
// export function queryPOI(servername, layer, name) {
//     return GISSERVER.get("wfsserver/" + servername + "?version=1.3.0&request=GetFeature&format=json&typename=" + layer + "&propertyname=*&filter=%3CFilter%3E%3CPropertyIsLike+wildCard%3D%22*%22%3E%3CPropertyName%3E%E4%BA%95%E7%BC%96%E5%8F%B7%3C%2FPropertyName%3E%3CLiteral%3E" + name + "%3C%2FLiteral%3E%3C%2FPropertyIsLike%3E%3C%2FFilter%3E");
// }
// // gisserver èŒƒå›´æŸ¥è¯¢
export function queryBySquare(url, layer, area) {
    return GISSERVER.get(url, {
        params: {
            version: '1.3.0',
            request: 'GetFeature',
            typename: layer,
            propertyname: '*',
            format: "json",
            filter: `<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName /><gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>${area}</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></ogc:Intersects></ogc:Filter>`,
        }
    });
}
// request interceptor
service.interceptors.request.use(
    (config) => {
        // è¯·æ±‚携带token
        const token = window.localStorage.getItem('TokenKey');
        if (token) {
            config.headers["Authorization"] = token;
        }
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);
service.interceptors.response.use(
    (response) => {
        //登录之后有token
        if (window.localStorage.getItem('TokenKey') != null) {
            // console.log(response);
            // if (response.data.code !== 200) {
            //     router.push('/login');
            //     localStorage.removeItem("TokenKey");
            //     localStorage.removeItem("TokenTime");
            // }
            // //token过期返回登录页
            // if (response.data.code == 500104) {
            //     router.push('/login')
            //     localStorage.removeItem("TokenKey");
            //     localStorage.removeItem("TokenTime");
            // }
        }
        return response.data;
    },
    (error) => {
        return Promise.reject(error);
    }
);
export default service;
export default service;
static/SmartEarthSDK/Workers/TreeTool.js
@@ -9,7 +9,7 @@
    this.sgworld = sgworld
    this.treeData = new Map()
    this.colorTool = sgworld.Core.gradientColor();
    this.sgwfs = new window.SmartEarth.WFSTool(sgworld._Viewer,Cesium)
    this.sgwfs = new window.SmartEarth.WFSTool(sgworld._Viewer, Cesium)
}
/**
@@ -1027,6 +1027,9 @@
    } else {
        layer = this.getData(id);
    }
    if (!layer) {
        return
    }
    if (layer && layer.sourceType === "DynamicSatellite") {
        let obj = (layer.item || layer)
        obj.dtwxzsData.setVisibility(isShow);
static/data/layerData.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
var webhost = location.hostname;
var host = location.host;
var web_URL = "http://" + webhost;
const layerData = {
    config: {
        BASE_URL: "http://" + host + "/JiangSu",
        img_url: "http://" + host + "/static/image/",
        Model_URL: web_URL + "/JiangSu",
    },
    modelData: [
        {
            id: 'md1',
            name: '隔离带',
            url: '/Data/glb/隔离带.glb',
            imgUrl: '隔离带.png'
        },
        {
            id: 'md2',
            name: '测试模型2',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md3',
            name: '测试模型3',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md4',
            name: '测试模型4',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md5',
            name: '测试模型5',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md6',
            name: '测试模型6',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md7',
            name: '测试模型7',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        }, {
            id: 'md8',
            name: '测试模型8',
            url: '/Data/glb/Cesium_Air.glb',
            imgUrl: '飞机.png'
        },
    ]
}
static/image/¸ôÀë´ø.png
static/image/·É»ú.png
static/layers.json
ÎļþÌ«´ó
vue.config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
/*
 * @Author: çŽ‹æ—­ 1377869194@qq.com
 * @Date: 2023-05-08 13:52:20
 * @LastEditors: çŽ‹æ—­ 1377869194@qq.com
 * @LastEditTime: 2023-05-08 14:17:30
 * @FilePath: \LFWEB_NEW\vue.config.js
 * @Description: è¿™æ˜¯é»˜è®¤è®¾ç½®,请设置`customMade`, æ‰“å¼€koroFileHeader查看配置 è¿›è¡Œè®¾ç½®: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const path = require("path")
const resolve = dir => path.join(__dirname, dir)
module.exports = {
  lintOnSave: false,
  publicPath: "./",
  devServer: {
    host: 'localhost',//本地地址
    port: '8080',//端口号
    hot: true,//热更新自动刷新
    open: true,//自动打开
    overlay: {  //当出现编译错误或警告时,在浏览器中显示全屏覆盖。只显示错误信息不提示警告情况限制是
      warning: false,
      error: true
    },
    proxy: {
      "/JiangSu": {
        target: 'http:localhost/JiangSu',//代理地址 å‡¡æ˜¯ä½¿ç”¨/api
        changeOrigin: true,//允许跨域请求
        secure: false,
        pathRewrite: { //重写路径 æ›¿æ¢è¯·æ±‚地址中的指定路径
          ['^/JiangSu']: '' //将请求地址中的api替换为空
        }
      }
    }
  },
  configureWebpack: {
    resolve: {
      alias: {
        "@": resolve("src"),
      },
    },
  },
}