echarts中国及省份地图以及阴影的显示
Posted 星涑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了echarts中国及省份地图以及阴影的显示相关的知识,希望对你有一定的参考价值。
echarts中国及省份合并地图以及阴影的显示
一、写在前面
因为百度echarts不在提供地图,所以需要在一些网站上找一些地图的json数据,所以总结了一些站点;
1:http://datav.aliyun.com/portal/school/atlas/area_selector ------- 阿里云地图数据下载
2:https://api.map.baidu.com/lbsapi/getpoint/index.html ------------ 百度坐标拾取系统定位
3:https://pan.baidu.com/s/16A-WG_bufpW3RsWCcMv1VQ ------ 百度网盘下载,是接下来当前项目所用的依赖文件,提取码:d6pw,内容如图
二、开发
1.成果图:
2.业务需求是首先展示中国地图,根据不一样的省份名称,来显示不一样的省份合并地图,如北京、天津,河北三个省市合并的地图,这里需要根据这三个名称生成这个地图。
a.所以首先整理出地图json和对应的名称数组:(引入文件百度网盘下载)
/*** @文件名:provinceMap.js @来源:Winford.Wang|2021-12-30,17:51 @描述:地图绑定数据数据来源 ***/ import beijing from \'@/modules/datacenter/assets/json/geometryProvince/11.json\'; import tianjin from \'@/modules/datacenter/assets/json/geometryProvince/12.json\'; import hebei from \'@/modules/datacenter/assets/json/geometryProvince/13.json\'; import shanxi from \'@/modules/datacenter/assets/json/geometryProvince/14.json\'; import neimenggu from \'@/modules/datacenter/assets/json/geometryProvince/15.json\'; import liaoning from \'@/modules/datacenter/assets/json/geometryProvince/21.json\'; import jilin from \'@/modules/datacenter/assets/json/geometryProvince/22.json\'; import heilongjiang from \'@/modules/datacenter/assets/json/geometryProvince/23.json\'; import shanghai from \'@/modules/datacenter/assets/json/geometryProvince/31.json\'; import jiangsu from \'@/modules/datacenter/assets/json/geometryProvince/32.json\'; import zhejiang from \'@/modules/datacenter/assets/json/geometryProvince/33.json\'; import anhui from \'@/modules/datacenter/assets/json/geometryProvince/34.json\'; import fujian from \'@/modules/datacenter/assets/json/geometryProvince/35.json\'; import jiangxi from \'@/modules/datacenter/assets/json/geometryProvince/36.json\'; import shandong from \'@/modules/datacenter/assets/json/geometryProvince/37.json\'; import henan from \'@/modules/datacenter/assets/json/geometryProvince/41.json\'; import hubei from \'@/modules/datacenter/assets/json/geometryProvince/42.json\'; import hunan from \'@/modules/datacenter/assets/json/geometryProvince/43.json\'; import guangdong from \'@/modules/datacenter/assets/json/geometryProvince/44.json\'; import guangxi from \'@/modules/datacenter/assets/json/geometryProvince/45.json\'; import hainan from \'@/modules/datacenter/assets/json/geometryProvince/46.json\'; import chongqing from \'@/modules/datacenter/assets/json/geometryProvince/50.json\'; import sichuan from \'@/modules/datacenter/assets/json/geometryProvince/51.json\'; import guizhou from \'@/modules/datacenter/assets/json/geometryProvince/52.json\'; import yunnan from \'@/modules/datacenter/assets/json/geometryProvince/53.json\'; import xizang from \'@/modules/datacenter/assets/json/geometryProvince/54.json\'; import shanxisheng from \'@/modules/datacenter/assets/json/geometryProvince/61.json\'; import gansu from \'@/modules/datacenter/assets/json/geometryProvince/62.json\'; import qinghai from \'@/modules/datacenter/assets/json/geometryProvince/63.json\'; import ningxia from \'@/modules/datacenter/assets/json/geometryProvince/64.json\'; import xinjiang from \'@/modules/datacenter/assets/json/geometryProvince/65.json\'; import taiwan from \'@/modules/datacenter/assets/json/geometryProvince/71.json\'; import xianggang from \'@/modules/datacenter/assets/json/geometryProvince/81.json\'; import aomen from \'@/modules/datacenter/assets/json/geometryProvince/82.json\'; // get地图名称 const mapdata = [ name: \'北京\', data: beijing , name: \'天津\', data: tianjin , name: \'河北\', data: hebei , name: \'山西\', data: shanxi , name: \'内蒙古\', data: neimenggu , name: \'辽宁\', data: liaoning , name: \'吉林\', data: jilin , name: \'黑龙江\', data: heilongjiang , name: \'上海\', data: shanghai , name: \'江苏\', data: jiangsu , name: \'浙江\', data: zhejiang , name: \'安徽\', data: anhui , name: \'福建\', data: fujian , name: \'江西\', data: jiangxi , name: \'山东\', data: shandong , name: \'河南\', data: henan , name: \'湖北\', data: hubei , name: \'湖南\', data: hunan , name: \'广东\', data: guangdong , name: \'广西\', data: guangxi , name: \'海南\', data: hainan , name: \'重庆\', data: chongqing , name: \'四川\', data: sichuan , name: \'贵州\', data: guizhou , name: \'云南\', data: yunnan , name: \'西藏\', data: xizang , name: \'陕西\', data: shanxisheng , name: \'甘肃\', data: gansu , name: \'青海\', data: qinghai , name: \'宁夏\', data: ningxia , name: \'新疆\', data: xinjiang , name: \'台湾\', data: taiwan , name: \'香港\', data: xianggang , name: \'澳门\', data: aomen ]; export default mapdata;
b.仔细研究这个json数据,不难发现,坐标数据大概结构就是最外层包裹很多子类,最终渲染子类,所以,只要将子类合并,即可出现合并地图。因为业务需求的原因,合成地图的最外层要显示阴影,当我把地图阴影效果加上的时候地图就像长斑了一样,并不是在最外层显示阴影,并且使地图不好看,所以为了解决这个问题,经过测试,是因为地图渲染顺序造成的,地图内的json数组数据,会优先渲染开头的,后面的会覆盖上一层数据,利用这个数据渲染方式,可以优先对数据内的省份进行排序,但不是最佳解决方式。根据数据显示全国的显示各省,各省显示市区,所以当我显示中国地图时候在最上层加上中国地图轮廓,显示省的时时候,在最上层加省的轮廓,得以解决。合并代码如下:
/*** @文件名:mergeProvince.js @来源:Winford.Wang|2021-12-30,17:52 @描述:返回根据省份名称获取相应的地图数据合并数据 ***/ import provinceMap from \'./provinceMap\'; import chinaMapData from \'@/modules/datacenter/assets/json/groupPortal/chinaEchart.json\'; export function getMaoPrivince(names = []) // 容器映射 let resultMap = type: \'FeatureCollection\', features: [] ; let oldMapData = []; // 非空 if (names.length === 0) return resultMap; // 名字和地图排序添加, for (let j = 0; j < names.length; j++) // 将阴影层放在头处,显示时候将在地图最下层 for (let i = 0; i < chinaMapData.features.length; i++) let item = chinaMapData.features[i]; if (item.properties.name === names[j]) oldMapData.unshift(item); break; // 获取相应名字的地图 for (let i = 0; i < provinceMap.length; i++) if (provinceMap[i].name === names[j]) let objdata = provinceMap[i].data ? provinceMap[i].data.features ? provinceMap[i].data.features : [] : []; oldMapData = oldMapData.concat(objdata); break; // 新地图 resultMap.features = oldMapData; // 返回 return resultMap;
c.辅助组件编写完成后,开始写调用方法,就是echarts的option,数据及方法都存在了,那么就是样式了,注意看引用组件的路径。
/*** @文件名:chinaMap.js @来源:Winford.Wang|2021-10-20,13:37 @描述:地图组件应用,设置地图显示等 ***/ import chinaMapData from \'@/modules/datacenter/assets/json/groupPortal/chinaEchart.json\'; import getMaoPrivince from \'@/modules/datacenter/views/groupPortal/gatewayPage/mergeProvince\'; import chinaMapYin from \'@/modules/datacenter/assets/json/groupPortal/china-contour.json\'; // 组件加载 const echarts = require(\'echarts\'); // 样式集合 基础 const styleS = // 基础样式,地图平面样式 itemRootStyle: normal: borderColor: \'#c1c1c1\', borderType: \'dotted\', borderWidth: 0.5, areaColor: \'#fff\' , emphasis: areaColor: \'#eceaea\', // 鼠标放上去 省份颜色 borderWidth: 0.1 , // 阴影样式,立体感添加 itemStyleQ: normal: shadowBlur: 0, shadowColor: \'#f0f0f0\', shadowOffsetX: 0, shadowOffsetY: 10, borderWidth: 0 , // 鼠标放到阴影上的去样式 itemStyleEmphasis: itemStyle: opacity: 0 , label: color: \'rgba(255,255,255,0)\' , // china 文字样式 labelStyle: normal: fontSize: 8, show: true, textStyle: color: \'#6e6e6e\' , emphasis: textStyle: color: \'#333333\' , // 各个区域文字样式 labelStyleHide: normal: fontSize: 8, show: false , emphasis: show: true, textStyle: color: \'#333333\' , // 点坐标样式 markPointLabelStyle: show: false, emphasis: show: false , // 弹窗样式 tooltipStyle: color: \'#333333\', fontSize: 10, fontWeight: 600 , // 地图最大最小缩放级别 scaleLimit: min: 0.7, max: 3 ; // 弹窗配置 const tooltip = function(mapdata) return backgroundColor: \'rgba(236,236,236,0.85)\', textStyle: styleS.tooltipStyle ; ; // 中国大地图设置 const chinaMapOption = function(data, mapdata = \'china\') let provinceShodawData; // 查找注册地图区域组件 if (mapdata === \'china\') chinaMapData.features.unshift(chinaMapYin.features[0]); // 注册中国地图 echarts.registerMap(mapdata, chinaMapData); else let names = mapdata.split(\',\'); // 获取地图数据 let map = getMaoPrivince(names); // 注册省份地图 echarts.registerMap(mapdata, map); // 设置阴影显示,伪立体感觉 if (mapdata === \'china\') // 阴影 最外围显示阴影 provinceShodawData = [\'中华人民共和国\']; else // 阴影 最外围显示阴影 provinceShodawData = mapdata ? mapdata.split(\',\') : []; // 阴影和样式结合 provinceShodawData = provinceShodawData.map(item => return itemStyle: styleS.itemStyleQ, emphasis: styleS.itemStyleEmphasis, label: show: false , name: item ; ); // 引用点 let markPointData = data ? data : []; // 返回设置 return tooltip: tooltip(mapdata), series: [ type: \'map\', map: mapdata, zoom: 1.2, //当前视角的缩放比例。 roam: true, //是否开启鼠标缩放和平移漫游 scaleLimit: styleS.scaleLimit, label: mapdata == \'china\' ? styleS.labelStyle : styleS.labelStyleHide, itemStyle: styleS.itemRootStyle, markPoint: symbolSize: 18, label: styleS.markPointLabelStyle, data: markPointData , data: provinceShodawData ] ; ; export chinaMapOption ;
d.接下来直接引用这个方法,传入要生成的地图名字,和点数据,映射到dom上即可,一个地图基本就出现了。
// 中国地图获取方式 let markPointDatas = [ name:\'dian1\',coord: [longitude, latitude] name:\'dian2\',coord: [经度, 纬度] ] this.chinaData = chinaMapOption(markPointDatas, \'china\'); // 各省地图获取方式 let markPointDatas = [ name:\'dian1\',coord: [longitude, latitude] name:\'dian2\',coord: [经度, 纬度] ] this.chinaData = chinaMapOption(markPointDatas, \'北京,天津,河北\'); // 基于准备好的dom,初始化echarts实例 this.chartInstance = echarts.init(document.getElementById(this.chartId)); this.chartInstance.setOption(this.chinaData);
3.根据不一样的需求,最终需要的地图样式也不一样,可根据自己的需要来变更采纳。
三、其它
这里后来又对3d echarts地图进行了一点研究,引入和echarts版本相匹配的echarts-gl,代码如下,仅供参考:
/*** @文件名:china3DMap.js @来源:Winford.Wang|2021-10-20,13:37 @描述:3d地图组件应用,设置地图显示等 ***/ import \'echarts-gl\'; import chinaMapData from \'@/modules/datacenter/assets/json/groupPortal/chinaEchart.json\'; import getMaoPrivince from \'@/modules/datacenter/views/groupPortal/gatewayPage/mergeProvince\'; // 组件加载 const echarts = require(\'echarts\'); // 弹窗配置 const tooltip = function(data, mapdata) return backgroundColor: \'rgba(236,236,236,0.85)\', textStyle: color: \'#333333\', fontSize: 10, fontWeight: 600 ; ; // 地图样式显示 const styleMap = label: show: true, distance: [0, 0, 0], textStyle: fontSize: 8, color: \'#6e6e6e\', backgroundColor: \'rgba(255,255,255,0)\' , itemStyle: color: [255, 255, 255, 0.9], borderWidth: 0.5, borderColor: \'#c1c1c1\' , emphasis: itemStyle: show: true, color: \'rgba(245,245,245,1)\' , label: show: true, distance: 0, textStyle: color: \'#333\' ; // 地图样式显示2 const styleMap2 = label: show: false, distance: 0, textStyle: fontSize: 8, color: \'#6e6e6e\', backgroundColor: \'rgba(255,255,255,0)\' , itemStyle: color: [255, 255, 255, 0.9], borderWidth: 0.5, borderColor: \'#c1c1c1\' , emphasis: itemStyle: show: true, color: \'#fafafa\' , label: show: true, distance: 0, textStyle: color: \'#333\' ; // 点样式显示 const styleScatter = label: show: false , emphasis: itemStyle: opacity: 0.9 , label: show: false ; // 中国大地图设置 const chinaMapOption = function(data, mapdata = \'china\') // 查找注册地图区域组件 if (mapdata === \'china\') // 注册中国地图 echarts.registerMap(mapdata, chinaMapData); else let names = mapdata.split(\',\'); // 获取地图数据 let map = getMaoPrivince(names); // 注册省份地图 echarts.registerMap(mapdata, map); // 返回设置 return color: [\'#fff\'], tooltip: tooltip(data, mapdata), geo3D: show: true, map: mapdata, label: mapdata === \'china\' ? styleMap.label : styleMap2.label, itemStyle: styleMap.itemStyle, emphasis: styleMap.emphasis, shading: \'color\', viewControl: rotateSensitivity: 2, // 旋转操作的灵敏度 zoomSensitivity: 2, // 缩放操作的灵敏度 // distance: 80, //视角距离主体 minDistance: 50, maxDistance: 300 // alpha: 30, // 倾斜角度 // beta: 10 // 旋转角度 , series: [] ; ; export chinaMapOption ;
希望对你有帮助
以上是关于echarts中国及省份地图以及阴影的显示的主要内容,如果未能解决你的问题,请参考以下文章