From e2c94dcb58b199eb57c164a67f1b038d401063d7 Mon Sep 17 00:00:00 2001
From: Surpriseplus <845948745@qq.com>
Date: 星期二, 22 八月 2023 16:38:35 +0800
Subject: [PATCH] 图层管理属性查询;空间查询下载借款给调试,分屏对比功能修改;

---
 src/assets/js/Map/index.js               |   25 
 src/views/query/SpatialQuery.vue         |  408 +++++++++++--
 public/CIMSDK/Assets/Images/color.png    |    0 
 src/views/layer/attributeList.vue        |  210 ++++++
 src/views/menus.vue                      |   71 ++
 src/assets/js/Map/rightServer.js         |  328 +++++++++++
 src/views/Index.vue                      |    4 
 src/store/index.ts                       |    3 
 src/api/api.js                           |    9 
 src/views/layer/doubleLayer.vue          |  473 ++++++++++++++++
 public/config/config.js                  |    1 
 src/assets/js/Map/menuTool.js            |  155 ++++-
 src/views/layer/layerManage.vue          |    4 
 src/assets/js/Map/config.js              |    2 
 public/CIMSDK/Workers/image/location.png |    0 
 15 files changed, 1,522 insertions(+), 171 deletions(-)

diff --git a/public/CIMSDK/Assets/Images/color.png b/public/CIMSDK/Assets/Images/color.png
new file mode 100644
index 0000000..06e58e4
--- /dev/null
+++ b/public/CIMSDK/Assets/Images/color.png
Binary files differ
diff --git a/public/CIMSDK/Workers/image/location.png b/public/CIMSDK/Workers/image/location.png
new file mode 100644
index 0000000..f0f0f7d
--- /dev/null
+++ b/public/CIMSDK/Workers/image/location.png
Binary files differ
diff --git a/public/config/config.js b/public/config/config.js
index 0c7f103..55a5acb 100644
--- a/public/config/config.js
+++ b/public/config/config.js
@@ -1 +1,2 @@
 const BASE_URL = "http://192.168.20.83:8088/MoonServer/"; //鍚庣鎺ュ彛鍦板潃
+// const BASE_URL = "http://192.168.20.106:9000/MoonServer/"; //鍚庣鎺ュ彛鍦板潃
\ No newline at end of file
diff --git a/src/api/api.js b/src/api/api.js
index 174c3ce..5bc39ee 100644
--- a/src/api/api.js
+++ b/src/api/api.js
@@ -17,9 +17,16 @@
 
 export function dataQuery_selectFields(params) {
   //璇锋眰鍦板潃
-  return request.get("/dataQuery/selectFields", { params: params });
+  return request.get("/dataQuery/selectTabFields", { params: params });
 }
 
+//鏁版嵁鏌ヨ=>涓嬭浇DB鏁版嵁
+export function dataQuery_downloadDbData(params) {
+  //璇锋眰鍦板潃
+  return request.post("/dataQuery/downloadDbData", params);
+}
+
+
 //鑾峰彇RSA鍔犲瘑鍏挜
 export function sign_getPublicKey(params) {
   //璇锋眰鍦板潃
diff --git a/src/assets/js/Map/config.js b/src/assets/js/Map/config.js
index 7eccce8..24aad91 100644
--- a/src/assets/js/Map/config.js
+++ b/src/assets/js/Map/config.js
@@ -1,5 +1,5 @@
 //鏄惁涓虹敓浜х幆澧�
-const isWeb = true;
+const isWeb = false;
 //鏄惁涓虹敓浜х幆澧�
 const webUrl = isWeb ? "/web" : "";
 //閰嶇疆鏂囦欢鍦板潃
diff --git a/src/assets/js/Map/index.js b/src/assets/js/Map/index.js
index 435747b..cd970c0 100644
--- a/src/assets/js/Map/index.js
+++ b/src/assets/js/Map/index.js
@@ -38,37 +38,14 @@
     sgworld.Creator.SimpleGraphic.edit(true, { editProp: true });
     //=======================
     window.Viewer.imageryLayers.removeAll();
+
     Viewer.animation.container.style.visibility = "hidden";
     Viewer.timeline.container.style.visibility = "hidden";
     //=======================
     //澶ф皵灞�
     Viewer.scene.globe.showGroundAtmosphere = false;
 
-    // server.AddDemLayer("", 12316);
-    // server.AddTmsLayer(
-    //   "http://172.16.2.10:50001/sj_raster/v6/service/10003901/1"
-    // );
 
-    // var param = {
-    //     name: labelName,
-    //     id: earthCtrl.factory.createUUID(),
-    //     text: "鏂囧瓧宸ュ叿",
-    //     font: '50pt monospace',
-    //     outlineWidth: 2,
-    //     fillColor: SmartEarth.Cesium.Color.RED,
-    //     lon: 47.5087,
-    //     lat: 23.6963,
-    //     alt: 10
-    // };
-    // labelEntity = earthCtrl.factory.createLabel(param);
-
-    // server.AddTmsLayer('http://localhost:8080/abc');
-
-    // earthCtrl.camera.flyTo(47.5087, 23.6963, 300, 9.5, -45, 0.0, 5);
-
-    // //娣诲姞榧犳爣宸﹀嚮浜嬩欢
-    // this.addMouseLeftClickEvents();
-    // this.addMouseMouseMoveEvents();
   },
   //榧犳爣宸﹂敭鐐瑰嚮浜嬩欢娣诲姞
   addMouseLeftClickEvents() {
diff --git a/src/assets/js/Map/menuTool.js b/src/assets/js/Map/menuTool.js
index ab1bf1d..a54952e 100644
--- a/src/assets/js/Map/menuTool.js
+++ b/src/assets/js/Map/menuTool.js
@@ -3,7 +3,8 @@
 import rightServer from "./rightServer";
 import config from "./config";
 import CryptoJS from "crypto-js";
-
+// import { Store } from "vuex";
+import store from "@/store";
 const menuTool = {
   toolMenu: null,
   toolFlag: null,
@@ -355,34 +356,7 @@
       destination: Cesium.Rectangle.fromDegrees(west, south, east, north),
     });
 
-    // var e = Viewer.entities.add({
-    //   name: "姝f柟",
-    //   polygon: {
-    //     hierarchy: geometry1,
-    //     //height : 100000,
-    //     material: Cesium.Color.RED,
-    //     outline: true,
-    //     outlineColor: Cesium.Color.RED,
-    //   },
-    // });
-    // const stripeMaterial = new Cesium.StripeMaterialProperty({
-    //   evenColor: Cesium.Color.WHITE.withAlpha(0.5),
-    //   oddColor: Cesium.Color.BLUE.withAlpha(0.5),
-    //   repeat: 5.0,
-    // });
-    // var e = Viewer.entities.add({
-    //   rectangle: {
-    //     coordinates: geometry,
-    //     outline: true,
-    //     outlineColor: Cesium.Color.WHITE,
-    //     outlineWidth: 4,
-    //     stRotation: Cesium.Math.toRadians(45),
-    //     material: stripeMaterial,
-    //   },
-    // });
-    // this.squareOjb.push(e);
-    // // earthCtrl.Creator.SimpleGraphic.clear();
-    // Viewer.entities.remove(entity);
+
 
     setTimeout(() => {
       window.functionForJs({
@@ -421,6 +395,8 @@
       window.DoubleScreen = null;
       const compass = document.getElementsByClassName("bottom_btn")[0];
       compass.style.right = "70px";
+      store.state.doubleMap = false;
+      store.state.doubleMenu = false;
       return;
     }
     window.DoubleScreen = new SmartEarth.DoubleScreen(
@@ -428,18 +404,23 @@
       {},
       SmartEarth
     );
-    DoubleScreen.right._Viewer.imageryLayers.removeAll();
-    var terrain = new Cesium.CesiumTerrainProvider({
-      url: config.moonTerrain,
-      tilingScheme: new Cesium.GeographicTilingScheme({
-        ellipsoid: Cesium.Ellipsoid.MOON,
-      }),
-    });
-    DoubleScreen.right._Viewer.terrainProvider = terrain;
-    rightServer.AddWmtesLayer(config.moonWmts);
-
+    window.rightViewer = DoubleScreen.right._Viewer;
+    window.rightViewer.imageryLayers.removeAll();
+    window.rightViewer = DoubleScreen.right._Viewer;
+    window.rightViewer.animation.container.style.visibility = "hidden";
+    // window.rightViewer.timeline.container.style.visibility = "hidden";
+    //澶ф皵灞�
+    window.rightViewer.scene.globe.showGroundAtmosphere = false;
+    window.rightViewer.scene.skyAtmosphere.show = false;
     const compass = document.getElementsByClassName("bottom_btn")[0];
     compass.style.right = "calc(50% + 70px)";
+    store.state.doubleMap = true;
+    setTimeout(() => {
+      window.functionGetLayer({
+        type: "getlayer",
+        value: true,
+      });
+    }, 100);
   },
   //鍦熸柟閲忚绠�
   Volumetric() {
@@ -551,5 +532,101 @@
     earthCtrl.analysis.deleteObject();
   },
   clearLeftTools(res) { },
+  //绌洪棿鏌ヨ灞炴�у畾浣�
+  spaceLocation(res) {
+    var name = '绌洪棿鏌ヨ';
+    debugger
+    this.setClearLocation(name);
+    switch (res.type) {
+      case 'MultiPolygon':
+        for (var i in res.coordinates) {
+          this.setLocationPolygon(res.coordinates[i], name)
+        }
+        break;
+      case 'MultiLineString':
+        for (var i in res.coordinates) {
+          this.setLocationLine(res.coordinates[i], name)
+        }
+        break;
+      case 'Point':
+        this.setLocationPoint(res.coordinates, name)
+        break;
+    }
+  },
+  //娓呯┖涔嬪墠缁樺埗鍥惧舰
+  setClearLocation(res) {
+    for (var i = 0; i < window.Viewer.entities._entities._array.length; i++) {
+      if (window.Viewer.entities._entities._array[i].name == res) {
+        window.Viewer.entities.remove(window.Viewer.entities._entities._array[i])
+        i = i - 1;
+      }
+    }
+  },
+  setLocationPolygon(res, name) {
+    var position = [];
+    var geom = res[0]
+    for (var i in geom) {
+      position.push(geom[i][0], geom[i][1])
+    }
+    var locationPolygonEntity = window.Viewer.entities.add({
+      name: name,
+      polygon: {
+        hierarchy: { positions: Cesium.Cartesian3.fromDegreesArray(position) },
+        outline: true,
+        outlineWidth: 100,
+        arcType: Cesium.ArcType.RHUMB,
+        material: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.4),
+        outline: true, // height is required for outline to display
+        outlineColor: Cesium.Color.DODGERBLUE,
+      }
+    });
+    window.Viewer.flyTo(locationPolygonEntity, {
+      duration: 5,
+      offset: new SmartEarth.Cesium.HeadingPitchRange(0.0, SmartEarth.Cesium.Math.toRadians(-20.0))
+    });
+  },
+  setLocationPoint(res, name) {
+    const position = window.Viewer.entities.add({
+      name: name,
+      position: Cesium.Cartesian3.fromDegrees(res[0], res[1]),
+      billboard: {
+        image: config.StaticFileBaseUrl + '/Workers/image/location.png',
+        // 璁剧疆璐村湴
+        heightReference: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.4),
+        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+        scale: 5.0,
+      },
+    });
+    window.Viewer.flyTo(position, {
+      duration: 5,
+      offset: new SmartEarth.Cesium.HeadingPitchRange(0.0, SmartEarth.Cesium.Math.toRadians(-20.0))
+    });
+  },
+  setLocationLine(res, name) {
+    var position = [];
+
+    for (var i in res) {
+      position.push(res[i][0], res[i][1])
+    }
+    var polyline = window.Viewer.entities.add({
+      name: name,
+      polyline: {
+        positions: Cesium.Cartesian3.fromDegreesArray(position),
+        width: 10.0,
+        material: new Cesium.PolylineOutlineMaterialProperty({
+          color: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.4),
+          outlineWidth: 1,
+          outlineColor: Cesium.Color.CORNFLOWERBLUE,
+        }),
+        clampToGround: true,
+
+      },
+    })
+    window.Viewer.flyTo(polyline, {
+      duration: 5,
+      offset: new SmartEarth.Cesium.HeadingPitchRange(0.0, SmartEarth.Cesium.Math.toRadians(-20.0))
+    });
+  }
+
 };
 export default menuTool;
diff --git a/src/assets/js/Map/rightServer.js b/src/assets/js/Map/rightServer.js
index 9e8fa6c..4c85743 100644
--- a/src/assets/js/Map/rightServer.js
+++ b/src/assets/js/Map/rightServer.js
@@ -1,7 +1,196 @@
-const rightServer = {
+import { getToken } from "@/utils/auth";
+//閰嶇疆鏂囦欢鍦板潃
+import config from "./config";
 
-    AddWmtesLayer(url) {
-        var urlTemplateImageryProvider = DoubleScreen.right.factory.createImageryLayer({
+const rightServer = {
+    layerList: [],
+    addTreeData(treeNode) {
+        if (!treeNode.checked) {
+            this.delLayer(treeNode.id);
+            return;
+        }
+        //鍒ゆ柇鏄惁涓轰唬鐞�
+        if (treeNode.proxy) {
+            this.addProxyAddress(treeNode); //鏈変唬鐞�
+        } else {
+            this.addUrlAddress(treeNode); //鏃犱唬鐞�
+        }
+    },
+    //浠g悊鍦板潃
+    addProxyAddress(res) {
+        //鍒ゆ柇鏁版嵁绫诲瀷
+        switch (res.data) {
+            case 1: //鏁板瓧姝e皠褰卞儚鍥�
+                this.setDataType(res);
+                break;
+            case 2: //鍦烘櫙鍦板舰鏁版嵁
+                this.setTerrainData(res);
+                break;
+            case 3: //鏁板瓧楂樼▼妯″瀷锛堟檿娓插浘锛�
+                this.setDataType(res);
+                break;
+            case 4: //鍗曟尝娈垫爡鏍兼暟鎹�
+                this.setDataType(res);
+                break;
+            case 5: //澶氬厜璋辨爡鏍兼暟鎹�
+                this.setDataType(res);
+                break;
+            case 6: //楂樺厜璋辨爡鏍兼暟鎹�
+                this.setDataType(res);
+                break;
+            case 7: //鐭㈤噺鍥惧眰
+                this.setVectorData(res);
+                break;
+            case 8: //涓夌淮妯″瀷
+                this.setModelData(res);
+                break;
+        }
+    },
+    //鏅�氬湴鍧�
+    addUrlAddress(res) {
+        switch (res.category) {
+            case 0: //鍏朵粬
+                break;
+            case 1: //GisServer
+                this.addProxyAddress(res);
+                break;
+            case 2: //GeoServer
+                this.addGeoServerAddress(res);
+                break;
+            case 3: //鏁扮畝
+                this.addProxyAddress(res);
+                break;
+        }
+    },
+    //Geoserver鏈嶅姟
+    addGeoServerAddress(res) {
+        //鍒ゆ柇鏁版嵁绫诲瀷
+        switch (res.data) {
+            case 1: //鏁板瓧姝e皠褰卞儚鍥�
+                this.setGeoDataType(res);
+                break;
+            case 2: //鍦烘櫙鍦板舰鏁版嵁
+                this.setTerrainData(res);
+                break;
+            case 3: //鏁板瓧楂樼▼妯″瀷锛堟檿娓插浘锛�
+                this.setGeoDataType(res);
+                break;
+            case 4: //鍗曟尝娈垫爡鏍兼暟鎹�
+                this.setGeoDataType(res);
+                break;
+            case 5: //澶氬厜璋辨爡鏍兼暟鎹�
+                this.setGeoDataType(res);
+                break;
+            case 6: //楂樺厜璋辨爡鏍兼暟鎹�
+                this.setGeoDataType(res);
+                break;
+            case 7: //鐭㈤噺鍥惧眰
+                this.setGeoVectorData(res);
+                break;
+            case 8: //涓夌淮妯″瀷
+                this.setModelData(res);
+                break;
+        }
+    },
+    setGeoDataType(res) {
+        switch (res.type) {
+            case 0: //URL
+                break;
+            case 1: //TMS
+                this.setAddTmsLayer(res);
+                break;
+            case 2: //WMTS
+                this.setAddWmtsLayer(res);
+                break;
+            case 3: //WMS
+                this.setAddGeoWmsLayer(res);
+                break;
+        }
+    },
+    setGeoVectorData(res) {
+        switch (res.type) {
+            case 0: //URL
+                break;
+            case 3: //WMS
+                this.setAddGeoWmsLayer(res);
+                break;
+            case 4: //WFS
+                break;
+        }
+    },
+    setDataType(res) {
+        switch (res.type) {
+            case 0: //URL
+                break;
+            case 1: //TMS
+                this.setAddTmsLayer(res);
+                break;
+            case 2: //WMTS
+                this.setAddWmtsLayer(res);
+                break;
+            case 3: //WMS
+                this.setAddWmsLayer(res);
+                break;
+        }
+    },
+
+    setTerrainData(res) {
+        switch (res.type) {
+            case 0: //URL
+                this.setAddTearrinLayer(res);
+                break;
+            case 1: //TMS
+                this.setAddTearrinLayer(res);
+                break;
+        }
+    },
+    setVectorData(res) {
+        switch (res.type) {
+            case 0: //URL
+                break;
+            case 3: //WMS
+                this.setAddWmsLayer(res);
+                break;
+            case 4: //WFS
+                break;
+        }
+    },
+    setModelData(res) {
+        switch (res.type) {
+            case 0: //Tileset
+                this.setAddModelLayer(res);
+                break;
+            case 3: //WMS
+                this.setAddModelLayer(res);
+                break;
+            case 5: //WFS
+                break;
+        }
+    },
+    //鑾峰彇鏈嶅姟鍦板潃
+    getLayrUrl(res) {
+        var url;
+        if (res.proxy) {
+            const token = getToken();
+            url = config.proxy + res.proxy.replaceAll("{token}", token);
+        } else {
+            url = res.url;
+        }
+        return url;
+    },
+    //鍔犺浇TMS鏈嶅姟
+    setAddTmsLayer(res) {
+        var url = this.getLayrUrl(res);
+        var urlTemplateImageryProvider = new Cesium.UrlTemplateImageryProvider({
+            url: url + '/{z}/{x}/{reverseY}.png',
+        });
+        let img_layer = window.rightViewer.imageryLayers.addImageryProvider(urlTemplateImageryProvider);
+        this.layerList.push({ id: res.id, layerData: img_layer, type: "tms" });
+    },
+    //鍔犺浇WMTS鏈嶅姟
+    setAddWmtsLayer(res) {
+        var url = this.getLayrUrl(res);
+        var urlTemplateImageryProvider = new Cesium.WebMapTileServiceImageryProvider({
             sourceType: "wmts",
             url: url,
             layer: "",
@@ -33,9 +222,136 @@
                 ellipsoid: Cesium.Ellipsoid.MOON,
             }),
         });
+        let img_layer = window.rightViewer.imageryLayers.addImageryProvider(urlTemplateImageryProvider);
+        this.layerList.push({
+            id: res.id,
+            layerData: img_layer,
+            type: "wmts",
+        });
+    },
+    //鍔犺浇鍦板舰鏈嶅姟
+    setAddTearrinLayer(res) {
+        this.setChangeTearrinLayer();
+        var url = this.getLayrUrl(res);
+        window.terrainLayer = new Cesium.CesiumTerrainProvider({
+            url: url,
+        });
+        window.rightViewer.terrainProvider = window.terrainLayer;
+        this.layerList.push({ id: res.id, type: "dem" });
+    },
+    //鍔犺浇WMS鏈嶅姟
+    setAddWmsLayer(res) {
+        var url = this.getLayrUrl(res);
+        var img_layer = window.rightViewer.createImageryProvider(
+            "giserver",
+            "wms",
+            {
+                url: url,
+                layers: "",
+                parameters: {
+                    format: "image/png",
+                    transparent: true,
+                },
+            },
+            "0",
+            undefined,
+            true,
+            ""
+        );
+        this.layerList.push({
+            id: res.id,
+            layerData: img_layer,
+            type: "wmts",
+        });
+    },
+    //鍔犺浇妯″瀷鏈嶅姟
+    setAddModelLayer(res) {
+        var url = this.getLayrUrl(res);
+        let tileset = window.rightViewer.scene.primitives.add(
+            new Cesium.Cesium3DTileset({
+                name: res.cnName,
+                url: url,
+                skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false
+                baseScreenSpaceError: 1024,
+                maximumScreenSpaceError: 64, // 鏈�澶у睆骞曠┖闂撮敊璇細16锛屾暟鍊煎姞澶ц兘璁╂渶缁堟垚鍍忓彉妯$硦
+                skipScreenSpaceErrorFactor: 16,
+                skipLevels: 1,
+                immediatelyLoadDesiredLevelOfDetail: false,
+                loadSiblings: true, // 鑷姩浠庝腑蹇冨紑濮嬭秴娓呭寲妯″瀷锛歠alse
+                cullWithChildrenBounds: true, // 浣跨敤瀛愰」杈圭晫浣撶Н鐨勫苟闆嗘潵鍓旈櫎鍥惧潡锛歵rue
+                cullRequestsWhileMoving: true,
+                cullRequestsWhileMovingMultiplier: 10, // 鍊艰秺灏忚兘澶熸洿蹇殑鍓旈櫎锛�60
+                preloadWhenHidden: true,
+                preferLeaves: true, // 棰勮瀛愯妭鐐癸細false
+                maximumMemoryUsage: 768, // 鍐呭瓨鍒嗛厤鍙樺皬鏈夊埄浜庡唴瀛樺洖鏀讹紝鎻愬崌鎬ц兘浣撻獙
+                progressiveResolutionHeightFraction: 0.5, // 鏁板�煎亸浜�0鑳藉璁╁垵濮嬪姞杞藉彉寰楁ā绯�
+                dynamicScreenSpaceErrorDensity: 0.5, // 鏁板�煎姞澶э紝鑳借鍛ㄨ竟鍔犺浇鍙樺揩
+                dynamicScreenSpaceErrorFactor: 2, // 鍔ㄦ�佸睆骞曠┖闂磋宸殑绯绘暟
+                dynamicScreenSpaceError: true, // 鍑忓皯绂荤浉鏈鸿緝杩滅殑灞忓箷绌洪棿閿欒锛歠alse锛屽叏灞忓姞杞藉畬涔嬪悗鎵嶆竻鏅板寲鎴垮眿
+            })
+        );
+        tileset.readyPromise.then((tileset) => {
+            tileset.id = res.id;
+        });
+        this.layerList.push({ id: res.id, layerData: tileset, type: "tileset" });
+    },
+    //鍦板舰绉婚櫎浜嬩欢
+    setChangeTearrinLayer() {
+        this.layerList.forEach((e, i) => {
+            switch (e.type) {
+                case "dem":
+                    window.rightViewer.terrainProvider = new Cesium.EllipsoidTerrainProvider(
+                        {}
+                    );
+                    this.layerList.splice(i, 1);
+                    break;
+            }
+        });
     },
 
+    //娓呴櫎鍥惧眰
+    delLayer(code) {
+        this.layerList.forEach((e, i) => {
+            if (e.id === code) {
+                switch (e.type) {
+                    case "wmts":
+                        window.rightViewer.imageryLayers.remove(e.layerData);
+                        break;
+                    case "tms":
+                        window.rightViewer.imageryLayers.remove(e.layerData);
+                        break;
+                    case "dem":
+                        window.rightViewer.terrainProvider = new Cesium.EllipsoidTerrainProvider(
+                            {}
+                        );
+                        break;
+                    case "tileset":
+                        window.rightViewer.scene.primitives.remove(e.layerData)
+                        break;
+                }
+                this.layerList.splice(i, 1);
+            }
+        });
+    },
+    //鍔犺浇GeoServer-WMS鏈嶅姟
+    setAddGeoWmsLayer(res) {
+        var url = this.getLayrUrl(res);
+        let layer = new SmartEarth.Cesium.WebMapServiceImageryProvider({
+            url: url,
+            layers: res.tab,
+            parameters: {
+                transparent: true,
+                format: "image/png",
+                srs: "EPSG:104903",
+                styles: "",
+            },
+            tileWidth: 512,
+            tileHeight: 512,
+        });
+        layer.name = `Wms_Layer${res.id}`;
 
-
-}
-export default rightServer;
\ No newline at end of file
+        let img_layer = window.rightViewer.imageryLayers.addImageryProvider(layer);
+        this.layerList.push({ id: res.id, layerData: img_layer, type: "wmts" });
+    },
+};
+export default rightServer;
diff --git a/src/store/index.ts b/src/store/index.ts
index eefdfec..e9a5441 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -18,6 +18,9 @@
     },
     chekNowLayers: [],
     exportImgUrl: "",
+    tab: null,
+    doubleMap: false,
+    doubleMenu: false,
   },
   mutations: {
     //鑾峰彇鐧诲綍Code
diff --git a/src/views/Index.vue b/src/views/Index.vue
index b0ce0ad..0cb8b40 100644
--- a/src/views/Index.vue
+++ b/src/views/Index.vue
@@ -1,6 +1,8 @@
 <template>
   <div class="body_box">
-    <div id="cesiumContainer"></div>
+    <div id="cesiumContainer">
+
+    </div>
     <export-map
       v-if="layerExportshow"
       @SETexportMap="SETexportMap"
diff --git a/src/views/layer/attributeList.vue b/src/views/layer/attributeList.vue
index 94f8652..f72f371 100644
--- a/src/views/layer/attributeList.vue
+++ b/src/views/layer/attributeList.vue
@@ -1,15 +1,69 @@
 <template>
-  <div v-drag="true" class="spatialBox">
+  <div
+    v-drag="true"
+    class="spatialBox"
+  >
     <!--     v-resizable="'right, bottom'" -->
     <div class="spatialTitle">
       <label>灞炴��</label>
-      <el-icon @click="setSpatialClose" :size="20" style="cursor: pointer">
+      <el-icon
+        @click="setSpatialClose"
+        :size="20"
+        style="cursor: pointer"
+      >
         <Close />
       </el-icon>
     </div>
     <div class="spatialContent">
+      <div>
+        <el-row :gutter="20">
+          <el-col :span="16">
+            <el-input
+              v-model="listData.filter"
+              type="text"
+              placeholder="璇烽�夋嫨..."
+              disabled
+            />
+          </el-col>
+          <el-col :span="8">
+            <el-button
+              :icon="Plus"
+              type="success"
+              @click="dialogVisible = true"
+            >楂樼骇鏌ヨ</el-button>
+            <el-button
+              :icon="Refresh"
+              type="info"
+              @click="setdialogRefresh"
+            >閲嶇疆</el-button>
+          </el-col>
+        </el-row>
+      </div>
       <div class="spatialTable">
-        <el-table :data="tableData" style="width: 100%; height: 82%">
+        <el-table
+          :data="tableData"
+          style="width: 100%; height: 75%"
+        >
+          <el-table-column
+            align="center"
+            type="index"
+            label="搴忓彿"
+            width="70"
+          />
+          <el-table-column
+            label="瀹氫綅"
+            width="100"
+            align="center"
+          >
+            <template #default="scope">
+              <el-button
+                :icon="Location"
+                size="small"
+                @click.prevent="spaceLocation(scope.$index, scope.row)"
+              >
+              </el-button>
+            </template>
+          </el-table-column>
           <el-table-column
             v-for="(item, index) in attributeData"
             :key="index"
@@ -18,7 +72,7 @@
             show-overflow-tooltip
             align="center"
             :fit="true"
-            width="120"
+            min-width="120"
           ></el-table-column>
         </el-table>
         <div class="spatialBottom">
@@ -36,6 +90,63 @@
         </div>
       </div>
     </div>
+    <!-- 楂樼骇鏌ヨ -->
+    <el-dialog
+      v-model="dialogVisible"
+      title="楂樼骇鏌ヨ"
+      width="30%"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <div>
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-select
+              v-model="formSql.field"
+              class="m-2"
+              placeholder="Select"
+              @change="setFieldChange($event)"
+            >
+              <el-option
+                v-for="item in fieldOption"
+                :key="item.field"
+                :label="item.alias"
+                :value="item.field"
+              />
+            </el-select>
+          </el-col>
+          <el-col :span="8">
+            <el-select
+              v-model="formSql.type"
+              class="m-2"
+              placeholder="Select"
+            >
+              <el-option
+                v-for="item in condOption"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-col>
+          <el-col :span="8">
+            <el-input v-model="formSql.value"></el-input>
+          </el-col>
+
+        </el-row>
+
+      </div>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+          <el-button
+            type="primary"
+            @click="setInsertDialog"
+          > 娣诲姞 </el-button>
+        </span>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -51,13 +162,15 @@
   watch,
 } from "vue";
 import config from "@/assets/js/Map/config";
-import { User, Lock, Plus } from "@element-plus/icons-vue";
+import { User, Lock, Plus, Location } from "@element-plus/icons-vue";
 import { dataQuery_selectByPage, dataQuery_selectFields } from "@/api/api";
 import { ElMessage } from "element-plus";
 import store from "@/store";
-
+import menuTool from "@/assets/js/Map/menuTool";
+import WKT from "terraformer-wkt-parser";
 const emits = defineEmits(["spatialClose"]);
 const setSpatialClose = () => {
+  menuTool.setClearLocation("绌洪棿鏌ヨ");
   emits("spatialClose", false);
 };
 const dialogVisible = ref(false);
@@ -67,7 +180,7 @@
   count: 0,
   wkt: null,
   hasGeom: 1,
-
+  filter: "",
   name: "",
 });
 const condOption = ref([]);
@@ -80,12 +193,26 @@
   value: "",
   cut: "",
 });
+//瀹氫綅鏄剧ず
+const spaceLocation = (index, row) => {
+  var geom = menuTool.decr(row.geom);
 
+  var wkt = WKT.parse(geom);
+  menuTool.spaceLocation(wkt);
+};
 //defineProps 鏉ユ帴鏀剁粍浠剁殑浼犲��
 const props = defineProps({
   layerData: Object,
 });
+const setdialogRefresh = () => {
+  listData.value.filter = "";
+  listData.value.pageIndex = 1;
+  listData.value.pageSize = 10;
 
+  var res = attributeData.value[0];
+  conditionChange(res);
+  setQueySpatialData();
+};
 const handleSizeChange = (res) => {
   listData.value.pageSize = res;
   setQueySpatialData();
@@ -97,6 +224,7 @@
 
 //鏌ヨ鍒楄〃鏁版嵁
 const setQueySpatialData = async () => {
+  listData.value.name = listData.value.name.replaceAll("_", "");
   const data = await dataQuery_selectByPage(listData.value);
   if (data.code != 200) {
     return ElMessage.error("绌洪棿鏌ヨ澶辫触");
@@ -106,22 +234,61 @@
 };
 
 const setQueySpatialFields = async () => {
-  const data = await dataQuery_selectFields({ name: listData.value.name });
+  const data = await dataQuery_selectFields({
+    ns: "mn",
+    tab: listData.value.name,
+  });
   if (data.code != 200) {
     return ElMessage.error("瀛楁鏌ヨ澶辫触");
   }
-
-  attributeData.value = data.result;
-
+  var std = data.result.filter((res) => {
+    if (res.showtype > 0) {
+      return res;
+    }
+  });
+  attributeData.value = std;
+  fieldOption.value = std;
   conditionChange(data.result[0]);
   setQueySpatialData();
 };
+const setInsertDialog = () => {
+  if (!formSql.value.value) {
+    return ElMessage.error("璇疯緭鍏ヨ鏌ヨ鐨勫弬鏁�");
+  }
+  dialogVisible.value = false;
+  if (listData.value.filter != "") {
+    listData.value.filter += " and ";
+  }
+  const val = null;
+  if (formSql.value.cut === "long" || formSql.value.cut === "integer") {
+    val = parseInt(formSql.value.value);
+  } else if (formSql.value.cut === "double") {
+    if (formSql.value.value.indexOf(".") != -1) {
+      val = parseInt(formSql.value.value);
+    } else {
+      val = parseFloat(formSql.value.value).toFixed(1);
+    }
+  } else if (formSql.value.cut == "date" || formSql.value.cut == "datetime") {
+    var time = new Date(formSql.value.value);
+    var m = time.getMonth() + 1;
+    var d = time.getDate();
+    var y = time.getFullYear();
+    val = "'" + y + "-" + add0(m) + "-" + add0(d) + "'";
+  } else {
+    val = "'" + formSql.value.value + "'";
+  }
+  listData.value.filter +=
+    formSql.value.field + " " + formSql.value.type + " " + val;
 
+  var res = attributeData.value[0];
+  conditionChange(res);
+  setQueySpatialData();
+};
 const conditionChange = (res) => {
+  formSql.value.value = "";
   formSql.value.field = res.field;
   formSql.value.cut = res.type;
-  const type = res.type;
-
+  var type = res.type;
   var std = [];
   if (type == "text" || type == "blob") {
     std = config.conditions[0];
@@ -137,17 +304,20 @@
       value: std[i],
     });
   }
+  debugger;
   condOption.value = str;
   formSql.value.type = std[0];
 };
 
 //椤甸潰鍒濆鍖�
 const startQueryData = () => {
-  listData.value.wkt = store.state.spatialQueryData.wkt;
-  listData.value.name = "lunarplacenane";
-  listData.value.hasGeom = 1;
-  //
-  setQueySpatialFields();
+  if (store.state.tab) {
+    listData.value.wkt = "";
+    listData.value.name = store.state.tab.tab.replaceAll("moon:", "");
+    listData.value.hasGeom = 1;
+
+    setQueySpatialFields();
+  }
 };
 
 watch(
@@ -158,7 +328,9 @@
   },
   { deep: true }
 );
-onMounted(() => {});
+onMounted(() => {
+  startQueryData();
+});
 </script>
 
 <style lang="less" scoped>
diff --git a/src/views/layer/doubleLayer.vue b/src/views/layer/doubleLayer.vue
new file mode 100644
index 0000000..e53d589
--- /dev/null
+++ b/src/views/layer/doubleLayer.vue
@@ -0,0 +1,473 @@
+<template>
+  <div
+    v-drag
+    class="layerBox"
+  >
+    <div class="layerTitle">
+      <div class="tileLeft">
+        <div
+          @click="setCloseLayer"
+          class="titleImg"
+        >
+          <ArrowLeft />
+        </div>
+        <div class="titleLable">鍥惧眰绠$悊</div>
+      </div>
+      <!-- <div
+        class="titleImg set"
+        @click="layerSetBox"
+      >
+        <Setting />
+      </div> -->
+    </div>
+    <div class="layerContent">
+      <el-tree
+        node-key="id"
+        :props="props"
+        :highlight-current="false"
+        :current-node-key="selectedNodeId"
+        :data="treeData"
+        :expand-on-click-node="false"
+        show-checkbox
+        @check="handleCheckChange"
+        ref="estreeRef"
+        v-if="treeData.length"
+        :default-checked-keys="DefaultId"
+      >
+        <template #default="{ node, data }">
+          <span class="custom-tree-node">
+            <span class="label">{{ node.label }}</span>
+            <!-- <span>
+              <a @click="append(data)"> Append </a>
+              <a style="margin-left: 8px" @click="remove(node, data)">
+                Delete
+              </a>
+            </span> -->
+            <span
+              class="button"
+              v-if="data.isLayer == 1"
+            >
+              <el-dropdown trigger="click">
+                <span class="el-dropdown-link">
+                  <el-icon class="el-icon--right">
+                    <MoreFilled />
+                  </el-icon>
+                </span>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item @click.native="clickdropdown(1, data)">璇︾粏</el-dropdown-item>
+                    <el-dropdown-item
+                      v-if="data.type == 3"
+                      @click.native="clickdropdown(2, data)"
+                    >灞炴��</el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </span>
+          </span>
+        </template>
+      </el-tree>
+    </div>
+  </div>
+  <layer-set
+    v-if="layerSetIsshow"
+    @SETstate="SETstate"
+    :layerTree="treeData"
+    @addlayer="addlayer"
+    @delLayer="delLayer"
+  ></layer-set>
+  <attribute-list
+    v-if="layerAttributeIsshow"
+    :layerData="layerObjData"
+    @spatialClose="setSpatialClose"
+  ></attribute-list>
+  <layer-detail
+    :layerData="layerObjData"
+    v-if="layerDetailIsshow"
+    @detailClose="detailClose"
+  ></layer-detail>
+</template>
+
+<script lang="ts" setup>
+import {
+  ref,
+  onMounted,
+  onBeforeUnmount,
+  reactive,
+  defineProps,
+  defineEmits,
+  nextTick,
+} from "vue";
+import layerSet from "./layerSet";
+import attributeList from "./attributeList";
+import layerDetail from "./layerDetail";
+import { useStore } from "vuex"; // 寮曞叆useStore 鏂规硶
+import { perms_selectLayers } from "@/api/api";
+import rightServer from "@/assets/js/Map/rightServer";
+import { ElMessage } from "element-plus";
+const store = useStore(); // 璇ユ柟娉曠敤浜庤繑鍥瀞tore 瀹炰緥
+const stretchValue = ref("");
+
+let estreeRef = ref();
+
+const transparence = ref(0);
+var treeData = ref([]);
+var layerListData = ref([]);
+let menuOption = reactive([]);
+
+const layerSetIsshow = ref(false);
+const layerAttributeIsshow = ref(false);
+const layerDetailIsshow = ref(false);
+const props = {
+  label: "cnName",
+  children: "children",
+};
+const layerObjData = ref(null);
+// 褰撳墠閫変腑鐨勮妭鐐� id
+const selectedNodeId = ref(null as any); //鍋氱被鍨嬫柇瑷�澶勭悊
+const emits = defineEmits(["setDobuleCloseLayer"]);
+//榛樿閫変腑id
+const DefaultId = ref([]);
+//鍥惧眰璁剧疆寮规
+const layerSetBox = () => {
+  layerSetIsshow.value = !layerSetIsshow.value;
+};
+//鍏抽棴鐘舵��
+const SETstate = (res) => {
+  layerSetIsshow.value = res;
+};
+const setCloseLayer = () => {
+  store.state.doubleMenu = true;
+  store.state.doubleMap = false;
+};
+//閫夋嫨鍥惧眰
+const handleCheckChange = (data, checked) => {
+  layerAttributeIsshow.value = false;
+  layerDetailIsshow.value = false;
+
+  let isCheck = checked.checkedKeys.indexOf(data.id) > -1;
+  // this.setVisiable(data, isCheck);
+
+  let son = estreeRef.value.getCheckedNodes();
+
+  store.commit("SET_CHECKLAYER", son);
+  setVisiable(data, isCheck);
+
+  // server.addLayer(layerArr, isCheck);
+};
+const setVisiable = (treeNode, checked) => {
+  if (checked !== undefined) {
+    treeNode.checked = checked;
+  } else {
+    treeNode.checked = !treeNode.checked;
+  }
+
+  if (treeNode.children) {
+    treeNode.children.forEach((item) => {
+      setVisiable(item, treeNode.checked);
+    });
+    return;
+  }
+
+  if (!treeNode.isAdd) {
+    rightServer.addTreeData(treeNode);
+    return;
+  }
+};
+const defaultLayer = (val) => {
+  val.forEach((e) => {
+    DefaultId.value.forEach((v) => {
+      if (e.id == v) {
+        setVisiable(e, true);
+        // return;
+      }
+    });
+  });
+};
+const clickdropdown = (res, e) => {
+  layerAttributeIsshow.value = false;
+  layerDetailIsshow.value = false;
+  layerObjData.value = e;
+
+  if (res == 2) {
+    layerAttributeIsshow.value = true;
+    store.state.tab = e;
+  } else {
+    if (!e.checked) {
+      return ElMessage.error("璇峰厛鍕鹃�夊浘灞�");
+    }
+    layerDetailIsshow.value = true;
+  }
+};
+const setSpatialClose = (res) => {
+  layerAttributeIsshow.value = res;
+};
+const detailClose = (res) => {
+  layerDetailIsshow.value = res;
+};
+//缂栬緫鍥惧眰鏍�
+const addlayer = (res) => {
+  let node;
+  layerListData.value.forEach((e) => {
+    if (e.id == res.id) {
+      node = estreeRef.value.getNode(e);
+    }
+  });
+  // 灏嗗彉鍔ㄤ箣鍓嶇殑node澶囦唤
+  let copyNode = { ...node };
+  copyNode.previousSibling = { ...node.previousSibling };
+  copyNode.nextSibling = { ...node.nextSibling };
+  if (res.type === 1) {
+    // 涓婄Щ
+    if (node.previousSibling) {
+      // 鍒犻櫎鍘熷厛鐨刵ode
+      estreeRef.value.remove(node.data);
+      // 鎷垮埌copy鐨刵ode
+      // nodeData = CircularJSON.parse(window.sessionStorage.getItem("menuNode"));
+      // 澶嶅埗璇ode鍒版寚瀹氫綅缃�(鍙傛暟锛�1. 瑕佸鍔犵殑鑺傜偣鐨� data 2. 瑕佸鍔犵殑鑺傜偣鐨勫悗涓�涓妭鐐圭殑 data銆乲ey 鎴栬�� node)
+
+      estreeRef.value.insertBefore(
+        copyNode.data,
+        copyNode.previousSibling.data
+      );
+      // window.sessionStorage.removeItem("menuNode");
+    }
+  } else {
+    // 涓嬬Щ
+    if (node.nextSibling) {
+      estreeRef.value.remove(node.data);
+      estreeRef.value.insertAfter(copyNode.data, copyNode.nextSibling.data);
+    }
+  }
+};
+//鍒犻櫎鍥惧眰鏍�
+const delLayer = (res) => {
+  // menuOption = menuOption.filter((item) => {
+  //   return item.id != res;
+  // });
+  // treeData = handleTree(menuOption, "id", "pid", "children");
+};
+
+const getLayer = async () => {
+  const dt = await perms_selectLayers();
+  if (dt.code == 200) {
+    treeData.value = setTreeData(dt.result).sort(function (a, b) {
+      return a.sort - b.sort;
+    });
+    var std = [];
+    var terrainId = null;
+    dt.result.filter((res) => {
+      if (res.isLayer == 1 && res.status == 1) {
+        if (res.type == 1 && res.data == 2) {
+          if (!terrainId) {
+            terrainId = res.id;
+            std.push(res.id);
+          }
+        } else {
+          std.push(res.id);
+        }
+      }
+    });
+    DefaultId.value = std;
+
+    //娣诲姞榛樿閫変腑鍥惧眰
+    layerListData.value = dt.result;
+    defaultLayer(dt.result);
+    nextTick(() => {
+      let son = estreeRef.value.getCheckedNodes();
+
+      store.commit("SET_CHECKLAYER", son);
+    });
+  }
+};
+
+//鏋勯�犳爲
+function setTreeData(source) {
+  let cloneData = JSON.parse(JSON.stringify(source)); // 瀵规簮鏁版嵁娣卞害鍏嬮殕
+  return cloneData.filter((father) => {
+    // 寰幆鎵�鏈夐」
+    let branchArr = cloneData.filter((child) => father.id == child.pid);
+    if (branchArr.length > 0) {
+      branchArr.sort(function (a, b) {
+        return a.sort - b.sort;
+      });
+    }
+
+    branchArr.length > 0 ? (father.children = branchArr) : ""; // 缁欑埗绾ф坊鍔犱竴涓猚hildren灞炴�э紝骞惰祴鍊�
+    // 灞炰簬鍚屼竴瀵硅薄闂锛屼緥濡傦細浠� a=b銆乧=1 锛岀劧鍚庡啀浠� b.c=c 锛� 閭d箞 a.c=b.c=c=1 锛涘悓鐞嗭紝鍚庣画浠� c.d=2 ,閭d箞 a.c.d 涔熸槸=2锛�
+    // 鐢辨寰幆澶氭鍚庯紝灏辫兘褰㈡垚鐩稿簲鐨勬爲褰㈡暟鎹粨鏋�
+    return father.pid == 0; // 杩斿洖涓�绾ц彍鍗�
+  });
+}
+const functionGetLayer = (res) => {
+  getLayer();
+};
+onMounted(() => {
+  window.functionGetLayer = functionGetLayer;
+});
+</script>
+
+<style lang="less" scoped>
+.layerBox {
+  width: 359px;
+  height: 680px;
+  right: calc(50% - 370px);
+  top: 105px;
+  position: absolute;
+  z-index: 30;
+  background: rgba(7, 8, 14, 0.8);
+  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
+  .layerTitle {
+    width: calc(100% - 27px);
+    height: 42px;
+    background: #0e151f;
+    box-shadow: 0px 0px 6px 0px #080c13,
+      0px 14px 16px 0px rgba(38, 47, 71, 0.68);
+    display: flex;
+    justify-content: space-between;
+    padding-left: 7px;
+    padding-right: 20px;
+    color: white;
+    .tileLeft {
+      height: 100%;
+      display: flex;
+      align-items: center;
+
+      .titleLable {
+        font-size: 18px;
+        font-family: Source Han Sans CN;
+        font-weight: 400;
+        color: #ffffff;
+      }
+    }
+    .titleImg {
+      width: 20px;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      color: rgba(104, 156, 255, 1);
+    }
+    .set {
+      cursor: pointer;
+    }
+  }
+  .layerContent {
+    height: 625px;
+    padding: 0 8px;
+    overflow: auto;
+    overflow-y: auto;
+  }
+  .layerContent::-webkit-scrollbar {
+    width: 8px;
+  }
+  .layerContent::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    background: rgba(0, 0, 0, 0.2);
+  }
+  .layerContent::-webkit-scrollbar-track {
+    border-radius: 0;
+    background: rgba(0, 0, 0, 0);
+  }
+  .el-tree {
+    width: 100%;
+    overflow-y: auto;
+  }
+  .layerContent .el-tree-node__content {
+    overflow: hidden;
+  }
+
+  .layerContent .custom-tree-node {
+    overflow: hidden;
+    flex-shrink: 1;
+    flex-grow: 1;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 16px;
+    padding-right: 8px;
+  }
+
+  .layerContent .custom-tree-node .label {
+    flex-shrink: 1;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+
+  .layerContent .custom-tree-node .button {
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+}
+.dropdown_box {
+  position: relative;
+}
+
+/deep/.el-select-dropdown__item {
+  font-size: 12px !important;
+}
+.el-tree {
+  background: transparent;
+}
+/deep/ .el-tree-node {
+  background: #0d131d;
+  color: #ffffff;
+  font-size: 20px;
+  font-weight: 300;
+  margin-top: 3px;
+  padding: 8px;
+}
+/deep/ .el-tree-node:focus > .el-tree-node__content {
+  background: transparent;
+}
+/deep/ .el-tree-node__content:hover {
+  background: #0d131d;
+}
+/deep/ .el-tree-node__children {
+  background: #1e2a3d;
+  .el-tree-node {
+    background: #1e2a3d;
+    margin-top: 0;
+    padding: 4px;
+  }
+}
+/deep/
+  .el-tree--highlight-current
+  .el-tree-node.is-current
+  > .el-tree-node__content {
+  background: rgba(104, 156, 255, 0.5) !important;
+}
+.highlight {
+  background: rgba(104, 156, 255, 0.5) !important;
+}
+// .custom-tree-node {
+//   flex: 1;
+//   display: flex;
+//   align-items: center;
+//   justify-content: space-between;
+//   font-size: 16px;
+//   padding-right: 8px;
+// }
+
+.el-dropdown-menu {
+  background: rgba(7, 8, 14, 0.8);
+  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
+  color: #fff;
+  border: 0;
+  /deep/ .el-dropdown-menu__item {
+    color: #fff;
+  }
+}
+/deep/ .el-dropdown-menu__item:not(.is-disabled):focus {
+  background-color: rgba(104, 156, 255, 0.5);
+
+  color: #fff;
+}
+</style>
+<style>
+.el-popper.is-light {
+  border: 1px solid rgba(7, 8, 14, 0.8) !important;
+}
+.el-scrollbar {
+  border: 0 !important;
+}
+</style>
diff --git a/src/views/layer/layerManage.vue b/src/views/layer/layerManage.vue
index cbd1e91..08ec5d9 100644
--- a/src/views/layer/layerManage.vue
+++ b/src/views/layer/layerManage.vue
@@ -77,7 +77,7 @@
     @delLayer="delLayer"
   ></layer-set>
   <attribute-list
-    v-show="layerAttributeIsshow"
+    v-if="layerAttributeIsshow"
     :layerData="layerObjData"
     @spatialClose="setSpatialClose"
   ></attribute-list>
@@ -187,8 +187,10 @@
   layerAttributeIsshow.value = false;
   layerDetailIsshow.value = false;
   layerObjData.value = e;
+
   if (res == 2) {
     layerAttributeIsshow.value = true;
+    store.state.tab = e;
   } else {
     if (!e.checked) {
       return ElMessage.error("璇峰厛鍕鹃�夊浘灞�");
diff --git a/src/views/menus.vue b/src/views/menus.vue
index bb7a8e5..1add11b 100644
--- a/src/views/menus.vue
+++ b/src/views/menus.vue
@@ -1,10 +1,21 @@
 <template>
-  <div class="menus" v-show="fullScreen">
+  <div
+    class="menus"
+    v-show="fullScreen"
+  >
     <div class="logo_box">
-      <img src="../assets/img/logo.png" alt="" class="logo" />
+      <img
+        src="../assets/img/logo.png"
+        alt=""
+        class="logo"
+      />
       <div class="logo_name">
         <h3>鏈堢悆澶ф暟鎹湴鐞嗙┖闂村垎鏋愬睍绀哄钩鍙�</h3>
-        <img src="../assets/img/logob.png" alt="" class="logo_name_b" />
+        <img
+          src="../assets/img/logob.png"
+          alt=""
+          class="logo_name_b"
+        />
       </div>
     </div>
     <div class="menus_box">
@@ -29,7 +40,10 @@
       </div>
     </div>
   </div>
-  <div class="content_box" v-show="fullScreen">
+  <div
+    class="content_box"
+    v-show="fullScreen"
+  >
     <div
       v-show="checkMenuFlag == 'l1'"
       style="position: relative; display: flex"
@@ -46,10 +60,31 @@
     <search v-if="thematicMapBtnState"> </search>
   </div>
 
-  <top-btn v-show="fullScreen" v-if="thematicMapBtnState"></top-btn>
+  <top-btn
+    v-show="fullScreen"
+    v-if="thematicMapBtnState"
+  ></top-btn>
 
   <thematic-map v-show="!thematicMapBtnState"></thematic-map>
-  <div class="fullScreen_btn" v-show="!fullScreen" @click="screen"></div>
+  <div
+    class="fullScreen_btn"
+    v-show="!fullScreen"
+    @click="screen"
+  ></div>
+  <div
+    v-show="store.state.doubleMenu"
+    class="setDobuleMap"
+    @click="setDoubleScreenMap"
+  >
+    <Operation />
+  </div>
+  <div
+    @setDobuleCloseLayer="setDobuleCloseLayer"
+    v-show="store.state.doubleMap"
+  >
+    <double-layer></double-layer>
+  </div>
+
 </template>
 
 <script lang="ts" setup>
@@ -61,6 +96,7 @@
   defineProps,
   defineEmits,
 } from "vue";
+import { Operation } from "@element-plus/icons-vue";
 import menuData from "@/assets/js/Map/menuData";
 import menuTool from "@/assets/js/Map/menuTool";
 //椤堕儴鑿滃崟
@@ -75,11 +111,22 @@
 import plotting from "@/views/plotting/plotting.vue";
 //搴曞浘鍒囨崲
 import baseMapSwitching from "@/views/baseMapSwitching/baseMapSwitching.vue";
+//鍒嗗睆鑿滃崟
+import doubleLayer from "@/views/layer/doubleLayer.vue";
+import store from "@/store";
 const menuOptions = ref([]);
 const checkMenuFlag = ref("");
 let fullScreen = ref(true);
 let thematicMapState = ref(true);
 let thematicMapBtnState = ref(true);
+const setDoubleScreenMap = () => {
+  store.state.doubleMenu = false;
+  store.state.doubleMap = true;
+};
+const setDobuleCloseLayer = () => {
+  store.state.doubleMenu = true;
+  store.state.doubleMap = false;
+};
 const setMenuClick = (res) => {
   if (res.id == "l6") {
     // fullScreen.value = !fullScreen.value;
@@ -199,6 +246,18 @@
     }
   }
 }
+.setDobuleMap {
+  position: absolute;
+  top: 105px;
+  right: calc(50% - 50px);
+  z-index: 30;
+  width: 20px;
+  height: 20px;
+  color: #d6e4ff;
+  background: rgba(7, 8, 14, 0.8);
+  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
+  padding: 10px;
+}
 .menu_Image_box {
   height: 778px;
   width: 100%;
diff --git a/src/views/query/SpatialQuery.vue b/src/views/query/SpatialQuery.vue
index 91ee2cd..693c5ae 100644
--- a/src/views/query/SpatialQuery.vue
+++ b/src/views/query/SpatialQuery.vue
@@ -6,12 +6,22 @@
     <!--     v-resizable="'right, bottom'" -->
     <div class="spatialTitle">
       <label>绌洪棿鏌ヨ</label>
-      <el-icon
-        @click="setSpatialClose"
-        :size="20"
-      >
-        <Close />
-      </el-icon>
+      <div>
+        <el-icon
+          @click="setSpatialDownload"
+          :size="20"
+          style="margin-right: 20px;"
+        >
+          <Download />
+        </el-icon>
+        <el-icon
+          @click="setSpatialClose"
+          :size="20"
+        >
+          <Close />
+        </el-icon>
+
+      </div>
     </div>
     <div class="spatialContentBox">
       <div class="spatialMenu">
@@ -54,6 +64,26 @@
             :data="tableData"
             style="width: 100%; height: 73%;"
           >
+            <el-table-column
+              align="center"
+              type="index"
+              label="搴忓彿"
+              width="70"
+            />
+            <el-table-column
+              label="瀹氫綅"
+              width="100"
+              align="center"
+            >
+              <template #default="scope">
+                <el-button
+                  :icon="Location"
+                  size="small"
+                  @click.prevent="spaceLocation(scope.$index, scope.row)"
+                >
+                </el-button>
+              </template>
+            </el-table-column>
             <el-table-column
               v-for="(item, index) in attributeData"
               :key="index"
@@ -104,9 +134,9 @@
             >
               <el-option
                 v-for="item in fieldOption"
-                :key="item.id"
+                :key="item.field"
                 :label="item.alias"
-                :value="item.id"
+                :value="item.field"
               />
             </el-select>
           </el-col>
@@ -141,11 +171,89 @@
         </span>
       </template>
     </el-dialog>
-
+    <!-- 涓嬭浇淇℃伅 -->
+    <el-dialog
+      v-model="downloaVisible"
+      title="涓嬭浇"
+      width="30%"
+    >
+      <div
+        class="spatialTable"
+        style="max-height: 40vh;"
+      >
+        <el-table
+          :data="downTable"
+          @selection-change="handleSelectionChange"
+          style="width: 100%; height: 73%;"
+        >
+          <el-table-column
+            type="selection"
+            width="55"
+          />
+          <el-table-column
+            align="center"
+            type="index"
+            label="搴忓彿"
+            width="70"
+          />
+          <el-table-column
+            align="center"
+            label="琛ㄥ悕"
+            prop="cnName"
+          />
+        </el-table>
+        <el-form
+          ref="downFormRef"
+          class="setdownFrom"
+          :model="downFrom"
+          :rules="rules"
+          label-width="180px"
+        >
+          <el-form-item
+            label="璇疯緭鍏ュ瘑鐮�:"
+            prop="pass"
+          >
+            <el-input
+              type="password"
+              v-model="downFrom.pass"
+              autocomplete="off"
+              show-password
+              placeholder="璇疯緭鍏ュ瘑鐮�"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            label="璇峰啀娆¤緭鍏ュ瘑鐮�:"
+            prop="repass"
+          >
+            <el-input
+              type="password"
+              show-password
+              v-model="downFrom.repass"
+              autocomplete="off"
+              placeholder="璇峰啀娆¤緭鍏ュ瘑鐮�"
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              size="small"
+              @click="submitForm(downFormRef)"
+            >鎻愪氦</el-button>
+            <el-button size="small">鍙栨秷</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-dialog>
+    <iframe
+      id="Iframe1"
+      src=""
+      style="display: none; border: 0; padding: 0; height: 0; width: 0"
+    ></iframe>
   </div>
 </template>
 
 <script lang="ts" setup>
+window.encrypt = null;
 import {
   ref,
   onMounted,
@@ -155,16 +263,27 @@
   defineEmits,
   nextTick,
 } from "vue";
+import menuTool from "@/assets/js/Map/menuTool";
 import config from "@/assets/js/Map/config";
-import { User, Lock, Plus, Refresh } from "@element-plus/icons-vue";
-import { dataQuery_selectByPage, dataQuery_selectFields } from "@/api/api";
+import { User, Lock, Plus, Refresh, Location } from "@element-plus/icons-vue";
+import {
+  dataQuery_selectByPage,
+  dataQuery_selectFields,
+  dataQuery_downloadDbData,
+  sign_getPublicKey,
+} from "@/api/api";
 import { ElMessage } from "element-plus";
 import store from "@/store";
-
+import WKT from "terraformer-wkt-parser";
+import type { FormInstance, FormRules } from "element-plus";
+import { removeToken, getToken } from "@/utils/auth";
+import JSEncrypt from "jsencrypt";
 const emits = defineEmits(["SETspatialClose"]);
 const setSpatialClose = () => {
+  menuTool.setClearLocation("绌洪棿鏌ヨ");
   emits("SETspatialClose", false);
 };
+var encrypt = new JSEncrypt();
 const dialogVisible = ref(false);
 const listData = ref({
   pageIndex: 1,
@@ -175,18 +294,142 @@
   filter: "",
   name: "",
 });
+
 const condOption = ref([]);
 const fieldOption = ref([]);
 const attributeData = ref([]);
 const tableData = ref([]);
 const menuList = ref([]);
+const downTable = ref([]);
 const formSql = ref({
   field: "",
   type: "",
   value: "",
   cut: "",
 });
+const downloaVisible = ref(false);
 const isActive = ref(null);
+const multipleSelection = ref([]);
+const downFormRef = ref<FormInstance>();
+const downFrom = ref({
+  pass: "",
+  repass: "",
+});
+
+const validatepass = (rule: any, value: any, callback: any) => {
+  var passwordreg =
+    /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![a-z0-9]+$)(?![a-z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![0-9\W!@#$%^&*`~()\\-_+=,.?;<>]+$)[a-zA-Z0-9\W!@#$%^&*`~()\\-_+=,.?;<>]{12,20}$/;
+  if (!passwordreg.test(value)) {
+    callback(new Error("瀵嗙爜蹇呴』鐢辨暟瀛椼�佸瓧姣嶃�佺壒娈婂瓧绗︾粍鍚�,璇疯緭鍏�13-20浣�"));
+  } else {
+    callback();
+  }
+};
+const validaterepass = (rule: any, value: any, callback: any) => {
+  var passwordreg =
+    /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![a-z0-9]+$)(?![a-z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![0-9\W!@#$%^&*`~()\\-_+=,.?;<>]+$)[a-zA-Z0-9\W!@#$%^&*`~()\\-_+=,.?;<>]{12,20}$/;
+  if (!passwordreg.test(value)) {
+    callback(new Error("瀵嗙爜蹇呴』鐢辨暟瀛椼�佸瓧姣嶃�佺壒娈婂瓧绗︾粍鍚�,璇疯緭鍏�13-20浣�"));
+  } else if (value != downFrom.value.pass) {
+    callback(new Error("涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�,璇烽噸鏂拌緭鍏�"));
+  } else {
+    callback();
+  }
+};
+const rules = reactive<FormRules<typeof downFrom>>({
+  pass: [{ validator: validatepass, trigger: "blur" }],
+  repass: [{ validator: validaterepass, trigger: "blur" }],
+});
+
+const submitForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.validate((valid) => {
+    if (valid) {
+      console.log("submit!");
+      if (multipleSelection.value.length <= 0) {
+        ElMessage.error("璇烽�夋嫨瑕佷笅杞界殑琛�");
+      } else {
+        setDownLoadFrom();
+      }
+    } else {
+      console.log("erro submit!");
+      return false;
+    }
+  });
+};
+const getpublickey = async () => {
+  const res = await sign_getPublicKey();
+  if (res && res.code == 200) {
+    encrypt.setPublicKey(res.result);
+  }
+};
+const setDownLoadFrom = async () => {
+  downloaVisible.value = false;
+  var entities = [];
+  var tabs = [];
+
+  for (var i in multipleSelection.value) {
+    var tab = multipleSelection.value[i].tab;
+    if (tab.indexOf("moon:") > -1) {
+      tab = tab.replaceAll("moon:", "");
+    }
+    tabs.push(tab);
+    var entity = tab;
+    if (entity.indexOf("_") > -1) {
+      entity = entity.replaceAll("_", "");
+    }
+    entities.push(entity);
+  }
+
+  var obj = {
+    pwd: encrypt.encrypt(downFrom.value.pass),
+    filter: listData.value.filter,
+    tabs: tabs,
+    entities: entities,
+    wkt: listData.value.wkt,
+  };
+  const data = await dataQuery_downloadDbData(obj);
+
+  if (data.code != 200 && !data.result) {
+    setClearDownload();
+    return ElMessage.error("鏁版嵁涓嬭浇澶辫触");
+  }
+
+  var token = getToken();
+  var url =
+    config.proxy +
+    "/dataLib/downloadFile?token=" +
+    token +
+    "&guid=" +
+    data.result +
+    "&pwd=" +
+    encodeURIComponent(downFrom.value.pass);
+  $("#Iframe1").attr("src", url).click();
+  setClearDownload();
+};
+const setClearDownload = () => {
+  downFrom.value = {
+    pass: "",
+    repass: "",
+  };
+  multipleSelection.value = [];
+  downTable.value = [];
+};
+const handleSelectionChange = (res) => {
+  multipleSelection.value = res;
+};
+//涓嬭浇
+const setSpatialDownload = () => {
+  downTable.value = menuList.value;
+  downloaVisible.value = true;
+};
+//瀹氫綅鏄剧ず
+const spaceLocation = (index, row) => {
+  var geom = menuTool.decr(row.geom);
+
+  var wkt = WKT.parse(geom);
+  menuTool.spaceLocation(wkt);
+};
 const handleSizeChange = (res) => {
   listData.value.pageSize = res;
   setQueySpatialData();
@@ -196,7 +439,12 @@
   setQueySpatialData();
 };
 const setMenuListClick = (res) => {
-  listData.value.name = res.name;
+  if (res.tab && res.tab.indexOf("moon:") > -1) {
+    listData.value.name = res.tab.replaceAll("moon:", "");
+  } else {
+    listData.value.name = res.tab;
+  }
+
   isActive.value = res.id;
   listData.value.filter = "";
   listData.value.pageIndex = 1;
@@ -253,6 +501,7 @@
 };
 //鏌ヨ鍒楄〃鏁版嵁
 const setQueySpatialData = async () => {
+  listData.value.name = listData.value.name.replaceAll("_", "");
   const data = await dataQuery_selectByPage(listData.value);
   if (data.code != 200) {
     return ElMessage.error("绌洪棿鏌ヨ澶辫触");
@@ -262,12 +511,22 @@
 };
 
 const setQueySpatialFields = async () => {
-  const data = await dataQuery_selectFields({ name: listData.value.name });
+  const data = await dataQuery_selectFields({
+    ns: "mn",
+    tab: listData.value.name,
+  });
   if (data.code != 200) {
     return ElMessage.error("瀛楁鏌ヨ澶辫触");
   }
-  attributeData.value = data.result;
-  fieldOption.value = data.result;
+
+  var std = data.result.filter((res) => {
+    if (res.showtype > 0) {
+      return res;
+    }
+  });
+
+  attributeData.value = std;
+  fieldOption.value = std;
   conditionChange(data.result[0]);
   setQueySpatialData();
 };
@@ -287,8 +546,7 @@
   formSql.value.value = "";
   formSql.value.field = res.field;
   formSql.value.cut = res.type;
-  const type = res.type;
-
+  var type = res.type;
   var std = [];
   if (type == "text" || type == "blob") {
     std = config.conditions[0];
@@ -324,17 +582,16 @@
 
   menuList.value = str;
   listData.value.wkt = store.state.spatialQueryData.wkt;
-  var val_name = menuList.value[0].tab.replaceAll("moon:", "");
-  val_name = val_name.replaceAll("_", "");
-  listData.value.name = val_name;
+  listData.value.name = menuList.value[0].tab.replaceAll("moon:", "");
   isActive.value = menuList.value[0].id;
-
   listData.value.hasGeom = 1;
   //
   setQueySpatialFields();
 };
+
 onMounted(() => {
   startQueryData();
+  getpublickey();
 });
 </script>
 
@@ -400,57 +657,6 @@
     height: calc(100% - 10px);
     width: calc(80% - 20px);
     padding: 10px;
-
-    .spatialTable {
-      margin-top: 10px;
-      width: 100%;
-      height: 100%;
-      position: relative;
-
-      .el-table /deep/ .el-table__header-wrapper tr th {
-        background-color: rgba(38, 47, 71, 1) !important;
-        color: #d6e4ff;
-      }
-      // 淇敼姣忚鏍峰紡锛�
-      .el-table /deep/ .el-table__row {
-        background-color: rgba(38, 47, 71, 1) !important;
-        color: #d6e4ff;
-      }
-      .el-table /deep/ .el-table__body tr.current-row > td {
-        background-color: rgba(38, 47, 71, 1) !important;
-      }
-      .el-table /deep/ .el-table__body tr:hover > td {
-        background-color: rgba(38, 47, 71, 1) !important;
-      }
-      // 淇敼琛ㄦ牸姣忚杈规鐨勬牱寮忥細
-      .el-table /deep/ td,
-      .el-table /deep/ th.is-leaf {
-        // border-bottom: 1px solid #409eff;
-        // border-right: 1px solid #409eff;
-      }
-      .el-table /deep/ .el-table__cell {
-        padding: 8px 0;
-      }
-      // 璁剧疆琛ㄦ牸姣忚鐨勯珮搴︼細
-      .el-table /deep/ .el-table__header tr,
-      .el-table /deep/ .el-table__header th {
-        height: 50px;
-      }
-      .el-table__body tr,
-      .el-table__body td {
-        height: 50px;
-        padding: 0;
-      }
-      // 璁剧疆琛ㄦ牸杈规棰滆壊锛�
-
-      .el-table--border::after,
-      .el-table--group::after {
-        width: 0;
-      }
-      .el-table::before {
-        height: 0;
-      }
-    }
   }
   .spatialBottom {
     padding: 10px;
@@ -518,6 +724,62 @@
   ::-webkit-scrollbar-track:hover {
     background: rgba(38, 47, 71, 0);
   }
+  .spatialTable {
+    margin-top: 10px;
+    width: 100%;
+    height: 100%;
+    position: relative;
+
+    .el-table /deep/ .el-table__header-wrapper tr th {
+      background-color: rgba(38, 47, 71, 1) !important;
+      color: #d6e4ff;
+    }
+    // 淇敼姣忚鏍峰紡锛�
+    .el-table /deep/ .el-table__row {
+      background-color: rgba(38, 47, 71, 1) !important;
+      color: #d6e4ff;
+    }
+    .el-table /deep/ .el-table__body tr.current-row > td {
+      background-color: rgba(38, 47, 71, 1) !important;
+    }
+    .el-table /deep/ .el-table__body tr:hover > td {
+      background-color: rgba(38, 47, 71, 1) !important;
+    }
+    // 淇敼琛ㄦ牸姣忚杈规鐨勬牱寮忥細
+    .el-table /deep/ td,
+    .el-table /deep/ th.is-leaf {
+      // border-bottom: 1px solid #409eff;
+      // border-right: 1px solid #409eff;
+    }
+    .el-table /deep/ .el-table__cell {
+      padding: 8px 0;
+    }
+    // 璁剧疆琛ㄦ牸姣忚鐨勯珮搴︼細
+    .el-table /deep/ .el-table__header tr,
+    .el-table /deep/ .el-table__header th {
+      height: 50px;
+    }
+    .el-table__body tr,
+    .el-table__body td {
+      height: 50px;
+      padding: 0;
+    }
+    // 璁剧疆琛ㄦ牸杈规棰滆壊锛�
+
+    .el-table--border::after,
+    .el-table--group::after {
+      width: 0;
+    }
+    .el-table::before {
+      height: 0;
+    }
+  }
+  .setdownFrom {
+    margin-top: 10px;
+    /deep/.el-form-item__label {
+      color: #d6e4ff !important;
+    }
+  }
 }
 </style> 
 <style lang="less"  >

--
Gitblit v1.9.3