Echarts中国地图三级钻取(转)

转载

Echarts中国地图三级钻取

原文链接: https://yq.aliyun.com/articles/676173
							<div class="article-copyright">
				版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。					https://blog.csdn.net/dkl12/article/details/84571332				</div>
							            <div class="markdown_views prism-atom-one-dark">
						
						<p>我的原创地址:<a href="https://dongkelun.com/2018/11/27/echartsChinaMap/" rel="nofollow" data-token="6f9293c7f8af783de99e8de021fb244f">https://dongkelun.com/2018/11/27/echartsChinaMap/</a></p>

前言

最近其实一直在用Echarts写前端,之前也想过总结一下Echarts的用法,但是官网的例子已经很全了。写这篇博客是因为Echarts官网把很多地图的例子都去掉了,且不能下载地图Json的数据,而相关的博客又很少,搜到两个,但是不很符合自己的想法,所以就想自己实现总结一下最基本的地图钻取,代码上传到GitHub,这样便于后面再有相关需求的时候,直接从GitHub上下载下来,在这个基础上修改添加功能就好了。

1、演示地址

暂时在没有下级地图的时候会直接返回到第一级中国地图,后面可能改为:提示没有下级地图,然后增加一个回到一级地图的按钮

http://front-end.dongkelun.com/echarts-map

2、动图演示

一张一张的截图,图片太多了,就先学了一下录制gif

3、代码

其中地图的json数据是同事之前下载的(可能不全,几个没用的Json没有去掉),在别人的GitHub上也可以找到

代码已上传到GitHub:https://github.com/dongkelun/echarts-map

4、部署

本项目为静态网页,但由于需要获取.json文件的数据,所以不能直接打开index.html(会报js的错误,可以自己试试)

将本项目复制到服务器下,如tomcat的webapps目录下,启动tomcat,然后在浏览器里输入http://localhost:8080/echarts-map即可

因为自己在学Vue,后面可能会用Vue重新实现一下,并添加一些相对复杂的功能,比如添加数据,使每个省的颜色不一样,更多样化一些。
之所以没有先用Vue实现,也没有实现比较复杂的效果,是因为考虑到不是每个人都会Vue,所以用最简单的静态html+css+js实现,这样能使每个人都能看懂,而且可以最基础的地图钻取的模版。后面如果用Vue实现的话,会新建一个项目并上传到GitHub,并及时更新本博客。

附录

附上核心代码:

index.html


 
 
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  6. <title>Echarts 地图钻取 </title>
  7. <link rel="shortcut icon" href=./favicon.ico>
  8. <link rel="stylesheet" href="./css/index.css" type="text/css">
  9. <script type="text/javascript" src="./js/echarts.min.js"> </script>
  10. <script src="https://code.jquery.com/jquery-3.0.0.min.js"> </script>
  11. <script type="text/javascript" src="./js/index.js"> </script>
  12. <script type="text/javascript" src="./js/china-main-city-map.js"> </script>
  13. <script type="text/javascript" src="./js/rem.js"> </script>
  14. </head>
  15. <body>
  16. <div class='title'>Echarts中国地图三级钻取 </div>
  17. <div class="box">
  18. <button class= "backBtn" οnclick="back()">返回上级 </button>
  19. <div id="mapChart" class="chart"> </div>
  20. </div>
  21. </body>
  22. </html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

index.css


 
 
  1. body {
  2. background-image : url('../asset/images/beijingtupian.png') ;
  3. }
  4. .title {
  5. width : 100% ;
  6. height : 10vh ;
  7. text-align : center ;
  8. color : #fff ;
  9. font-size : 2em ;
  10. line-height : 10vh ;
  11. }
  12. .box {
  13. position : absolute ;
  14. width : 90% ;
  15. height : 80vh ;
  16. left : 5% ;
  17. top : 10% ;
  18. background-color : rgba (24,27,52,0.62 ) ;
  19. }
  20. .chart {
  21. position : relative ;
  22. height : 90% ;
  23. top : 10% ;
  24. }
  25. .backBtn {
  26. position : absolute ;
  27. top : 0 ;
  28. background-color : #00C298 ;
  29. border : 0 ;
  30. color : #fff ;
  31. height : 27px ;
  32. font-family : Microsoft Yahei ;
  33. font-size : 1em ;
  34. cursor : pointer ;
  35. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

index.js


 
 
  1. $ ( function ( ) { //dom加载后执行
  2. mapChart ( 'mapChart' )
  3. } )
  4. /**
  5. * 根据Json里的数据构造Echarts地图所需要的数据
  6. * @param {} mapJson
  7. */
  8. function initMapData ( mapJson ) {
  9. var mapData = [ ] ;
  10. for ( var i = 0 ;i <mapJson .features .length ;i ++ ) {
  11. mapData . push ( {
  12. name :mapJson .features [i ] .properties .name ,
  13. //id:mapJson.features[i].id
  14. } )
  15. }
  16. return mapData ;
  17. }
  18. /**
  19. * 返回上一级地图
  20. */
  21. function back ( ) {
  22. if (mapStack .length != 0 ) { //如果有上级目录则执行
  23. var map = mapStack . pop ( ) ;
  24. $ . get ( './asset/json/map/' +map .mapId + '.json' , function ( mapJson , status ) {
  25. registerAndsetOption (myChart ,map .mapId ,map .mapName ,mapJson , false )
  26. //返回上一级后,父级的ID、Name随之改变
  27. parentId = map .mapId ;
  28. parentName = map .mapName ;
  29. } )
  30. }
  31. }
  32. /**
  33. * Echarts地图
  34. */
  35. //中国地图(第一级地图)的ID、Name、Json数据
  36. var chinaId = 100000 ;
  37. var chinaName = 'china'
  38. var chinaJson = null ;
  39. //记录父级ID、Name
  40. var mapStack = [ ] ;
  41. var parentId = null ;
  42. var parentName = null ;
  43. //Echarts地图全局变量,主要是在返回上级地图的方法中会用到
  44. var myChart = null ;
  45. function mapChart ( divid ) {
  46. $ . get ( './asset/json/map/' +chinaId + '.json' , function ( mapJson ) {
  47. chinaJson = mapJson ;
  48. myChart = echarts . init ( document . getElementById (divid ) ) ;
  49. registerAndsetOption (myChart ,chinaId ,chinaName ,mapJson , false )
  50. parentId = chinaId ;
  51. parentName = 'china'
  52. myChart . on ( 'click' , function ( param , t ) {
  53. var cityId = cityMap [param .name ]
  54. if (cityId ) { //代表有下级地图
  55. $ . get ( './asset/json/map/' +cityId + '.json' , function ( mapJson , status ) {
  56. registerAndsetOption (myChart ,cityId ,param .name ,mapJson , true )
  57. } )
  58. } else {
  59. //没有下级地图,回到一级中国地图,并将mapStack清空
  60. registerAndsetOption (myChart ,chinaId ,chinaName ,chinaJson , false )
  61. mapStack = [ ]
  62. parentId = chinaId ;
  63. parentName = chinaName ;
  64. }
  65. // $.get('./asset/json/map/'+param.data.id+'.json', function (mapJson,status) {
  66. // registerAndsetOption(myChart,param.data.id,param.name,mapJson,true)
  67. // }).fail(function () {
  68. // registerAndsetOption(myChart,chinaId,'china',chinaJson,false)
  69. // });
  70. } ) ;
  71. } )
  72. }
  73. /**
  74. *
  75. * @param {*} myChart
  76. * @param {*} id 省市县Id
  77. * @param {*} name 省市县名称
  78. * @param {*} mapJson 地图Json数据
  79. * @param {*} flag 是否往mapStack里添加parentId,parentName
  80. */
  81. function registerAndsetOption ( myChart , id , name , mapJson , flag )
  82. {
  83. echarts . registerMap (name , mapJson ) ;
  84. myChart . setOption ( {
  85. series : [ {
  86. type : 'map' ,
  87. map : name ,
  88. itemStyle : {
  89. normal : {
  90. areaColor : 'rgba(23, 27, 57,0)' ,
  91. borderColor : '#1dc199' ,
  92. borderWidth : 1 ,
  93. } ,
  94. } ,
  95. data : initMapData (mapJson )
  96. } ]
  97. } ) ;
  98. if (flag ) { //往mapStack里添加parentId,parentName,返回上一级使用
  99. mapStack . push ( {
  100. mapId : parentId ,
  101. mapName : parentName
  102. } ) ;
  103. parentId = id ;
  104. parentName = name ;
  105. }
  106. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
        </div>
					
    
    
            
</div>                                    </div>
                </div>
</article>
<div class="postTime"> 
    <div class="article-bar-bottom">
        <span class="time">
            文章最后发布于: 2018-11-27 18:36:26            </span>
    </div>
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值