当前位置:   article > 正文

echarts绘制中国地图,添加标记,点击省份展示市区地图_echart 点击省份 放大

echart 点击省份 放大

 功能描述:页面初始化展示中国地图,并设置了三个省份的标记点,点击省份进入下一级市区地图,再次点击地图回到中国地图

一、安装echarts依赖

npm install echarts@4.9.0

注意:我使用的是4.9.0版本,因为绘制地图需要用到地图的数据,高版本的依赖包有的不包含地图所需的数据

 安装好依赖后查看 node_modules —> echarts —> map 文件夹下是否有 js 和 json 文件夹,绘制地图的数据就来源这里,准备好就可以正式开发啦

二、代码实现

  1. <template>
  2. <div>
  3. <div ref="china_map" style="height: 450px;width: 100%"></div>
  4. </div>
  5. </template>
  6. <script setup name="" lang="ts">
  7. import * as echarts from "echarts";
  8. import 'echarts/map/js/china.js'; // 核心文件
  9. // 省份数据
  10. import 'echarts/map/js/province/taiwan.js';
  11. import 'echarts/map/js/province/hebei.js';
  12. import 'echarts/map/js/province/shanxi.js';
  13. import 'echarts/map/js/province/liaoning.js';
  14. import 'echarts/map/js/province/jilin.js';
  15. import 'echarts/map/js/province/heilongjiang.js';
  16. import 'echarts/map/js/province/jiangsu.js';
  17. import 'echarts/map/js/province/zhejiang.js';
  18. import 'echarts/map/js/province/anhui.js';
  19. import 'echarts/map/js/province/fujian.js';
  20. import 'echarts/map/js/province/jiangxi.js';
  21. import 'echarts/map/js/province/shandong.js';
  22. import 'echarts/map/js/province/henan.js';
  23. import 'echarts/map/js/province/hubei.js';
  24. import 'echarts/map/js/province/hunan.js';
  25. import 'echarts/map/js/province/guangdong.js';
  26. import 'echarts/map/js/province/hainan.js';
  27. import 'echarts/map/js/province/sichuan.js';
  28. import 'echarts/map/js/province/guizhou.js';
  29. import 'echarts/map/js/province/yunnan.js';
  30. import 'echarts/map/js/province/shanxi1.js';
  31. import 'echarts/map/js/province/gansu.js';
  32. import 'echarts/map/js/province/qinghai.js';
  33. import 'echarts/map/js/province/xinjiang.js';
  34. import 'echarts/map/js/province/guangxi.js';
  35. import 'echarts/map/js/province/neimenggu.js';
  36. import 'echarts/map/js/province/ningxia.js';
  37. import 'echarts/map/js/province/xizang.js';
  38. import 'echarts/map/js/province/beijing.js';
  39. import 'echarts/map/js/province/tianjin.js';
  40. import 'echarts/map/js/province/shanghai.js';
  41. import 'echarts/map/js/province/chongqing.js';
  42. import 'echarts/map/js/province/xianggang.js';
  43. import 'echarts/map/js/province/aomen.js';
  44. const china_map = ref();
  45. const defalutPoint = ref([{
  46. "name": "北京",
  47. "value": 213
  48. }, {
  49. "name": "福建",
  50. "value": 100
  51. }, {
  52. "name": "贵州",
  53. "value": 50
  54. }]);
  55. const point = ref([{
  56. "name": "北京",
  57. "value": 213
  58. }, {
  59. "name": "福建",
  60. "value": 100
  61. }, {
  62. "name": "贵州",
  63. "value": 50
  64. }]);
  65. const data = reactive({
  66. geoCoordMap: {
  67. '北京': [116.405285,
  68. 39.904985
  69. ],
  70. '福建': [119.306239,
  71. 26.075230
  72. ],
  73. '贵州': [106.713478,
  74. 26.578343
  75. ]
  76. },
  77. geoCoordMapDefault: {
  78. '北京': [116.405285,
  79. 39.904985
  80. ],
  81. '福建': [119.306239,
  82. 26.075230
  83. ],
  84. '贵州': [106.713478,
  85. 26.578343
  86. ]
  87. },
  88. provinces: { //数据
  89. 台湾: 'taiwan',
  90. 河北: 'hebei',
  91. 山西: 'shanxi',
  92. 辽宁: 'liaoning',
  93. 吉林: 'jilin',
  94. 黑龙江: 'heilongjiang',
  95. 江苏: 'jiangsu',
  96. 浙江: 'zhejiang',
  97. 安徽: 'anhui',
  98. 福建: 'fujian',
  99. 江西: 'jiangxi',
  100. 山东: 'shandong',
  101. 河南: 'henan',
  102. 湖北: 'hubei',
  103. 湖南: 'hunan',
  104. 广东: 'guangdong',
  105. 海南: 'hainan',
  106. 四川: 'sichuan',
  107. 贵州: 'guizhou',
  108. 云南: 'yunnan',
  109. 陕西: 'shanxi1',
  110. 甘肃: 'gansu',
  111. 青海: 'qinghai',
  112. 新疆: 'xinjiang',
  113. 广西: 'guangxi',
  114. 内蒙古: 'neimenggu',
  115. 宁夏: 'ningxia',
  116. 西藏: 'xizang',
  117. 北京: 'beijing',
  118. 天津: 'tianjin',
  119. 上海: 'shanghai',
  120. 重庆: 'chongqing',
  121. 香港: 'xianggang',
  122. 澳门: 'aomen'
  123. }
  124. });
  125. const {
  126. geoCoordMap,
  127. geoCoordMapDefault,
  128. provinces
  129. } = toRefs(data);
  130. const isChina = ref(true); // 默认显示中国地图
  131. const emit = defineEmits(['showChange']);
  132. const convertData = () => {
  133. let res = [];
  134. for (let i = 0; i < point.value.length; i++) {
  135. let geoCoord = geoCoordMap.value[point.value[i].name];
  136. if (geoCoord) {
  137. res.push({
  138. name: point.value[i].name,
  139. value: geoCoord.concat(point.value[i].value)
  140. });
  141. }
  142. }
  143. return res;
  144. };
  145. // 中国地图点击省份 显示当前省份的详细的地区。
  146. const chinaMapHidden = (map) => {
  147. map.off('click'); //这里解决多次触发点击事件
  148. map.on('click', async (params) => {
  149. if (params.name in provinces.value) {
  150. isChina.value = false;
  151. emit("showChange", isChina.value);
  152. if (params.name === "湖南") {
  153. // 示例效果暂时只有湖南可点击
  154. point.value = [{
  155. name: "长沙",
  156. value: 212
  157. }, {
  158. name: "永州",
  159. value: 52
  160. }];
  161. geoCoordMap.value = {
  162. '长沙': [113.08755, 28.25182],
  163. '永州': [111.61945, 26.42586]
  164. };
  165. console.log(params.name, '-----------provinces.value[params.name]')
  166. chinaMaprsult(params.name);
  167. }
  168. } else {
  169. isChina.value = true;
  170. emit("showChange", isChina.value);
  171. point.value = defalutPoint.value;
  172. geoCoordMap.value = geoCoordMapDefault.value;
  173. chinaMaprsult('china');
  174. }
  175. })
  176. }
  177. // 渲染地图
  178. const chinaMaprsult = (name = null) => {
  179. let chinaMap = echarts.init(china_map?.value)
  180. const options = {
  181. title: {
  182. text: '',
  183. left: 'center',
  184. textStyle: {
  185. color: '#fff'
  186. }
  187. },
  188. tooltip: {
  189. trigger: 'item',
  190. formatter: function (params) {
  191. return params.name + ' : ' + params.value[2] ? params.value[2] : "";
  192. }
  193. },
  194. visualMap: {
  195. // min: 0,
  196. // max: 300,
  197. // left: 20,
  198. // bottom: 20,
  199. // calculable: true,
  200. // text: ['高','低'],
  201. show: false,
  202. inRange: {
  203. color: ['rgb(70, 240, 252)',
  204. 'rgb(250, 220, 46)',
  205. 'rgb(54, 229, 255)'
  206. ]
  207. },
  208. textStyle: {
  209. color: '#fff'
  210. }
  211. },
  212. geo: {
  213. map: name ? name : "china", // 核心
  214. zoom: 1.2,
  215. // roam: 'scale', //是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
  216. label: { // 页面初始化加载的文字
  217. normal: {
  218. show: true,
  219. textStyle: {
  220. color: "#ccc", // 页面初始化的地图文字颜色
  221. fontSize: 10 // // 页面初始化的地图文字大小
  222. },
  223. },
  224. },
  225. itemStyle: { //设置样式
  226. normal: {
  227. areaColor: 'rgba(48, 82, 153, 0.5)', // 区域的颜色
  228. borderColor: '#59e2f9' //边框颜色
  229. },
  230. emphasis: {
  231. areaColor: 'rgb(44, 165, 198, 0.9)' // 鼠标悬浮区域颜色
  232. }
  233. },
  234. emphasis: {
  235. label: {
  236. color: '#fff' // 鼠标悬浮文字颜色
  237. }
  238. }
  239. },
  240. series: [{
  241. type: "map",
  242. geoIndex: 0,
  243. itemStyle: { //地图区域的多边形 图形样式
  244. normal: { //是图形在默认状态下的样式
  245. label: {
  246. show: true, //是否显示标签
  247. textStyle: {
  248. color: "#fff"
  249. }
  250. }
  251. },
  252. zoom: 1.5, //地图缩放比例,默认为1
  253. emphasis: { //是图形在高亮状态下的样式,比如在鼠标悬浮或者图例联动高亮时
  254. label: {
  255. show: true
  256. }
  257. }
  258. },
  259. label: {
  260. normal: {
  261. show: true, //显示省份标签
  262. textStyle: {
  263. color: "#fff"
  264. }, //省份标签字体颜色
  265. },
  266. emphasis: {
  267. show: true,
  268. textStyle: {}
  269. }
  270. },
  271. data: [], // 地图数据
  272. },
  273. {
  274. type: 'effectScatter',
  275. coordinateSystem: 'geo',
  276. label: {
  277. lineHeight: 20,
  278. normal: {
  279. show: true,
  280. color: '#081727',
  281. position: 'inside',
  282. padding: [5, 0, 0, 0],
  283. verticalAlign: 'middle',
  284. formatter: function (para) {
  285. return '{name|' + para.data.value[2] + '}'
  286. },
  287. rich: {
  288. cnNum: {
  289. fontSize: 14,
  290. color: '#081727',
  291. lineHeight: 20,
  292. }
  293. }
  294. },
  295. },
  296. tooltip: {
  297. formatter: function (para) {
  298. return para.name + ": " + para.data.value[2]
  299. }
  300. },
  301. symbol: 'circle',
  302. symbolSize: [15, 15],
  303. data: convertData(),
  304. }
  305. ],
  306. }
  307. chinaMap.setOption(options)
  308. chinaMapHidden(chinaMap)
  309. }
  310. onMounted(() => {
  311. chinaMaprsult('china');
  312. })
  313. </script>
  314. <style rel="stylesheet/scss" lang="scss" scoped></style>

 在引入省份数据时,我原本是想在点击的时候引入,点击哪个省份就引入哪个省份的数据,避免首次加载时全部引入而影响性能,代码如下

  1. map.on('click', async (params) => {
  2. if (params.name in provinces.value) {
  3. //引入省份数据
  4. let provinceData = `echarts/map/js/province/${provinces.value[params.name]}.js`;
  5. console.log(provinceData, '----------hh');
  6. let val = await import(provinceData);
  7. if(val) {
  8. }
  9. }
  10. });

import方式引入一直报错,因为这个项目是vue3,所以也不能使用 require 引入。查了些资料有说import中不能使用变量,也有人使用字符串模板也就是上面这种写法成功引入的,但是我就是引入不了,最终放弃了。没办法,最后还是在头部全部引入了,如果有小伙伴知道怎么解决的,欢迎留言~

三、效果展示

 这世界很喧嚣,做你自己就好

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号