vue中Echarts实现伪3D地图

1 篇文章 0 订阅
1 篇文章 0 订阅

1.需求3d切面地图,颜色渐变,选中阴影,可切换地市,点击时展示地理数据,由于echarts 3d地图无法渐变,地图比例大小效果不好改成理想效果,所以通过伪3d方式实现。最终实现如下图:

2.代码

<template>
  <div ref="myEchart" class="map-echart">
  </div>
</template>

<script>
import echarts from 'echarts'
export default {
  name: "map",
  data() {
    return{
        myChartMap: '',
    }
  },
  mounted() {
    const uploadedDataURL = require(`@/assets/json/map/provice/shandong.json`)
    echarts.registerMap('shandong', uploadedDataURL)
    this.myChartMap = echarts.init(this.$refs.myEchart)
    this.myChartMap.on('click', params=>{
        this.powerClick(params, 'echartClick')
    })
    this.initEcharts()
  }
  methods: {
    //画图
    initEcharts() {
       this.$nextTick(() => {
          const seriesData = [{
            name: '济南',
            value: [117.200, 36.791]
          },{
            name: '青岛',
            value: [120.253, 36.529]
          },{
            name: '莱芜',
            value: [117.676, 36.33]
          },{
            name: '潍坊',
            value: [119.09, 36.712]
          },{
            name: '枣庄',
            value: [117.46, 34.96]
          },{
            name: '东营',
            value: [118.66, 37.59]
          },{
            name: '德州',
            value: [116.619, 37.112]
          },{
            name: '烟台',
            value: [120.79, 37.101]
          },{
            name: '临沂',
            value: [118.286, 35.167]
          },{
            name: '日照',
            value: [119.150, 35.436]
          },{
            name: '济宁',
            value: [116.505, 35.385]
          },{
            name: '聊城',
            value: [115.878, 36.321]
          },{
            name: '淄博',
            value: [118.007648, 36.674939]
          },{
            name: '泰安',
            value: [116.800, 36.015]
          },{
            name: '威海',
            value: [122.100, 37.255691]
          },{
            name: '滨州',
            value: [117.850974, 37.693542]
          },{
            name: '菏泽',
            value: [115.700381, 35.220]
          }]
          const options = {
              // 悬浮窗
              tooltip: {
                trigger: 'item',
                formatter: function(point, params, dom, rect, size) {
                  //这里可以自定义浮窗的dom节点及样式
                  return `${params.name}: ${params.value || 0}`
                }
              },
              geo: [{
                //第一层需要操作点击展示的地图
                show: true,
                map: 'shandong',
                z: 1,//层级,zLevel优先级 > z
                aspectScale: 1,
                zoom: 1.15,//控制整体视图缩放
                roam: false,//控制是否可拖动
                label: {//初始标签样式
                  show: true,
                  color: '#fff',
                  position: "inside",
                  distance: 0,
                  fontSize: 12
                },
                // 所有地图的区域颜色
                itemStyle: {
                  normal: {
                    color: {
                        type: 'linear',
                        x: 0,
                        x2: 0,
                        y: 0,
                        y2: 1,
                        colorStops: [
                            { offset: 0, color: '#0843a9' },
                            { offset: 0.9, color: '#001c80' }
                        ]
                    },
                    borderWidth: 1,//分界线width
                    borderColor: '#55bef2'
                  }
                },
                emphasis: {//鼠标移入显示效果
                  label:{
                    show: true,//是否显示高亮
                    textStyle: {
                        color: '#fff',
                        fontSize: 15  //高亮放大字体
                    }
                  },
                  itemStyle: {
                    color: {
                        type: 'linear',
                        x: 0,
                        x2: 0,
                        y: 0,
                        y2: 1,
                        colorStops: [
                             { offset: 0, color: '#12F5D9' },
                             { offset: 0.49, color: '#08BCEE' },
                             { offset: 0.5, color: '#08BCEE' },
                             { offset: 1, color: '#0194FD' }
                        ]
                    },
                    shadowColor: 'rgba(255,248,74,0.8)',//阴影颜色
                    shadowBlur: 3,//阴影大小
                    shadowOffsetX: 10,//沿x轴宽度 
                    shadowOffsetY: 10,//沿y轴宽度
                    borderCap: 'square'
                  }
                },
                // 针对点击或特别区域做一些特别的样式
                // regions: [{
                //   name: '山东省',
                //   itemStyle: {
                //     areaColor: 'yellow',
                //     color: 'black',
                //     borderColor: 'pink'
                //   }
                // }]
              },{
                show: true,
                map: 'shandong',
                z: 0,
                top: 75,
                left: 100,
                aspectScale: 1,
                zoom: 1.15,
                roam: false,
                label: {
                    normal: {
                        show: false
                    },
                    emphasis: {
                        show: false
                    }
                },
                itemStyle: {
                    normal: {
                        areaColor: 'rgba(5, 32, 136, 1)',
                        borderColor: 'transparent',
                        borderWidth: 5
                    },
                    emphasis: {
                        areaColor: 'rgba(5, 32, 136, 1)'
                    }
                }
              }],  
              // 数据
              series: [
                {
                  type: 'scatter',
                  itemStyle: {
                    color: '#efe244',
                    opacity: 1,
                    shadowColor: 'rgba(255, 248, 74, 0.8)',
                    shadowBlur: 10,
                    shadowOffsetX: 1,
                    shadowOffsetY: 1
                  },
                  symbol: 'diamond',
                  coordinateSystem: 'geo',
                  zlevel: 100,
                  geoIndex: 0,
                  top: 10,
                  symbolSize: 10,
                  data: seriesData,
                }
              ]
            }
            this.myChartMap.setOption(options)   
       })    
    },
    powerClick(params, fromEven){
        //...其他判断逻辑

        //点击时地图上色
        //tip:其他地方如果需要清除选中效果,需要置空regions 
        //this.myChartMap.setOption({geo: {regions: []}})
        this.myChartMap.setOption({
            geo: {
                regions: [
                    {
                        name: params.name,
                        value: 0,
                        selected: true,
                        itemStyle: {
                           color: {
                               type: 'linear',
                               x: 0,
                               x2: 0,
                               y: 0,
                               y2: 1,
                               colorStops: [
                                 { offset: 0, color: '#12F5D9' },
                                 { offset: 0.49, color: '#08BCEE' },
                                 { offset: 0.5, color: '#08BCEE' },
                                 { offset: 1, color: '#0194FD' }
                               ]
                            },
                            opacity: 1,
                            borderWidth: 0,
                            shadowColor: 'rgba(255,248,74,0.8)',//阴影颜色
                            shadowBlur: 3,//阴影大小
                            shadowOffsetX: 10,//沿x轴宽度 
                            shadowOffsetY: 10,//沿y轴宽度
                        },
                        label: {
                            color: '#fff',
                            fontSize: 15,
                            shadowColor: 'rgba(255, 248, 74, 0.8)',
                            shadowBlur: 10,
                            shadowOffsetX: 1,
                            shadowOffsetY: 1
                        }
                    }
                ]
            }
        })
    }
  }
  
}
</script>

<style>
.map-echart {
  height: 600px;
  width: 900px;
}
</style>

 3.地图json数据下载地址:

地图选择器

4.更灵巧的优化方案,如果需要设计感、立体感更强,可以切16地市的图片(每单个地市高亮),背景样式(width:100%;height: 100%),通过点击城市切换背景图片即可~

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
/* *author:XudongChen *Date:2010-03-09 *QQ:233828249 81023617(不才) *Email:xznd@163.com */ 2009-8-13 1.加载分块地图 2.添加全景标记窗体 2009-8-14 1.增加控制条 2.增加全景标记、公交车标记显示层 3.解决地图定位问题 4.增加经纬度层功能 5.未修正图标层的定位 2009-8-15 1.已修正8.14地图定位错误,还存在放大缩小时定位不准 2.存在ie内存泄漏问题 2009-8-16 1.已修正8.15 ie内存泄漏问题,chrome下可能还存在内存泄漏 2.增加图标定位功能 3.增加鼠标滚轮事件(http://yongzhi.blog.hexun.com/5057947_d.html) 4.通过jquery加载json数据文件(图标显示层数据) 2009-8-17 1.增加建筑物高亮显示(还需完成鼠标mouseover和mouseout事件) 2009-8-18 1.完成建筑物高亮显示,有点小bug 2009-8-19 1.增加记录原始缩放比例的全局变量 2.解决建筑物高亮显示bug 2009-8-20 1.增加三维全景展示功能 2.浏览建筑详细功能 2009-8-21 1.引入jqueryAlert插件,美化弹出窗体 2009-8-23 1.增加搜索功能 2.清理建筑信息显示页和公交信息页多余数据 2009-10-22 1.增加小沙盘拖动类(鹰眼视图) BirdEye.js 完成小沙盘到地图的同步,同步方法:检测mouseup事件触发->修改url->request->计算坐标->同步行为 2.增加小沙盘样式表BirdEye.css 地图图片路径birdeyemap 3.完成window.parent地图->小沙盘的同步 问题:小沙盘->window.parent地图存在bug,可以尝试开启 2009-10-23 1.在小沙盘增加浮动绿色框 2009-11-6 1.实现“鹰眼地图”不需移动,一幅可以看到见全景, 当主场景移动时,“鹰眼地图”只有小框在移动。 同时“小框” 主场景也在移动。 2009-12-17 1.测距功能事件配置 2009-12-21 1.完成测距功能 2009-12-22 1.配置搜索功能,后台改用s2sh框架 2.完成hessian+spring+hibernate整合,提供建筑信息和公司信息hessian查找服务 2009-12-23 1.配置hessian服务端缓存 2.配置hessian日志记录,输出到文件/log/wzucxd/html 3.完成建筑信息显示页,配置2级缓存 4.配置oscache 5.配置新闻信息模块 2010-1-13 1.完成chrome和ff下的搜索功能 2.搜索功能支持ie6.0+ //设置Theodolite$setPoint var cpointtmp = new CPoint(this.holder.offsetLeft + evt.clientX - this.mvl.offsetLeft, this.mvl.offsetTop + evt.clientY - this.mvl.offsetTop); Theodolite$setPoint(cpointtmp);
要使用Vue.jsecharts实现3D世界地图,您需要遵循以下步骤: 1. 安装echartsecharts-gl 使用npm或yarn安装echartsecharts-gl。 ``` npm install echarts echarts-gl --save ``` 2. 创建Vue.js组件 创建一个Vue.js组件,并在其引入echarts。 ``` <template> <div ref="chart" style="width:100%;height:600px;"></div> </template> <script> import echarts from 'echarts'; import 'echarts-gl'; export default { name: 'WorldMap', data() { return { chart: null }; }, mounted() { this.chart = echarts.init(this.$refs.chart); this.chart.setOption(this.getOption()); }, methods: { getOption() { return { globe: { baseTexture: '/static/img/map/world.topo.bathy.200401.jpg', heightTexture: '/static/img/map/world.topo.bathy.200401.jpg', displacementScale: 0.1, shading: 'lambert', environment: '/static/img/map/starfield.jpg', light: { ambient: { intensity: 0.1 }, main: { intensity: 1.5 } }, viewControl: { autoRotate: true } }, series: [{ type: 'lines3D', coordinateSystem: 'globe', data: this.getLinesData(), lineStyle: { width: 1, color: '#00ffff' } }] }; }, getLinesData() { // 根据需要自己获取数据 return [ // 数据格式:[[起点经度, 起点纬度], [终点经度, 终点纬度]] [[-73.985664, 40.748817], [139.710164, 35.706962]], [[-118.243685, 34.052312], [139.710164, 35.706962]], [[-0.126608, 51.507227], [139.710164, 35.706962]], [[-74.005941, 40.712784], [139.710164, 35.706962]], [[-122.419416, 37.774929], [139.710164, 35.706962]], [[-87.629798, 41.878114], [139.710164, 35.706962]], [[-77.036871, 38.907192], [139.710164, 35.706962]], [[-77.208946, 38.882334], [139.710164, 35.706962]], [[-118.4911912, 34.0194543], [139.710164, 35.706962]], [[-118.3273455, 34.0830908], [139.710164, 35.706962]], [[-122.4194155, 37.7749295], [139.710164, 35.706962]], [[-0.126608, 51.507227], [139.710164, 35.706962]], [[-73.9866136, 40.7292535], [139.710164, 35.706962]], [[-118.243685, 34.052312], [139.710164, 35.706962]], [[-77.036871, 38.907192], [139.710164, 35.706962]], [[-87.6297982, 41.8781136], [139.710164, 35.706962]], [[-77.208946, 38.882334], [139.710164, 35.706962]], [[-80.1917902, 25.7616798], [139.710164, 35.706962]], [[-118.4911912, 34.0194543], [139.710164, 35.706962]], [[-118.3273455, 34.0830908], [139.710164, 35.706962]], [[-74.0059413, 40.7127837], [139.710164, 35.706962]], [[-73.9856644, 40.7488168], [139.710164, 35.706962]], [[-122.4194155, 37.7749295], [139.710164, 35.706962]], [[-122.419416, 37.774929], [139.710164, 35.706962]], [[-74.005941, 40.712784], [139.710164, 35.706962]], [[-118.243685, 34.052312], [139.710164, 35.706962]], [[-87.629798, 41.878114], [139.710164, 35.706962]], [[-77.036871, 38.907192], [139.710164, 35.706962]], [[-77.208946, 38.882334], [139.710164, 35.706962]], [[-118.4911912, 34.0194543], [139.710164, 35.706962]], [[-118.3273455, 34.0830908], [139.710164, 35.706962]], [[-0.126608, 51.507227], [139.710164, 35.706962]], [[-73.9866136, 40.7292535], [139.710164, 35.706962]], [[-122.4194155, 37.7749295], [139.710164, 35.706962]], [[-74.0059413, 40.7127837], [139.710164, 35.706962]], [[-73.9856644, 40.7488168], [139.710164, 35.706962]], [[-118.243685, 34.052312], [139.710164, 35.706962]], [[-87.6297982, 41.8781136], [139.710164, 35.706962]], [[-77.036871, 38.907192], [139.710164, 35.706962]], [[-77.208946, 38.882334], [139.710164, 35.706962]], [[-118.4911912, 34.0194543], [139.710164, 35.706962]], [[-118.3273455, 34.0830908], [139.710164, 35.706962]], [[-122.419416, 37.774929], [139.710164, 35.706962]], [[-0.126608, 51.507227], [139.710164, 35.706962]], [[-73.9866136, 40.7292535], [139.710164, 35.706962]], [[-118.243685, 34.052312], [139.710164, 35.706962]], [[-74.005941, 40.712784], [139.710164, 35.706962]], [[-73.985664, 40.748817], [139.710164, 35.706962]], [[-87.629798, 41.878114], [139.710164, 35.706962]], [[-77.036871, 38.907192], [139.710164, 35.706962]], [[-77.208946, 38.882334], [139.710164, 35.706962]], [[-80.1917902, 25.7616798], [139.710164, 35.706962]], [[-118.4911912, 34.0194543], [139.710164, 35.706962]], [[-118.3273455, 34.0830908], [139.710164, 35.706962]], [[-122.4194155, 37.7749295], [139.710164, 35.706962]] ]; } } }; </script> ``` 3. 通过组件显示地图Vue.js应用程序使用地图组件。 ``` <template> <div> <WorldMap /> </div> </template> <script> import WorldMap from './WorldMap.vue'; export default { components: { WorldMap } }; </script> ``` 这样,您就可以在Vue.js应用程序使用echarts来显示3D世界地图了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木易66丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值