百摩网
当前位置: 首页 生活百科

echarts地图3d效果(用好Echart5绘制地图)

时间:2023-07-21 作者: 小编 阅读量: 4 栏目名: 生活百科

二层放在中间,实现基本的地图层,显示对应各个区域的名称。三层放在最外层,实现数据标记,对应地图里圆圈和数据。捕捉georoam事件,上层的geo缩放、偏移的时候,让下层的map跟着上层同步进行。

可视化我们已不再陌生,地图也很常用。有很多公司业务范围可能仅限于某个市区,所以画一个 china 地图意义不大,就只需要绘制某个省份或者市区的地图,然后统计各个区域的一个分布情况,具体的效果如图所示:

一、实现原理:

绘制地图之前,我们先需要明白实现原理是啥样的,然后按照具体的实现步骤,依次实现效果。如果不明白原理,每次完成的都是复制粘贴。

1、开始之前,先确认自己的地图需要分几层,及其作用。

2、该效果实现,需要三层地图实现效果。

  • 一层放在最底层,设置地图的边框,对应地图里最外层的蓝色地图线。
  • 二层放在中间,实现基本的地图层,显示对应各个区域的名称。
  • 三层放在最外层,实现数据标记,对应地图里圆圈和数据。

3、拖动或缩放的时候出现错位,使其同步缩放和拖动

二、Echarts 使用五部曲:

1、下载并引入 echarts

Echarts 已更新到了 5.0 版本,安装完记得检查下自己的版本是否是 5.0 。

npm install echarts --save

下载地图的 json 数据

可以下载中国以及各个省、市、区地图数据。免费的文件下载地址:

http://datav.aliyun.com/portal/school/atlas/area_selector#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5

下载对应的省份或者市区的地图数据。

引入:

import * as echarts from "echarts"import chinaJSON from '../../assets/json/china.json'

2、准备容器

给元素定义宽高确定的容器用来装地图。

<template> <div ref="xian"></div></template>

3、实例化 echarts 对象

import * as echarts from 'echarts'import xianJSON from '../../assets/json/xian.json'const xian = ref()var myChart = echarts.init(xian.value)// 创建了一个 myChart 对象

如果是绘制的地图,需要先引入和注册地图:

echarts.registerMap('xa', xianJSON)

4、指定配置项和数据

var option = { // 存放需要绘制图片类型,以及样式设置}

5、给 echarts 对象设置配置项

myChart.setOption(option)

三、具体实现步骤

步骤1:绘制基本地图层,显示各个区域。

具体代码为:

<template> <div><div ref="xian"></div> </div></template><script lang="ts" setup>import { ref, onMounted } from 'vue'import * as echarts from 'echarts'import xianJSON from '../../assets/json/xian.json'const xian = ref()onMounted(() => { drwaMap()})function drwaMap() { var myChart = echarts.init(xian.value) echarts.registerMap('xa', xianJSON) var option = {geo: {map: 'xa',zoom: 1,roam: true,center: [109.00853, 34.11078],label: {show: true,color: 'rgba(255,255,255,0.2)',},itemStyle: {normal: {areaColor: '#080b1a',borderColor: 'rgba(0,116,255,0.2)',borderWidth: 2,borderType: 'dashed',},emphasis: {areaColor: '#4f6ee9',color: 'rgba(255,255,255,0.8)',},},}, } myChart.setOption(option)}</script>

步骤2:底层绘制一个地图层,设置地图外层边框

添加 series 属性,再绘制一个地图层,利用 z 放到最底层。

series: [ //绘制一个新地图 {type: 'map',map: 'xa',zoom: 1,roam: true,center: [109.00853, 34.11078],z: -1, // 置于底层itemStyle: {normal: {areaColor: '#2e488f',borderColor: '#0074ff',borderWidth: 5,//设置外层边框线粗细},}, },],

步骤3:添加分布的数据点标记

给 series 中再添加一个配置项:

{ type: 'effectScatter', // 特效散点图 coordinateSystem: 'geo', symbol: 'circle', // symbolSize 设置标记点的大小, //把大小限制再 30 - 50 之间 symbolSize: function (val) {return 30(val[2] / 100) * 20 }, colorBy: 'series', //显示name并设置样式 label: {show: true,formatter: function (data) {return data.value[2]},color: '#080b1a',fontSize: '16',offset: [0, 0],align: 'center',},//涟漪效果设置 rippleEffect: {color: '#32479d',number: 3,period: 4,scale: 2,brushType: 'stroke', }, itemStyle: {normal: {color: '#00e6ff',borderColor: '#32479d',borderWidth: 2, }, }, data: [{ name: '蓝田', value: [109.423479, 34.181634, 50] },{ name: '长安区', value: [108.923479, 34.110134, 30] },{ name: '周至县', value: [108.123479, 34.010134, 2] },{ name: '鄠邑区', value: [108.573479, 34.100134, 4] },{ name: '临潼区', value: [109.283479, 34.510134, 3] },{ name: '高陵区', value: [109.059479, 34.550134, 1] }, ],},

步骤4:处理放大缩小时不同步的问题。

捕捉 georoam 事件,上层的 geo 缩放、偏移的时候,让下层的 map 跟着上层同步进行。添加代码:

myChart.on('georoam', function (params) { var option = myChart.getOption() //获得option对象 if (params.zoom != null && params.zoom != undefined) {//捕捉到缩放时option.series[0].zoom = option.geo[0].zoom //下层geo的缩放等级跟着上层的geo一起改变option.series[0].center = option.geo[0].center //下层的geo的中心位置随着上层geo一起改变 } else { //捕捉到拖曳时option.series[0].center = option.geo[0].center //下层的geo的中心位置随着上层geo一起改变 } myChart.setOption(option) //设置option})

四、完整源码

<template><div><divref="xian"style="width: 100%;height: 800px;border: solid 1px red;background: #0c0b2a;"></div></div></template><script lang="ts" setup>import { ref, onMounted } from 'vue'import * as echarts from 'echarts'import xianJSON from '../../assets/json/xian.json'const xian = ref()onMounted(() => {drwaMap()})function drwaMap() {var myChart = echarts.init(xian.value)echarts.registerMap('xa', xianJSON)var option = {geo: {map: 'xa',zoom: 1,roam: true,center: [109.00853, 34.11078],label: {show: true,color: 'rgba(255,255,255,0.2)',},itemStyle: {normal: {areaColor: '#080b1a',borderColor: 'rgba(0,116,255,0.2)',borderWidth: 2,borderType: 'dashed',},emphasis: {areaColor: '#4f6ee9',color: 'rgba(255,255,255,0.8)',},},},series: [//绘制一个新地图{type: 'map',map: 'xa',zoom: 1,roam: true,center: [109.00853, 34.11078],z: -1,itemStyle: {normal: {areaColor: '#2e488f',borderColor: '#0074ff',borderWidth: 5,},},},{type: 'effectScatter', // 特效散点图coordinateSystem: 'geo',symbol: 'circle',symbolSize: function (val) {return 30(val[2] / 100) * 20},colorBy: 'series',//显示name并设置样式label: {show: true,formatter: function (data) {return data.value[2]},color: '#080b1a',fontSize: '16',offset: [0, 0],align: 'center',},//涟漪效果设置rippleEffect: {color: '#32479d',number: 3,period: 4,scale: 2,brushType: 'stroke',},itemStyle: {normal: {color: '#00e6ff',borderColor: '#32479d',borderWidth: 2,},},data: [{ name: '蓝田', value: [109.423479, 34.181634, 50] },{ name: '长安区', value: [108.923479, 34.110134, 30] },{ name: '周至县', value: [108.123479, 34.010134, 2] },{ name: '鄠邑区', value: [108.573479, 34.100134, 4] },{ name: '临潼区', value: [109.283479, 34.510134, 3] },{ name: '高陵区', value: [109.059479, 34.550134, 1] },],},],}myChart.setOption(option)// 同步缩放、偏移myChart.on('georoam', function (params) {var option = myChart.getOption() //获得option对象if (params.zoom != null && params.zoom != undefined) {//捕捉到缩放时option.series[0].zoom = option.geo[0].zoom //下层geo的缩放等级跟着上层的geo一起改变option.series[0].center = option.geo[0].center //下层的geo的中心位置随着上层geo一起改变} else {//捕捉到拖曳时option.series[0].center = option.geo[0].center //下层的geo的中心位置随着上层geo一起改变}myChart.setOption(option) //设置option})}</script>

    推荐阅读
  • 五一假期即将结束的提醒(定了五一假期免费)

    五一假期即将结束的提醒“五一”假期已经进入倒计时啦!今天,交通运输部表示“五一”假期7座小型客车免费通行全国收费公路!厦门交警支队根据以往“五一”假期期间交通大数据和近期道路交通运行情况综合分析对今年“五一”假期期间道路交通运行情况进行研判预测!“五一”假期期间人员车辆流动将有所减少,预测省内市际车流量相较往年“五一”假期将有明显的下降。

  • 不软弱最炫qq昵称很过火(有深意有故事qq昵称)

    携酒天涯原来无话可说,今天小编就来聊一聊关于不软弱最炫qq昵称很过火?接下来我们就一起去研究一下吧!不软弱最炫qq昵称很过火携酒天涯原来无话可说记忆的痕迹与昨日相同成长中的男神自己的英雄敢闯敢拼耐性与骨气热血与梦想夢在遠方妳我即是江湖不怕留给时光遗忘归途的路深情迎风散

  • 九十年代以后各国空难人数(给救生衣充气后)

    当天,有一架飞机正要执行新的飞行任务,任务代号是ET961。飞机预计从埃塞俄比亚的首都亚的斯亚贝巴飞往科特迪瓦境内的阿让比,途中经停肯尼亚首都内罗毕,进行第二次燃油注入。第二次是在737客机上,劫机者绑架了一名空乘,要求阿巴特飞往瑞典。在961航班正式起飞前,飞机油箱中的燃油并没有加满。当空乘通知旅客们,飞机即将抵达内罗毕机场时,这三名乘客突然起身。

  • 王者荣耀六周年限定皮肤如何得(6周年限定皮肤正面照曝光)

    《三国志》中有记载,诸葛亮用空城计吓走了魏国大将司马懿,彼时诸葛亮就是一个人独坐城楼之上抚琴高歌,吓退了魏国大军。说的就是周瑜在醉酒之后,还能听出抚琴之人的错音,所以周瑜不仅会弹琴,而且弹得还不错呢。而且最近几个赛季周瑜的登场率也逐渐升高,周瑜也很久没有出过新皮肤了,所以周年限定皮肤给周瑜也有一定可能。

  • 洋妞在我家最新(洋妞到我家接地气)

    徐帆扮演的母亲文娟是全片的核心人物,也是颇具代表性的中国式母亲。不过,这位凡事都要求最好的母亲面对中国的空气污染、食品安全等社会问题却也只有徒呼奈何。应该说徐帆较为生动地演绎出了中国式母亲的焦虑,也真实地反映了中国社会转型期的一些民众心态。文娟的移民申请最后得到的工作竟是为死人化妆,这无疑是对热衷移民的国人们的一个戏谑嘲讽。而在外走失时,女儿却通过哥伦比亚女孩教的办法,机智地找到了警察叔叔。

  • 水果泡芙的做法(水果泡芙的烹饪技巧分享)

    水果泡芙的做法主料:水160克、黄油80克、低粉100克、盐1.5克、鸡蛋3个、糖15克、夹馅淡奶油200克、夹馅糖15克。倒入过筛的低粉,迅速搅拌成团。面糊凉至不烫手,分次加入蛋液。蛋液加完搅拌好的面糊状态是提起刮刀,面糊成倒三角形。放入预热好的烤箱,200度烤至泡芙膨胀,后转170度烤20分钟,具体时间温度请参考自家烤箱。把泡芙从中间剖开,挤入打发后的淡奶油。

  • 苹果6icloud密码忘记怎么办(苹果6icloud密码忘记的解决方法)

    下面更多详细答案一起来看看吧!苹果6icloud密码忘记怎么办用户在最初注册ID账号密码的时,绑定的邮箱即是ID账号。ID密码可以前往苹果官网,点击页面中的“重设密码”链接。进入网站后输入AppleID账户名,选择重置密码,点击下一步按继续。随后系统提示一封用于恢复密码的电子邮件已经发出。

  • 阿里斯顿什么时候发展(在你看不见的地方守护蔚蓝)

    借此契机,阿里斯顿热能集团成为WWF2016年官方合作伙伴,以更多实际行动促进社会的可持续发展。WWF的使命是遏止地球自然环境的恶化,创造人类与自然和谐相处的美好未来。地球一小时倡导公众、政府、企业等社会各界在每年3月最后一个周六晚上8点半到9点半,关掉不必要的灯和其他耗电设备,以表达对气候变化的关注。2014年,地球一小时席卷了全球超过162个国家和地区、7000座城市,吸引了数亿名支持者。

  • 佩戴翡翠的注意事项(盘点佩戴翡翠的注意事项)

    佩戴翡翠挂件,要注意检查红绳、项链是否结实,发现坏了要及时更换。翡翠具有很强的韧性,但不意味着不怕摔打。在佩戴翡翠首饰时,尽量避免使它从高处坠落或撞击硬物,尤其是有少量裂纹的翡翠首饰,否则很容易破裂或损伤。佩戴和收藏翡翠饰品时,要避免与其它宝石、钻石类首饰直接接触,以免产生损伤。对于镶嵌类翡翠饰品,最好定期到珠宝店清洗和检查,防止金属爪托松弛,翡翠脱落。

  • 关于元宵节的诗词(八首诗词中的醉美元宵节)

    月上柳梢头,人约黄昏后。今年元夜时,月与灯依旧。这首诗,惊艳了千年,是元宵节成为中华情人节的最佳宣言!年年乐事,华灯竞处,人月圆时。禁街箫鼓,寒轻夜永,纤手重携。《生查子·元夕戏陈敬叟》如果是老夫老妻,在元宵节这天,也可以过得别有风味。“物色旧时同,情味中年别”,虽然元宵夜跟年轻时的元宵夜相似,但对于中年夫妇来说,今年的元宵节也是别有风味的。不如归去,难畴畴昔,总是团圆月。