当前位置:   article > 正文

echarts 5.0——3d中国地图和飞线_echarts3d地图 map3d 飞线

echarts3d地图 map3d 飞线

echarts 5.0的版本样式语法与4.0及以下的语法有个别差异,使用旧语法浏览器会警告提示。

3d地图常用的实现方法有两种。一种是使用GL来实现,一种是使用叠层和阴影来实现,本文将使用叠层和阴影来实现。先看效果图:

一、3D中国地图

1. 一定要使用 echarts 5.0及以上的版本;

2. echarts 5.0没有内置中国地图了。点击下载 china.json

3. 一共使用了四层地图。
(1)第一层是中国地图各省细边框和展示南海诸岛;
(2)第二层是实现中国地图外边框的宽度和阴影,与第一层完全重合,隐藏南海诸岛;
(3)第三层和第四层形成一个底层3d立体,使用top往下偏移,隐藏南海诸岛。

  1. // html
  2. <div class="china-map" ref="chinaMap"></div>
  1. // 引入资源
  2. import * as echarts from 'echarts'
  3. import china from '@/assets/json/china.json'
  4. // 方法
  5. chinaEchart(){
  6. //注册地图,这个特别重要
  7. echarts.registerMap('china', china)
  8. let myChart = echarts.init(this.$refs.chinaMap);
  9. //echart 配制option
  10. var options= {
  11. tooltip: {
  12. show:true,
  13. triggerOn: "mousemove", //mousemove、click
  14. padding:[4,8],
  15. borderWidth:1,
  16. borderColor:'#409eff',
  17. backgroundColor:'rgba(255,255,255,0.7)',
  18. textStyle:{
  19. color:'#000000',
  20. fontSize:13
  21. },
  22. formatter: function(e) {
  23. return e.name;
  24. }
  25. },
  26. geo: [
  27. // 第一层
  28. {
  29. map: "china",
  30. z: 3,
  31. zoom: 1.2,
  32. aspectScale: 0.85,
  33. roam: false,
  34. top: '10%',
  35. layoutSize: "100%", //保持地图宽高比
  36. regions: [
  37. { // 隐藏南海诸岛,因为顶层已经添加过了
  38. name: '南海诸岛',
  39. itemStyle: {
  40. borderWidth: 0.5,
  41. shadowBlur: 0,
  42. borderColor: '#61aacb',
  43. areaColor: '#104584'
  44. }
  45. }
  46. ],
  47. itemStyle:{
  48. borderColor: '#c8feff',
  49. borderWidth: 0.5,
  50. shadowBlur: 3,
  51. shadowColor: '#66edff',
  52. areaColor: '#0862db'
  53. },
  54. emphasis:{
  55. itemStyle:{
  56. shadowBlur: 10,
  57. borderWidth: 1,
  58. areaColor: '#2da9ff',
  59. },
  60. label:{
  61. show:false,
  62. color: '#ffffff',
  63. }
  64. },
  65. select:{
  66. itemStyle:{
  67. shadowBlur: 10,
  68. borderWidth: 1,
  69. areaColor: '#2da9ff',
  70. },
  71. label:{
  72. color: '#ffffff',
  73. }
  74. }
  75. },
  76. // 第二层
  77. {
  78. map: "china",
  79. z: 2,
  80. zoom: 1.2,
  81. aspectScale: 0.85,
  82. roam: false,
  83. silent:true,
  84. top: '10%',
  85. layoutSize: "100%", //保持地图宽高比
  86. regions: [
  87. { // 隐藏南海诸岛,因为顶层已经添加过了
  88. name: '南海诸岛',
  89. itemStyle: {
  90. opacity: 0 // 为 0 时不绘制该图形
  91. },
  92. label: {
  93. show: false
  94. }
  95. }
  96. ],
  97. itemStyle:{
  98. borderColor: '#d8feff',
  99. borderWidth: 3,
  100. shadowBlur: 10,
  101. shadowColor: '#22a1ff',
  102. areaColor: '#0862db',
  103. shadowOffsetX: 0,
  104. shadowOffsetY: 8
  105. },
  106. },
  107. // 第三层
  108. {
  109. map: "china",
  110. z: 1,
  111. zoom: 1.2,
  112. aspectScale: 0.85,
  113. top: '11.5%',
  114. silent:true,
  115. layoutSize: "100%", //保持地图宽高比
  116. itemStyle:{
  117. borderColor: '#c8feff',
  118. borderWidth: 1,
  119. shadowBlur: 0,
  120. shadowColor: '#99c4ff',
  121. areaColor: '#4ebaff',
  122. },
  123. regions: [
  124. { // 隐藏南海诸岛,因为顶层已经添加过了
  125. name: '南海诸岛',
  126. itemStyle: {
  127. opacity: 0 // 为 0 时不绘制该图形
  128. },
  129. label: {
  130. show: false
  131. }
  132. }
  133. ],
  134. },
  135. // 第四层
  136. {
  137. map: "china",
  138. z: 0,
  139. zoom: 1.2,
  140. aspectScale: 0.85,
  141. top: '12%',
  142. silent:true,
  143. layoutSize: "100%", //保持地图宽高比
  144. itemStyle:{
  145. borderColor: '#66edff',
  146. borderWidth: 2,
  147. shadowBlur: 20,
  148. shadowColor: '#4d99ff',
  149. areaColor: '#1752ad',
  150. shadowOffsetX: 0,
  151. shadowOffsetY: 8
  152. },
  153. regions: [
  154. { // 隐藏南海诸岛,因为顶层已经添加过了
  155. name: '南海诸岛',
  156. itemStyle: {
  157. opacity: 0 // 为 0 时不绘制该图形
  158. },
  159. label: {
  160. show: false
  161. }
  162. }
  163. ],
  164. },
  165. ],
  166. series: [
  167. // 地图
  168. {
  169. type: "map",
  170. geoIndex: 0,
  171. data: []
  172. }
  173. ]
  174. }
  175. myChart.setOption(options);
  176. }

二、地图飞线

1. 飞线有一对多,多对多;

2. 起点和终点使用effectScatter标点。

  1. // 起点名称和经纬度
  2. const fromName = '重庆市'
  3. const fromLatlng = [106.33,29.35]
  4. // 终点名称和经纬度
  5. const geoCoordMap = [
  6. { name: '盘锦市', latlng: [120.93141287481329, 40.93448132827849]},
  7. { name: '沧州市', latlng: [116.71809759843096, 37.96769678343516]},
  8. { name: '东营市', latlng: [118.29234782217573, 37.44294670885357]},
  9. { name: '大连市', latlng: [121.26593157813807, 38.886009413952934]},
  10. { name: '沈阳市', latlng: [122.220947193165, 41.64094730550629]},
  11. { name: '北京市', latlng: [116.07673639616456, 40.110426254643315]},
  12. { name: '白银市', latlng: [101.09220648866805, 36.568363251217576]},
  13. { name: '石家庄市', latlng: [115.20215293852858, 38.886009413952934]}
  14. ]
  15. //飞线数据
  16. const linesData = geoCoordMap.map(row=>{
  17. return {
  18. coords: [
  19. fromLatlng,
  20. row.latlng
  21. ],
  22. fromName: fromName,
  23. toName: row.name,
  24. lineStyle: {
  25. color: '#FFE747',
  26. curveness: 0.2
  27. }
  28. }
  29. })
  30. // 终点标点数据
  31. let effectData = geoCoordMap.map(row=>{
  32. return {
  33. value: row.latlng,
  34. name: row.name,
  35. lineStyle: {
  36. color: '#FFE747'
  37. }
  38. }
  39. })
  40. // series新增飞线
  41. series: [
  42. // 飞线
  43. {
  44. type: 'lines',
  45. zlevel: 5,
  46. effect: {
  47. show: true,
  48. period: 5, //箭头指向速度,值越小速度越快
  49. trailLength: 0, //特效尾迹长度[0,1]值越大,尾迹越长重
  50. symbol: 'arrow', //ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
  51. symbolSize: 8, //图标大小
  52. },
  53. lineStyle: {
  54. color: '#FFE747',
  55. type: 'dashed',
  56. width: 2, //尾迹线条宽度
  57. opacity: 1, //尾迹线条透明度
  58. curveness: 0.3 //尾迹线条曲直度
  59. },
  60. data: linesData,
  61. markPoint:{
  62. symbol: 'circle', //ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
  63. symbolSize: 8, //图标大小
  64. }
  65. },
  66. //起点
  67. {
  68. type: 'effectScatter',
  69. coordinateSystem: 'geo',
  70. zlevel: 6,
  71. rippleEffect: {
  72. //涟漪特效
  73. period: 4, //动画时间,值越小速度越快
  74. brushType: 'stroke', //波纹绘制方式 stroke, fill
  75. scale: 4 //波纹圆环最大限制,值越大波纹越大
  76. },
  77. label: {
  78. show: false,
  79. position: 'right', //显示位置
  80. offset: [5, 0], //偏移设置
  81. formatter: '{b}', //圆环显示文字
  82. color: 'red'
  83. },
  84. symbol: 'circle',
  85. symbolSize: function(val) {
  86. return 10; //圆环大小
  87. },
  88. itemStyle: {
  89. show: false,
  90. color: '#ff8400',
  91. },
  92. data: [{value: fromLatlng,name: fromName}]
  93. },
  94. // 终点
  95. {
  96. type: 'effectScatter',
  97. coordinateSystem: 'geo',
  98. zlevel: 6,
  99. rippleEffect: {
  100. //涟漪特效
  101. period: 4, //动画时间,值越小速度越快
  102. brushType: 'stroke', //波纹绘制方式 stroke, fill
  103. scale: 4 //波纹圆环最大限制,值越大波纹越大
  104. },
  105. label: {
  106. show: false,
  107. position: 'right', //显示位置
  108. offset: [5, 0], //偏移设置
  109. formatter: '{b}', //圆环显示文字
  110. color: 'red'
  111. },
  112. symbol: 'circle',
  113. symbolSize: function(val) {
  114. return 6; //圆环大小
  115. },
  116. itemStyle: {
  117. show: false,
  118. color: '#befaff',
  119. },
  120. data: effectData
  121. }]

三、扩展

1. 使用 echarts-gl也可以实现3D地图,做出来的3D效果各有千秋,等后面再补一个用gl实现的方法;

2. 本文飞线是做一对多的,可以做成多对多飞线,即起点有多个,终点也有多个。

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

闽ICP备14008679号