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