当前位置:   article > 正文

简单聊聊Echarts伪3D地图实现的相关配置_如何用echarts实现仿3d中国地图

如何用echarts实现仿3d中国地图

知识和技能真的是用进废退,还是得多实践,才不至于遗忘。

目录

前言

二、实现原理

三、从0开始实现

1.目录结构

2.地图JSON数据获取

3.具体实现,重头戏

3.一些常见问题的解决方法

总结


前言

本文简单来聊一聊Echarts伪3D地图的实现,只分离出最底层的伪3D效果,删除了其余的上层展示效果。Echarts这块还有一些重要且常用的功能,比如,地图钻取、结合散点图实现各种效果等,总之,可玩性很高。本文还是抽丝剥茧,只专注3D效果这一点,贪多嚼不烂,后续有机会可以进行扩展,或者网上能够找到不少的Echarts社区的镜像站。里面的示例良莠不齐,但仔细甄别后,有很多可取之处。


一、实现效果图

先来看效果图,如果不符合你的业务需求,也就不用再继续浪费你的时间了,再去找找其他效果实现。所有的天马行空,一定可以用技术来实现,如果不能,那就是技术还有待发展。加油,期待在别的博文中有幸再见。

 如果需要在线运行预览,可以直接点击:

 

二、实现原理

实现的原理:说白了就是多图层错位,辅以相应的颜色搭配营造出一种凸起的效果。具体的配置包括:zlevel(用于分层,数值大的在数值小的上面)、aspectScale(地图的长宽比,默认0.75)、layoutCenter(定义地图中心在屏幕中的位置)、layoutSize(定义地图的大小)等

三、从0开始实现

1.目录结构

mapdemo目录下,包含以下四个文件:

2.地图JSON数据获取

DataV.GeoAtlas地理小工具系列

我为了演示方便,直接放到了js文件里了,采用变量存储。开发中应该是放到JSON文件里进行读取。演示使用如下所示:

3.具体实现,重头戏

页面布局上使用了Grid布局,有兴趣的同学也可以进行了解学习一下,万事开头难,还是那句话,用进废退,实践是最好的老师。如果不感兴趣,也没问题,毕竟不是本文的主题,只是我希望我用一点能够达到一个抛砖引玉的效果,激发大家的好奇心。

代码如下(示例):

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Echarts伪3D地图</title>
  8. <script src="./echarts.min.js"></script>
  9. <script src="./map-shandong.js"></script>
  10. <script src="./map-shanxi.js"></script>
  11. <style>
  12. * {
  13. margin: 0;
  14. }
  15. .map-panel {
  16. position: relative;
  17. box-sizing: border-box;
  18. width: 100vw;
  19. height: 100vh;
  20. display: grid;
  21. grid-template-columns: repeat(2, 1fr);
  22. grid-template-rows: 55px auto;
  23. grid-template-areas:
  24. "header header"
  25. "left right";
  26. gap: 10px;
  27. padding: 10px;
  28. }
  29. .title {
  30. grid-area: header;
  31. display: grid;
  32. justify-items: center;
  33. align-items: center;
  34. font-size: 28px;
  35. font-weight: bold;
  36. }
  37. .shandong-map {
  38. grid-area: left;
  39. border: 1px solid #007acc;
  40. border-radius: 5px;
  41. }
  42. .shanxi-map {
  43. grid-area: right;
  44. border: 1px solid #007acc;
  45. border-radius: 5px;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <div class="map-panel">
  51. <div class="title">Echarts伪3D地图</div>
  52. <div id="shandong-map" class="shandong-map"></div>
  53. <div id="shanxi-map" class="shanxi-map"></div>
  54. </div>
  55. </body>
  56. <script>
  57. window.onload = () => {
  58. initMap("shandong", mapJsonDataShanDong, "shandong-map");
  59. initMap("shanxi", mapJsonDataShanXi, "shanxi-map");
  60. };
  61. function initMap(mapName, mapJsonData, domId) {
  62. echarts.registerMap(mapName, mapJsonData);
  63. let option = {
  64. tooltip: {
  65. show: false,
  66. },
  67. geo: [
  68. {
  69. show: true,
  70. map: mapName,
  71. zoom: 1,
  72. roam: false,
  73. regions: [],
  74. zlevel: 5,
  75. aspectScale: 0.85,
  76. layoutCenter: ["50%", "50%"],
  77. layoutSize: "90%",
  78. itemStyle: {
  79. areaColor: "transparent",
  80. },
  81. },
  82. {
  83. show: true,
  84. map: mapName,
  85. zoom: 1,
  86. roam: false,
  87. zlevel: 4,
  88. layoutCenter: ["50.5%", "50.5%"],
  89. layoutSize: "90%",
  90. aspectScale: 0.85,
  91. itemStyle: {
  92. borderWidth: 1,
  93. borderColor: "rgba(22, 186, 212,0.8)",
  94. shadowColor: "rgba(80, 183, 140,0.5)",
  95. shadowOffsetY: 5,
  96. shadowBlur: 15,
  97. areaColor: "rgba(5,21,35,0.1)",
  98. },
  99. silent: true,
  100. },
  101. {
  102. show: true,
  103. map: mapName,
  104. zoom: 1,
  105. roam: false,
  106. zlevel: 3,
  107. layoutCenter: ["51%", "51%"],
  108. layoutSize: "90%",
  109. aspectScale: 0.85,
  110. itemStyle: {
  111. borderWidth: 1,
  112. borderColor: "rgba(9, 170, 148,0.6)",
  113. shadowColor: "rgb(80,183,140)",
  114. shadowOffsetY: 5,
  115. shadowBlur: 15,
  116. areaColor: "transpercent",
  117. },
  118. silent: true,
  119. },
  120. {
  121. show: true,
  122. map: mapName,
  123. zoom: 1,
  124. roam: false,
  125. zlevel: 2,
  126. layoutCenter: ["51.5%", "51.5%"],
  127. layoutSize: "90%",
  128. aspectScale: 0.85,
  129. itemStyle: {
  130. borderWidth: 1,
  131. borderColor: "rgba(105, 174, 253,0.4)",
  132. shadowColor: "rgba(10, 177, 105,0.4)",
  133. shadowOffsetY: 15,
  134. shadowBlur: 10,
  135. areaColor: "transpercent",
  136. },
  137. silent: true,
  138. },
  139. {
  140. show: true,
  141. map: mapName,
  142. zoom: 1,
  143. roam: false,
  144. zlevel: 1,
  145. layoutCenter: ["52%", "52%"],
  146. layoutSize: "90%",
  147. aspectScale: 0.85,
  148. itemStyle: {
  149. borderWidth: 5,
  150. borderColor: "rgb(6,125,119)",
  151. shadowColor: "rgba(10,177,105,0.3)",
  152. shadowOffsetY: 15,
  153. shadowBlur: 10,
  154. areaColor: "rgba(5,21,35,0.1)",
  155. },
  156. silent: true,
  157. },
  158. ],
  159. series: [
  160. {
  161. type: "map",
  162. map: mapName,
  163. zoom: 1,
  164. roam: false,
  165. aspectScale: 0.85,
  166. layoutCenter: ["50%", "50%"],
  167. layoutSize: "90%",
  168. selectedMode: false,
  169. itemStyle: {
  170. normal: {
  171. label: {
  172. show: true,
  173. color: "#FF0",
  174. fontSize: 14,
  175. },
  176. borderColor: "#FFFFFF",
  177. borderWidth: 1,
  178. areaColor: {
  179. type: "linear",
  180. x: 1200,
  181. y: 0,
  182. x2: 0,
  183. y2: 0,
  184. colorStops: [
  185. {
  186. offset: 0,
  187. color: "rgb(60,213,147)", // 0% 处的颜色
  188. },
  189. {
  190. offset: 1,
  191. color: "rgba(126, 207, 195,0.75)", // 50% 处的颜色
  192. },
  193. ],
  194. global: true, // 缺省为 false
  195. },
  196. },
  197. emphasis: {
  198. label: {
  199. show: true,
  200. color: "#FF0",
  201. fontSize: 14,
  202. },
  203. areaColor: "rgba(18, 190, 115, 0.6)",
  204. borderColor: "#ffdc00",
  205. },
  206. },
  207. zlevel: 99,
  208. data: [],
  209. },
  210. ],
  211. };
  212. let mapChart = echarts.init(document.getElementById(domId));
  213. mapChart.setOption(option);
  214. window.onresize = () => {
  215. mapChart.resize();
  216. };
  217. }
  218. </script>
  219. </html>

3.一些常见问题的解决方法

echarts地图的使用过程中,可能遇到很多效果显示的问题,但是不知道如何搜索问题,总是康菲很多的时间,下面我简单的列举一些这里面需要注意的点,如果恰好有你抓耳挠腮的问题,那么我这篇文章的目的也就达到了。

        1)我们不需要geo地理坐标系图层进行交互,比如鼠标滑过、点击等事件,这时候我们可以采用silent:true配置,禁用交互。

        2)在地图钻取时候,我们基本上不需要地图点击后,地图的高亮显示,这时候我们可以通过selectedMode: false配置,禁用掉选择,这里面有个比较坑的地方,就是官网文档说的这个selectedMode属性默认是关闭的,这就容易误导我们以为默认是false,其实不然,它的意思应该说默认是关闭多选。文档原文:“选中模式,表示是否支持多个选中,默认关闭,支持布尔值和字符串,字符串取值可选'single'表示单选,或者'multiple'表示多选。”


总结

希望你工作是为了更好的生活,而不是为了活着。在这个过程中,如果能够给世界留下点什么,那就更好了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/82979
推荐阅读
相关标签
  

闽ICP备14008679号