致新的一年:不知不觉已经是2023年,祝新的一年大展宏图(兔),前途(兔)似锦,今年梦想实现!

正文:

接触echarts也有很长一段时间了,最近有个很常见的需求,实现省市区下钻,高亮一些有数据的区域例如中国地图的广东省、北京市,接到这个需求,脑海里思考的问题有:(1)通过什么去实现这种下钻文件的拿取 (2)如何实现指定区域的高亮效果(3)地图数据如何跟后端维持一致

产品想实现的效果实际上类似如下+下钻功能:

问题(1):

对echarts有过经验的会发现echarts上面点击事件默认返回的只有点击区域的name中文值,一般都会通过name值去匹配前端写好的一份如{'广东省':'4400000'}实现对应省份区域编码的拿取,这样是很不科学的,毕竟区域名称并不是一成不变的,后端的中文名字也不一定会跟前端保持一致,所以问题来了,如何让echarts点击事件能返回我们想要的数据,例如返回如data:{name:'广东省',code:4400000,xxx}等数据?直接上实现方案:借助geo图层结合series里面的map层赋值

方案一:name值获取对应文件,准备好省市区对应的区域编码code json文件,获取地图json文件跟实现下钻网上已经有很多好文,在此不再讲实现方案(大神们自行百度google, 棒棒哒)

this.myChart.on('click',params=>{// 实现地图下钻const {data={}}= paramsconst {name=''} = dataconst mapObj = {'广东':44000000,'上海':xxxxx}// 获取对应的json文件处理方法getMapJSON(`${mapObj[name]}.json`).then(()=>{console.log("下钻后对应处理")})})

方案二:方案一拿到的只能拿到区域名称,并没办法拿到区域编码和相关id,方案二拿取地图geojson文件里面自带对应属性值获取,个人建议这个方法更好,可以自定义一些属性值,直接上例子demo

(1)观察geojson,我们会发现features里面的properties很多情况都会需要使用到,如下

(2)思路:获取到这个属性的属性值,实现,上代码:

方法一(需要下钻建议该方式):

 // 方法一:注入文件后拿geoJSON数据中的properties属性axios({method: "get",url: "/china.json",}).then((res) => {const mapName = "china";echarts.registerMap(mapName, (data) => {console.log("获取中国地图数据", data);let arr = [];data.features.forEach((item) => {let obj = {name: item.properties.name,id: (item.properties && item.properties.id) || item.id,};arr.push(obj);});});});

方法二:

<template><div id="chart" style="height: 800px; width: 800px"></div>
</template><script>
import * as echarts from "echarts";
// import axios from "axios";export default {data() {return {myChart: null,};},mounted() {this.setOptions();},methods: {setOptions() {this.myChart = echarts.init(document.getElementById("chart"));// 方法一:注入文件后拿geoJSON数据中的properties属性// axios({//   method: "get",//   url: "/china.json",// }).then((res) => {//   const mapName = "china";//   echarts.registerMap(mapName, (data) => {//     console.log("获取中国地图数据", data);//     let arr = [];//     data.features.forEach((item) => {//       let obj = {//         name: item.properties.name,//         id: (item.properties && item.properties.id) || item.id,//       };//       arr.push(obj);//     });//   });// });var mapName = "china";var data = [{ name: "北京", value: 199 },{ name: "天津", value: 42 },{ name: "河北", value: 102 },{ name: "山西", value: 81 },{ name: "内蒙古", value: 47 },{ name: "辽宁", value: 67 },{ name: "吉林", value: 82 },{ name: "黑龙江", value: 123 },{ name: "上海", value: 24 },{ name: "江苏", value: 92 },{ name: "浙江", value: 114 },{ name: "安徽", value: 109 },{ name: "福建", value: 116 },{ name: "江西", value: 91 },{ name: "山东", value: 119 },{ name: "河南", value: 137 },{ name: "湖北", value: 116 },{ name: "湖南", value: 114 },{ name: "重庆", value: 91 },{ name: "四川", value: 125 },{ name: "贵州", value: 62 },{ name: "云南", value: 83 },{ name: "西藏", value: 9 },{ name: "陕西", value: 80 },{ name: "甘肃", value: 56 },{ name: "青海", value: 10 },{ name: "宁夏", value: 18 },{ name: "新疆", value: 180 },{ name: "广东", value: 123 },{ name: "广西", value: 59 },{ name: "海南", value: 14 },];var geoCoordMap = {};var toolTipData = [{name: "北京",value: [{ name: "科技人才总数", value: 95 },{ name: "理科", value: 82 },],},{name: "天津",value: [{ name: "文科", value: 22 },{ name: "理科", value: 20 },],},{name: "河北",value: [{ name: "文科", value: 60 },{ name: "理科", value: 42 },],},{name: "山西",value: [{ name: "文科", value: 40 },{ name: "理科", value: 41 },],},{name: "内蒙古",value: [{ name: "文科", value: 23 },{ name: "理科", value: 24 },],},{name: "辽宁",value: [{ name: "文科", value: 39 },{ name: "理科", value: 28 },],},{name: "吉林",value: [{ name: "文科", value: 41 },{ name: "理科", value: 41 },],},{name: "黑龙江",value: [{ name: "文科", value: 35 },{ name: "理科", value: 31 },],},{name: "上海",value: [{ name: "文科", value: 12 },{ name: "理科", value: 12 },],},{name: "江苏",value: [{ name: "文科", value: 47 },{ name: "理科", value: 45 },],},{name: "浙江",value: [{ name: "文科", value: 57 },{ name: "理科", value: 57 },],},{name: "安徽",value: [{ name: "文科", value: 57 },{ name: "理科", value: 52 },],},{name: "福建",value: [{ name: "文科", value: 59 },{ name: "理科", value: 57 },],},{name: "江西",value: [{ name: "文科", value: 49 },{ name: "理科", value: 42 },],},{name: "山东",value: [{ name: "文科", value: 67 },{ name: "理科", value: 52 },],},{name: "河南",value: [{ name: "文科", value: 69 },{ name: "理科", value: 68 },],},{name: "湖北",value: [{ name: "文科", value: 60 },{ name: "理科", value: 56 },],},{name: "湖南",value: [{ name: "文科", value: 62 },{ name: "理科", value: 52 },],},{name: "重庆",value: [{ name: "文科", value: 47 },{ name: "理科", value: 44 },],},{name: "四川",value: [{ name: "文科", value: 65 },{ name: "理科", value: 60 },],},{name: "贵州",value: [{ name: "文科", value: 32 },{ name: "理科", value: 30 },],},{name: "云南",value: [{ name: "文科", value: 42 },{ name: "理科", value: 41 },],},{name: "西藏",value: [{ name: "文科", value: 5 },{ name: "理科", value: 4 },],},{name: "陕西",value: [{ name: "文科", value: 38 },{ name: "理科", value: 42 },],},{name: "甘肃",value: [{ name: "文科", value: 28 },{ name: "理科", value: 28 },],},{name: "青海",value: [{ name: "文科", value: 5 },{ name: "理科", value: 5 },],},{name: "宁夏",value: [{ name: "文科", value: 10 },{ name: "理科", value: 8 },],},{name: "新疆",value: [{ name: "文科", value: 36 },{ name: "理科", value: 31 },],},{name: "广东",value: [{ name: "文科", value: 63 },{ name: "理科", value: 60 },],},{name: "广西",value: [{ name: "文科", value: 29 },{ name: "理科", value: 30 },],},{name: "海南",value: [{ name: "文科", value: 8 },{ name: "理科", value: 6 },],},];/*获取地图数据*/this.myChart.showLoading();var mapFeatures = echarts.getMap(mapName).geoJson.features;console.log("获取地图geojson文件数据", mapFeatures);let arr = [];mapFeatures.forEach((item) => {let obj = {name: item.properties.name,id: (item.properties && item.properties.id) || item.id,};arr.push(obj);});this.myChart.hideLoading();mapFeatures.forEach(function (v) {// 地区名称var name = v.properties.name;// 地区经纬度geoCoordMap[name] = v.properties.cp;});console.log(data);console.log(toolTipData);var convertData = function (data) {var res = [];for (var i = 0; i < data.length; i++) {var geoCoord = geoCoordMap[data[i].name];if (geoCoord) {res.push({name: data[i].name,value: geoCoord.concat(data[i].value),});}}return res;};const option = {tooltip: {padding: 0,enterable: true,transitionDuration: 1,textStyle: {color: "#000",decoration: "none",},},// 目前还没有visualMap与geo结合的方案,后续找到方案再更新,有大神也欢迎提供分享方案geo: {show: true,map: mapName,roam: true, // 开启缩放,注意把setOption第二个属性值设置为trueregions: data.map((item) => {// 在此自定义其他逻辑的颜色item = Object.assign(item, {label: {normal: {show: true,},emphasis: {show: false,textStyle: {color: "#fff",},},},itemStyle: {normal: {areaColor: "#031525",borderColor: "#3B5077",},emphasis: {areaColor: "#2B91B7",},},});return item;}), // 将突出某个省份颜色迁移到geo中去实现},series: [{name: "散点",type: "scatter",coordinateSystem: "geo",data: convertData(data),symbolSize: function (val) {return val[2] / 10;},label: {normal: {formatter: "{b}",position: "right",show: true,},emphasis: {show: true,},},itemStyle: {normal: {color: "#fff",},},},{type: "map",map: mapName,geoIndex: 0, // 指定地图图层对应的geoaspectScale: 0.75, //长宽比label: {normal: {show: true,},emphasis: {show: false,textStyle: {color: "#fff",},},},roam: true,itemStyle: {normal: {areaColor: "#031525",borderColor: "#3B5077",},emphasis: {areaColor: "#2B91B7",},},animation: false,showLegendSymbol: false, // 存在legend时显示// 注意注意:此处data不用于渲染省份高亮数组,而是用于把geojson中的属性值赋值,以便点击时候能拿到对应信息data: arr,},{name: "点",type: "scatter",coordinateSystem: "geo",zlevel: 6,},{name: "Top 5",type: "effectScatter",coordinateSystem: "geo",data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 10)),symbolSize: function (val) {return val[2] / 10;},showEffectOn: "render",rippleEffect: {brushType: "stroke",},hoverAnimation: true,label: {normal: {formatter: "{b}",position: "left",show: false,},},itemStyle: {normal: {color: "yellow",shadowBlur: 10,shadowColor: "yellow",},},zlevel: 1,},],};// 加上true可以防止开启geo中roam导致的重绘位置偏移this.myChart.setOption(option, true);// 防止重复触发点击事件this.myChart.off("click");this.myChart.on("click", (params) => {// 实现地图下钻const { data = {} } = params;console.log("data", data);});},},
};
</script>

执行代码打开控制台即可看到相关数据输出

问题(2):

如何对对应的省份进行颜色渲染或者高亮,上面问题(1)中的方案二可以发现,有两种实现方案

方法一:在series里面map层赋值data,结合visualMap设置颜色根据值分层

    visualMap: {show: true,min: 0,max: 200,left: '10%',top: 'bottom',calculable: true,seriesIndex: [1],inRange: {color: ['#04387b', '#467bc0'] // 蓝绿}},series里面:{type: 'map',map: mapName,geoIndex: 0,aspectScale: 0.75, //长宽比showLegendSymbol: false, // 存在legend时显示label: {normal: {show: true},emphasis: {show: false,textStyle: {color: '#fff'}}},roam: true,itemStyle: {normal: {areaColor: '#031525',borderColor: '#3B5077',},emphasis: {areaColor: '#2B91B7'}},animation: false,data: data},

方法二:在geo的regions里面渲染,样式逻辑也只能自己去渲染,目前还没有很好的方案可以让geo的区域颜色结合上visualMap的区块颜色渲染逻辑,data此时存放的是所有省份的属性信息

var mapFeatures = echarts.getMap(mapName).geoJson.features;console.log("获取地图geojson文件数据", mapFeatures);let arr = [];mapFeatures.forEach((item) => {let obj = {name: item.properties.name,id: (item.properties && item.properties.id) || item.id,};arr.push(obj);});

问题(3):

一遇到这种问题估计得前后端干一架才能统一,前端目前也只能手动修改geo里面的id,不过目前感觉geojson里面的编码还是比较标准的,毕竟有个国际标准在那,也只能发现哪些不太匹配的就去改哪个了~

附:

文章引用的大神demo:https://madeapie.com/#/chartInfo/xnmZ5X4gCz

中国地图json文件链接:https://madeapie.com/dep/echarts/map/js/china.js

echarts省市区id(区域编码)实现地图下钻点击(data赋值自定义属性值,geojson信息获取)相关推荐

  1. echarts 省级地图下钻到市demo

    借鉴了 昨夜小楼又东风 这位兄弟的代码 https://blog.csdn.net/m0_46577631/article/details/124354267?utm_medium=distribut ...

  2. 地图下钻、地图点聚合

    地图下钻.地图点聚合 需求 mapUnder-points 技术 数据库 地图下钻 地图点聚合 项目地址:mapUnder-points 需求 首先是需要有一个地图下钻的功能来展示不同地区的数据,其次 ...

  3. Echarts使用map3D+visualMap 实现地图下钻,区域高亮状态下变高

    想要实现3D地图省市区下钻,地图区域用不同颜色区分数值大小,当hover区域时,当前区域变高,点击下钻  js核心代码 data() {return {cityData,mapData,cityLis ...

  4. vue使用echarts来绘制中国地图下钻省市区县级地图

    文章目录 前言 一.echarts 二.使用步骤 1.vue安装.引入echarts 2.使用echarts 总结 前言 公司需要一个中国地图点击可进入省市区县级,但是在我使用echarts绘制中国地 ...

  5. Echarts+高德地图,获取全国省市区,区域板块地图获取并高亮显示

    当用户选择省市区之后,可以看到对应区域的高亮显示. 如图: 之前用户选择的是江苏省,因此当前高亮显示的是江苏省地图板块,如果之前用户选择的是成都市,那么地图则会变成四川省的版图,高亮显示成都市,如下图 ...

  6. 基于Echarts插件的省市区多级地图下钻和返回功能实现

    Echarts3的离线地图组件,比echart2更容易实现省市区多级离线地图的展示. 当然echart2也是可以实现,由于echarts是基于canvas,加载一个地图无非就是加载一张图.而这张图,则 ...

  7. echarts 地图下钻 到市 到区

    echarts的地图展示,并且带有下钻到下级市区 vue.js里面操作echarts //vue里面修改模板 <template><div id="china_map_bo ...

  8. echarts+echarts-gl vue2制作3D地图+下钻功能+标记点功能,解决dblclick事件失效问题,解决地图下钻后边框不更新保留问题

    目录 先看实现效果:​编辑 步骤一 安装echarts和echarts-gl 步骤二 设置地图容器 在methods中设置初始化地图方法并在mounted中调用 在methods中设置初始化地图方法 ...

  9. vue中基于echarts和基于高德地图的两种地图下钻与上浮方式

    ** vue中基于echarts和基于高德地图的两种地图下钻与上浮方式 ** 基于echarts的地图下钻与上浮(浙江省为例) 第一步:在<template>中构建承载echarts的do ...

最新文章

  1. 怎样用python自动化办公_会python基础,如何学习自动化办公?
  2. 计算机二级7月考试,2020年计算机二级MS Office考试每日一练(7月27日)
  3. html border阴影效果_HTML | 简易相册制作
  4. 信息系统项目管理师案例考试汇总(2005~2021年)
  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
  6. labview变量和C语言,LabVIEW
  7. 企业应用快速跨向容器时代的正确姿势
  8. Linux下C语言编程风格和规范
  9. 在ghost时加载smartdrv.exe是否会提高速度
  10. 解决数据质量问题方案
  11. sublime text2-text3 定义的不同浏览器的预览快捷键
  12. Unity中通过ButtonClicked更换GameOgject纹理图片
  13. 律动荆棘皇冠 Crown of Thorns
  14. ML(5)——神经网络1(神经元模型与激活函数)
  15. go import几种用法
  16. 从工作杠杆率引申至对软件工程质量控制的思考
  17. 2.PyTorch的Dataset和DataLoader
  18. 再见2018,感谢你的一路陪伴
  19. MT8735芯片技术资料解析,MT8735处理器简介
  20. ros2 for 思岚AI雷达

热门文章

  1. java中不可变对象(immutable object)是什么,有什么意义
  2. python实现BMI计算器
  3. 4.3 期货每日早盘操作建议
  4. 美国东部时间和北京时间之间的转换
  5. 浅谈机器学习-回归与分类的区别
  6. 计算机网络三元组,计算机网络chap07 传输层(1) - 三元组 五元组.pdf
  7. 关于程序员入职一家公司需要问咨询的一些的问题(面试总结)
  8. 利用snowfall.jquery.js实现爱心满屏飞
  9. numpy函数:arange(),reshape()用法,
  10. diybox路由器设置教程_一个简单的无线路由器入门设置教程,非常实用