加载中...

vue+echarts+3D地图 制作大屏

vue+echarts+3D地图 制作大屏

基于3d地图做的一些效果,首先看下效果图

New Image​​​​​​​

准备工作:下载echarts 和3d地图需要用到的依赖包,版本随意就行

New Image​​​​​​​

下载依赖之后,在页面引入,引入网上下载的地图json文件

用户不直接操作地图,因为是大屏,只做展示使用,右边列表有两种模式,如果列表数据没有撑开盒子,每3秒轮播高亮,高亮到那个地区,地图上就高亮那一块区域,且显示对应的tooltip(这里没有使用echarts中的tooltip,因为高亮地图的时候,2d地图可以主动触发tooltip出现,但是3d里面不支持,所以这个弹框是我自己写的,因为项目中只有3个地区的数据,只用写3个弹框就行,如果梅个区域都有数据,不建议使用这种方式)

第二种展示方式就是,如果右边列表数据过多,就会无限滚动,当高亮哪一个区域的时候,就高亮某一个地图区域

New Image​​​​​​​

 

重点主要将如何在vue中使用3d地图,如果有对两边联动效果如何做的小伙伴感兴趣,给我私信吧

在data()中定义渲染3d地图的options:

  1. data(){
  2. let _this = this
  3. return {
  4. option: {
  5. tooltip: {
  6. show: false,//地图自带的tooltip,在这里我设置为false,并没有使用,可以放开看下效果
  7. triggerOn: ''mousemove'',//鼠标hover地图区域时出现
  8. trigger: ''item'',
  9. transitionDuration: 1,//延时一秒出现
  10. formatter: function(params){
  11. //返回的是dom结构,你可以在这里写好样式,也可以使用下面的配置项去设置样式
  12. return `<div style="position:absolute;left:10px;top:16px;width:8px;height:8px;background-color:#FD9A5A;"></div>
  13. <div class="tips" style="padding:12px;">
  14. <h1 style="font-size:16px;">${params.name}边缘云设置总量</h1>
  15. <p style="font-size:16px;">
  16. <span style="color:#03dbf3;font-size:30px;display:inline-block;padding:5px 0">${354645}</span>
  17. </p>
  18. </div>`
  19. },
  20. //这里就是设置地图自带的弹框样式
  21. borderColor: ''#419bf9'',
  22. borderWidth: 1,
  23. padding: [0, 15],
  24. // backgroundColor: ''#0a1d54'',
  25. backgroundColor: ''rgba(0,2,89,0.8)'',
  26. borderRadius: 0,
  27. textStyle: { color:''#fff''},
  28. // hoverAnimation:true
  29. },
  30. series: [
  31. {
  32. //你引入的地图文件的json文件的名称
  33. name: ''china'',
  34. type: ''map3D'',//我们需要使用3d地图
  35. // type: ''map'',
  36. map: ''china'', //地图类型。echarts-gl 中使用的地图类型同 geo 组件相同
  37. regionHeight: 3, //模型的高度
  38. boxWidth: 85, //三维地图在三维场景中的宽度
  39. boxDepth: 73, //三维地图在三维场景中的深度
  40. top: ''-15%'',
  41. itemStyle: {
  42. normal: {
  43. //静态模式下显示的默认样式
  44. borderColor: ''#3f82e5'',
  45. borderWidth: 2,
  46. color: ''#0a55ea'',
  47. opacity: 0.4
  48. }, //阴影效果
  49. emphasis: {
  50. // color:''#3f82e5'',
  51. color: ''#0a55ea'',
  52. // opacity:1,
  53. label:{
  54. show:false
  55. }
  56. }
  57. },
  58. viewControl: {
  59. alpha: 45, // 视角绕 x 轴,即上下旋转的角度。配合 beta 可以控制视角的方向。[ default: 40 ]
  60. beta: 10,
  61. rotateSensitivity:0,
  62. zoomSensitivity:0,
  63. //用于鼠标的旋转,缩放等视角控制。
  64. autoRotate: false, //是否开启视角绕物体的自动旋转查看
  65. distance: 90 //默认视角距离主体的距离,对于 globe 来说是距离地球表面的距离,对于 grid3D 和 geo3D 等其它组件来说是距离中心原点的距离。在 projection 为''perspective''的时候有效。
  66. },
  67. data:[],
  68. // hoverAnimation:true,
  69. }]
  70. },
  71. }
  72. },

 在页面中写一个盒子,用来装你的地图,你可以这么写

  1. <div id="map" ref="myEchart" :style="{width: this.winWidth() / 1.8 + ''px'',height: (this.winHeight()-89) / 0.95 + ''px''}"></div>
  2. //因为我的需要适配屏幕,宽高你可以结合实际需要来定

在mounted生命周期函数中,去渲染地图

  1. mounted() {
  2. this.initEcharts()
  3. // 禁用滚动条
  4. document.body.parentNode.style.overflow="hidden";
  5. },
  1. initEcharts() {
  2. //echarts初始化出来后要全局变量接受一下,以后修改echarts的时候就去setoptions
  3. this.myChart = echarts.init(this.$refs.myEchart)
  4. echarts.use([TooltipComponent, VisualMapComponent, GeoComponent,EffectScatterChart])
  5. echarts.registerMap(''china'', china)
  6. this.myChart.setOption(this.option)
  7. console.log(''渲染后得options==='',this.myChart.setOption(this.option))
  8. //echarts自适应
  9. window.onresize = this.myChart.resize
  10. //在渲染完毕之后,你可以结合实际需要,给地图绑定事件,我帮事件是因为我原先要做tooltip的鼠标跟随,虽然能够实现,但是有坑,无法解决,所以就放弃了,改成自己写的弹框,头铁的老哥可以自己试下
  11. //绑定市区点击事件
  12. // this.myChart.on("click",(params)=>{
  13. // this.mapClick(params)
  14. // })
  15. // this.myChart.on("mouseover",(params)=>{
  16. // this.mapover(params)
  17. // })
  18. // this.myChart.on("mouseout",(params)=>{
  19. // this.mapMouseout(params)
  20. // })
  21. // this.myChart.on("mousemove",(params)=>{
  22. // this.mapMousemove(params)
  23. // })
  24. // this.myChart.on("globalout",(params)=>{
  25. // this.mapGlobalout(params)
  26. // })
  27. },

代码走到此处,那么你的地图就能够成功的渲染出来了,那么如何做地图的高亮呢?

其实代码很简单,将你要高亮的地区区域名称得到,然后设置样式就可以实现高亮,这个应该不难的,但是因为我的列表是滚动的,当时就没有想到好的办法,如何得到我当前是哪个地区的数据,所以给列表加了一个高亮的样式,然后通过获取高亮样式,来判断列表当前滚动到哪一个区域,得到区域后,使用以下方法就可以实现地图高亮了

  1. // 高亮右侧地图
  2. handleProvinceChange(val){
  3. let _this = this
  4. // // 高亮当前选中的省份
  5. let data = [{
  6. name:val,
  7. itemStyle:{
  8. color:''#7CFFFB'',
  9. opacity:1,
  10. label:{
  11. show:false
  12. }
  13. }
  14. }]
  15. _this.option.series[0].data = data
  16. if(_this.myChart){
  17. _this.myChart.setOption(this.option);
  18. }
  19. },

地图已经高亮,那么对应的弹框是不是也应该出现,来看我写的自定义弹框,设置了三个变量来控制显隐,当滚到对应区域的时候,就让这个弹框出现,其他隐藏,弊端就是这个定位的位置是写死的,如果要求适配各种大屏,那么需要写几套样式,比较复杂。

New Image

样式如下:

  1. .tool__tip-map {
  2. position:absolute;
  3. z-index:999;
  4. font-size:16px;
  5. color:#fff;
  6. width: 206px;
  7. height: 80px;
  8. border: 1px solid #419bf9;
  9. box-sizing: border-box;
  10. padding: 12px 25px;
  11. // background: rgba(0,2,89,0.8);
  12. background: rgba(10,29,84,0.8);
  13. // background: #0a1d54;
  14. //牵引线就是两个伪元素实现的,只写了关键样式,其他的细微样式自己调
  15. &::after {
  16. content: "";
  17. width: 100px;
  18. height: 2px;
  19. background: #02C6E5;
  20. position: absolute;
  21. left: -120px;
  22. top: 50%;
  23. transform: translateY(-50%);
  24. }
  25. &::before{
  26. content: "";
  27. width: 2px;
  28. height: 117px;
  29. background: #02C6E5;
  30. position: absolute;
  31. left: -140px;
  32. top: 36px;
  33. transform:rotateZ(20deg);
  34. }
  35. }

 如果你没有列表,单纯的想通过点击地区区域出现tooltip,那么你绑定点击事件,完全是可以实现的,而且效果很赞,这里我的代码就不贴了

如果你没有列表,鼠标跟随出现tooltip,你也可以绑定地图事件,但是弊端就是,在地图划过任何区域都是可以的,但是当你离开画布,那么最后一个你离开的tooltip不会消失

还有个小技术的点是:

     这个蓝色的线是根据边框轨迹滑动的,看起来比较高大上,如果你想做,看我的另外一篇博客吧利用径向渐变做酷炫的按钮闪光效果_亦双城的双子娴的博客-CSDN博客

New Image