具体实现
安装echarts
在终端下安装echarts
npm install -D echarts
安装echarts-gl
在终端下安装echarts-gl
npm install -D echarts-gl
earth3D组件
earth3D.vue
<template> | |
<div class="globe3d-earth-container" > | |
<div class="globe3d-earth" ref="Globe3d"></div> | |
</div> | |
</template> | |
<script> | |
import Vue from "vue"; | |
import echarts from "echarts"; | |
import "echarts-gl"; | |
import option from './Globe3d.js' | |
import { debounce } from "./debounce.js"; | |
Vue.prototype.echarts = echarts; | |
export default { | |
name: "earth3D", | |
data() { | |
return { | |
myChart: null, | |
resizeHandler: null | |
} | |
}, | |
mounted() { | |
// 基于准备好的dom,初始化echarts实例 | |
this.myChart = echarts.init(this.$refs.Globe3d); | |
// 使用刚指定的配置项和数据显示图表。可视化3D | |
this.myChart.setOption(option); | |
this.resizeHandler = debounce(() => { | |
if (this.myChart) { | |
this.myChart.resize(); | |
} | |
}, 100); | |
this.initResizeEvent(); | |
}, | |
methods: { | |
//监听resize | |
initResizeEvent() { | |
window.addEventListener("resize", this.resizeHandler); | |
}, | |
//移除resize | |
destroyResizeEvent() { | |
window.removeEventListener("resize", this.resizeHandler); | |
} | |
}, | |
beforeDestroy() { | |
this.destroyResizeEvent(); | |
if (!this.myChart) { | |
return; | |
} | |
this.myChart.dispose(); | |
this.myChart = null; | |
}, | |
activated() { | |
this.initResizeEvent(); | |
if (this.myChart) { | |
this.myChart.resize(); | |
} | |
}, | |
deactivated() { | |
this.destroyResizeEvent(); | |
} | |
} | |
</script> | |
<style lang="scss" scoped> | |
.globe3d-earth-container { | |
width: 100%; | |
height: 100%; | |
background:#2d3a4b; | |
.globe3d-earth { | |
width: 100%; | |
height: 702px; | |
} | |
} | |
</style> |
debounce.js
export function debounce(func, wait, immediate) { | |
let timeout, args, context, timestamp, result; | |
const later = function() { | |
// 据上一次触发时间间隔 | |
const last = +new Date() - timestamp; | |
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait | |
if (last < wait && last > 0) { | |
timeout = setTimeout(later, wait - last); | |
} else { | |
timeout = null; | |
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 | |
if (!immediate) { | |
result = func.apply(context, args); | |
if (!timeout) context = args = null; | |
} | |
} | |
}; | |
return function(...args) { | |
context = this; | |
timestamp = +new Date(); | |
const callNow = immediate && !timeout; | |
// 如果延时不存在,重新设定延时 | |
if (!timeout) timeout = setTimeout(later, wait); | |
if (callNow) { | |
result = func.apply(context, args); | |
context = args = null; | |
} | |
return result; | |
}; | |
} |
Globe3d.js
import baseTextureImg from "./worldbathy.jpg"; | |
import heightTextImg from "./worldbathy.jpg"; | |
import environmentImg from "./starfield.jpg"; | |
// import textureImg from "@/assets/images/pisa.jpg"; | |
export default { | |
backgroundColor: "#2d3a4b", | |
globe: { | |
baseTexture: baseTextureImg, | |
heightTexture: heightTextImg, | |
displacementScale: 0.04, | |
shading: "realistic", | |
environment: environmentImg, | |
realisticMaterial: { | |
roughness: 0.9 | |
}, | |
postEffect: { | |
enable: true | |
}, | |
light: { | |
main: { | |
intensity: 5, | |
shadow: true | |
}, | |
ambientCubemap: { | |
// texture: textureImg, | |
diffuseIntensity: 0.2 | |
} | |
} | |
} | |
}; |