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 };
希望对你有帮助