From 95ff3cadc7685f6470a0d6c78429dbfd5b1451d9 Mon Sep 17 00:00:00 2001
From: YANGDL <114714267@qq.com>
Date: 星期一, 08 三月 2021 17:53:30 +0800
Subject: [PATCH] 天地图瓦片切换增加淡入淡出效果

---
 src/conf/TDT.js                                      |    4 +-
 src/main.js                                          |    1 
 src/components/LayerController/modules/LcBaseMap.vue |   10 ++++
 src/conf/MapConfig.js                                |    1 
 src/components/plugin/Leaflet.GridLayer.FadeOut.js   |   76 ++++++++++++++++++++++++++++++++++++++
 src/components/helpers/BasemapHelper.js              |   19 +++++++--
 6 files changed, 104 insertions(+), 7 deletions(-)

diff --git a/src/components/LayerController/modules/LcBaseMap.vue b/src/components/LayerController/modules/LcBaseMap.vue
index e5af6f2..3afc8d8 100644
--- a/src/components/LayerController/modules/LcBaseMap.vue
+++ b/src/components/LayerController/modules/LcBaseMap.vue
@@ -16,6 +16,7 @@
   data () {
     return {
       isShow: true,
+      currentBaseMapCode: 'tianditu_img',
       basemapList: []
     }
   },
@@ -34,7 +35,14 @@
       const code = itm.code
       this.basemapList.forEach((item) => {
         if (item.code === code) {
-          this.basemapHelper.showBasemap(item.code, item.conf.annotationCheck, true)
+          console.log(this.currentBaseMapCode)
+          if (this.currentBaseMapCode == null || this.currentBaseMapCode !== code) {
+            this.currentBaseMapCode = code
+            this.basemapHelper.showBasemap(item.code, item.conf.annotationCheck, true)
+          } else {
+            this.basemapHelper.showBasemap(item.code, item.conf.annotationCheck, false)
+          }
+
           this.basemapHelper.getBasemapList().forEach((item) => {
             item.layer.bringToBack()
           })
diff --git a/src/components/helpers/BasemapHelper.js b/src/components/helpers/BasemapHelper.js
index 9b29e4e..d17a606 100644
--- a/src/components/helpers/BasemapHelper.js
+++ b/src/components/helpers/BasemapHelper.js
@@ -11,6 +11,7 @@
     this.basemapList = []
     this.basemapMap = new Map()
     this.basemapLayerGroup = this.L.layerGroup().addTo(options.map)
+    this.currentBaseMapCode = null
   }
 
     /**
@@ -52,13 +53,23 @@
      */
     showBasemap = (code, showAnnotation, isHideOthers = true) => {
       const basemap = this.basemapMap.get(code)
+
       if (isHideOthers) {
         this.basemapLayerGroup.clearLayers()
       }
-      this.basemapLayerGroup.addLayer(basemap.layer)
-      if (showAnnotation) {
-        this.basemapLayerGroup.addLayer(basemap.annotation)
-      }
+      setTimeout(() => {
+        // const layer = this.basemapLayerGroup.hasLayer(basemap.layer)
+        // if (!layer) {
+        this.basemapLayerGroup.addLayer(basemap.layer)
+        // }
+
+        if (showAnnotation) {
+          // if()
+          this.basemapLayerGroup.addLayer(basemap.annotation)
+        } else {
+          this.basemapLayerGroup.removeLayer(basemap.annotation)
+        }
+      }, 300)
     }
 
     /**
diff --git a/src/components/plugin/Leaflet.GridLayer.FadeOut.js b/src/components/plugin/Leaflet.GridLayer.FadeOut.js
new file mode 100644
index 0000000..be038a2
--- /dev/null
+++ b/src/components/plugin/Leaflet.GridLayer.FadeOut.js
@@ -0,0 +1,76 @@
+/* eslint-disable */
+// Adds a fade-out animation to grid layers when they're removed from the map
+
+(function () {
+  var gridProto = L.GridLayer.prototype
+  var onRemoveProto = gridProto.onRemove
+  var onAddProto = gridProto.onAdd
+  var fadeDuration = 200
+
+  L.GridLayer.include({
+
+    onAdd: function (map) {
+      if (this._fadeOutTime) {
+        var now = performance.now() || (+new Date())
+        L.Util.cancelAnimFrame(this._fadeOutFrame)
+        this._fadeOutTime = now + fadeDuration - this._fadeOutTime + now
+        L.Util.requestAnimFrame(this._fadeIn, this)
+      } else {
+        onAddProto.call(this, map)
+      }
+    },
+
+    onRemove: function (map) {
+      if (this._fadeOutTime) {
+        // We're removing this *again* quickly after removing and re-adding
+        var now = performance.now() || (+new Date())
+
+        this._fadeOutTime = now + fadeDuration - this._fadeOutTime + now
+      }
+      this._fadeOutTime = (performance.now() || (+new Date())) + fadeDuration * 2
+      this._fadeOutMap = this._map
+
+      L.Util.requestAnimFrame(this._fadeOut, this)
+    },
+
+    _fadeOut: function () {
+      if (!this._fadeOutTime || !this._container) { return }
+
+      var now = performance.now() || (+new Date())
+
+      var opacity = Math.min((this._fadeOutTime - now) / fadeDuration, 1)
+      // console.log('fadeout:', opacity);
+      if (opacity < 0) {
+        this._fadeOutTime = false
+
+        onRemoveProto.call(this, this._fadeOutMap)
+
+        return
+      }
+
+      L.DomUtil.setOpacity(this._container, opacity * this.options.opacity)
+
+      this._fadeOutFrame = L.Util.requestAnimFrame(this._fadeOut, this)
+    },
+
+    // Only runs when the gridlayer is quickly re-added while it's being faded out
+    _fadeIn: function _fadeIn () {
+      if (!this._fadeOutTime || !this._container) { return }
+
+      var now = performance.now() || (+new Date())
+
+      var opacity = (now - this._fadeOutTime) / fadeDuration
+      // console.log('fadein:', opacity);
+
+      if (opacity > 1) {
+        this._fadeOutTime = false
+        return
+      }
+
+      L.DomUtil.setOpacity(this._container, opacity * this.options.opacity)
+
+      L.Util.requestAnimFrame(this._fadeIn, this)
+    }
+
+  })
+})()
diff --git a/src/conf/MapConfig.js b/src/conf/MapConfig.js
index 4512d66..8e502d3 100644
--- a/src/conf/MapConfig.js
+++ b/src/conf/MapConfig.js
@@ -34,6 +34,7 @@
 const mapConfig = {
   IsLoadMapByToken: true, // 鏄惁閫氳繃token鍔犺浇鍦板浘
   showBaseMapType: 1, // 1鏄剧ず澶╁湴鍥撅紝2鏄剧ずarcgis鍦板浘
+  // defaultBasemapCode: 'tianditu_img', // 榛樿鏄剧ず 鍦板浘绫诲瀷
   IntranetBaseMaps: TDT.intranet,
   InternetBaseMaps: TDT.internet,
   Layers: { LayerSewersLine: [LayerSewersLine], layerSewersPoint: LayerSewersPoint } // 姹¢洦姘村浘灞傞厤缃�
diff --git a/src/conf/TDT.js b/src/conf/TDT.js
index 1c5ad9e..0c5b418 100644
--- a/src/conf/TDT.js
+++ b/src/conf/TDT.js
@@ -4,7 +4,7 @@
 const TIANDITU_GIS_TOKEN = '5d76218063082952d18b76da5005f490' // 澶囩敤tk: f1b72b5e7cb1175acddfa485f1bc9770
 const intranet = [
   {
-    code: 'sinopec_img',
+    code: 'tianditu_img',
     name: '涓煶鍖栧ぉ鍦板浘褰卞儚',
     icon_actived: '/assets/images/map-pages/icon/img.png',
     icon_deactived: '/assets/images/map-pages/icon/img.png',
@@ -40,7 +40,7 @@
     }
   },
   {
-    code: 'sinopec_vec',
+    code: 'tianditu_vec',
     name: '涓煶鍖栧ぉ鍦板浘鐭㈤噺',
     icon_actived: '/assets/images/map-pages/icon/road.png',
     icon_deactived: '/assets/images/map-pages/icon/road.png',
diff --git a/src/main.js b/src/main.js
index 95591a3..28cfbd5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -12,6 +12,7 @@
 import L from 'leaflet'
 import 'leaflet.markercluster'
 import 'leaflet-canvas-markers'
+import './components/plugin/Leaflet.GridLayer.FadeOut'
 Vue.config.productionTip = false
 
 Vue.use(ElementUI)

--
Gitblit v1.8.0