当前位置:   article > 正文

使用echarts+echarts-gl绘制3d地图,实现地图轮播效果_echarts 3d地图

echarts 3d地图

记录一下大屏开发中使用到的echarts-gl
大屏的页面根据需求前前后后改了几个版本了,地图的样式也改了又改
这里记录一下,因为echarts属性用到的比较多也比较杂,防止以后需要用到忘记了

目录

初始效果

效果图:

适应大屏风格的发光地图效果,用了两个图层实现叠加背景图片实现:​编辑

安装命令

创建一个div用来挂载地图

完整代码:

总结


初始效果

效果图:
 
适应大屏风格的发光地图效果,用了两个图层实现叠加背景图片实现:

 

安装命令

首先在项目中安装echarts与echarts gl(echers gl用于3d)
安装命令

npm install echarts --save //echarts安装命令
npm install echarts-gl //echarts-gl安装命令

安装完成后在package.json中查看有没有安装成功
安装成功后在main.js中引入

  1. import echartsGL from 'echarts-gl' // 引入echarts
  2. Vue.prototype.$echartsGL = echartsGL // 引入组件(将echarts注册为全局)

使用 http://datav.aliyun.com/portal/school/atlas/area_selector这个工具获取要显示的地图数据
存放在放静态资源的地方,创建一个json文件
这些没问题后,就可以在组件中进行操作了

  1. <template>
  2. <div id="hello">
  3. </div>
  4. </template>

创建一个div用来挂载地图

在script中引入存放地图数据的json文件

  1. import * as echarts from 'echarts';
  2. import geoJson from "../assets/mapJSon/rkz.json"
  3. import coordtransform from 'coordtransform'
  4. export default {
  5. name: 'MapDemo',
  6. data() {
  7. return {
  8. dataIndex: 0,
  9. mTime:null
  10. }
  11. },
  12. props: {
  13. msg: String
  14. },
  15. methods: {
  16. convertCoord(coord) {
  17. const gcj02 = coordtransform.wgs84togcj02(coord[0], coord[1])
  18. const bd09 = coordtransform.gcj02tobd09(gcj02[0], gcj02[1])
  19. return bd09
  20. },
  21. },
  22. mounted() {
  23. // 基于准备好的dom,初始化echarts实例
  24. var myChart = echarts.init(document.getElementById('hello'));
  25. var scatterData = [
  26. { name: "亚东县", value: "2945米" },
  27. { name: "仁布县", value: "3950米" },
  28. { name: "谢通门县", value: "4008米" },
  29. { name: "萨迦县", value: "4330米" },
  30. { name: "拉孜县", value: "4012米" },
  31. { name: "昂仁县", value: "4320米" },
  32. { name: "江孜县", value: "约4000米" },
  33. { name: "白朗县", value: "平均4200米" },
  34. { name: "聂拉木县", value: "4300米" },
  35. { name: "昂仁县", value: "4320米" },
  36. { name: "岗巴县", value: "4700米以上" },
  37. { name: "定结县", value: "2500-4700米" },
  38. { name: "定日县", value: "平均5000米。" },
  39. { name: "吉隆县", value: "4200米" },
  40. { name: "萨嘎县", value: "4487米" },
  41. { name: "仲巴县", value: "4772米" },
  42. { name: "南木林县", value: "3790米到4952米" },
  43. { name: "桑珠孜区", value: "3840米" },
  44. { name: "康马县", value: "4200-4600米" }
  45. ];
  46. // 绘制图表
  47. let option = {
  48. // backgroundColor: "#fff",
  49. tooltip: {
  50. // 鼠标是否可以进入悬浮框
  51. show: true,
  52. confine: true,
  53. enterable: true,
  54. // 触发方式 mousemove, click, none, mousemove|click
  55. triggerOn: 'mousemove',
  56. // item 图形触发, axis 坐标轴触发, none 不触发
  57. trigger: 'item',
  58. // 浮层隐藏的延迟
  59. hideDelay: 100,
  60. // 背景色
  61. backgroundColor: 'rgba(110, 110, 110,.5)',
  62. formatter: function (params) {
  63. const altitudeMap = {
  64. '亚东县': '2945米',
  65. '仁布县': '3950米',
  66. '谢通门县': '4008米',
  67. '萨迦县': '4330米',
  68. '拉孜县': '4012米',
  69. '昂仁县': '4320米',
  70. '江孜县': '约4000米',
  71. '白朗县': '平均4200米',
  72. '聂拉木县': '4300米',
  73. '岗巴县': '4700米以上',
  74. '定结县': '2500-4700米',
  75. '定日县': '平均5000米',
  76. '吉隆县': '4200米',
  77. '萨嘎县': '4487米',
  78. '仲巴县': '4772米',
  79. '南木林县': '3790米到4952米',
  80. '桑珠孜区': '3840米',
  81. '康马县': '4200-4600米',
  82. };
  83. return `
  84. <div style="background-color: #ffffff;box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);padding: 20px;border-radius: 5px;font-size: 36px;color: #333;z-index: 1000;border-color:#333">
  85. <div style="font-weight: bold;margin-bottom: 30px;">${params.name}</div>
  86. <div>海拔:${altitudeMap[params.name] ? altitudeMap[params.name] : '未知'}</div>
  87. </div>
  88. `
  89. }
  90. },
  91. geo3D: {
  92. show: true,
  93. map: "centerMap",
  94. left: "4%", //偏移量调整
  95. top: "5%", //偏移量调整
  96. roam: true,
  97. zoom: 10,
  98. regionHeight: 5,
  99. label: {
  100. show: true,
  101. distance: 200,
  102. borderRadius: 0,
  103. distanca: 0,
  104. fontSize: 30,
  105. color: "#ffffff", // 地图初始化区域字体颜色
  106. borderWidth: 0,
  107. borderColor: '#ffffff'
  108. },
  109. itemStyle: {
  110. // 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
  111. color: "#271f71", // 地图板块的颜色
  112. fontSize: 30,
  113. opacity: 1, // 图形的不透明度 [ default: 1 ]
  114. borderWidth: 10, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
  115. borderColor: "#6a63f4", // 图形描边的颜色。[ default: #333 ]
  116. },
  117. emphasis: {
  118. label: {
  119. show: true,
  120. color: "#000000", //悬浮字体颜色
  121. fontSize: 38,
  122. },
  123. itemStyle: {
  124. color: "#e2e1e1",
  125. opacity: 1,
  126. },
  127. },
  128. // shading: "color",
  129. light: {
  130. // 光照阴影
  131. main: {
  132. color: "#FFFFFF", // 光照颜色
  133. intensity: 2, // 光照强度
  134. shadowQuality: "light", // 阴影亮度
  135. shadow: true, // 是否显示阴影
  136. alpha: 50,
  137. beta: 10,
  138. },
  139. },
  140. regions: [],
  141. viewControl: {
  142. "projection": "perspective",
  143. "autoRotate": false,
  144. "autoRotateAfterStill": 3,
  145. "distance": 100.1931248935421, //默认比例
  146. "alpha": 83.592048936336816,
  147. "beta": 0.48683006219769,
  148. "minAlpha": 5,
  149. "maxAlpha": 40,
  150. "minBeta": -1036800,
  151. "maxBeta": 1036800,
  152. "animation": true,
  153. "animationDurationUpdate": 1000,
  154. "animationEasingUpdate": "cubicInOut",
  155. "orthographicSize": 60,
  156. "autoRotateDirection": "cw",
  157. "autoRotateSpeed": 10,
  158. "damping": 0.8,
  159. "rotateSensitivity": 1,
  160. "zoomSensitivity": 1,
  161. "panSensitivity": 1,
  162. "panMouseButton": "middle",
  163. "rotateMouseButton": "left",
  164. "minDistance": 40,
  165. "maxDistance": 400,
  166. "maxOrthographicSize": 400,
  167. "minOrthographicSize": 20,
  168. "center": [
  169. 0,
  170. 0,
  171. 0, 0
  172. ]
  173. },
  174. },
  175. series: [
  176. {
  177. type: "map3D", // 加载series数据
  178. seriesIndex: 0, // 第一个系列
  179. map: "centerMap",
  180. regionHeight: 0,
  181. boxHeight: 500,
  182. // left: 0,
  183. left: "4%", //偏移量调整
  184. top: "5%", //偏移量调整
  185. itemStyle: {
  186. // 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
  187. color: "rgba(37, 37, 38,1)", // 地图板块的颜色
  188. opacity: 0, // 图形的不透明度 [ default: 1 ]
  189. borderWidth: 0, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
  190. borderColor: "#69E8F5", // 图形描边的颜色。[ default: #333 ]
  191. },
  192. label: {
  193. show: true,
  194. color: "#FFFFFF",
  195. },
  196. regions: [],
  197. zlevel: 5,
  198. viewControl: {
  199. "projection": "perspective",
  200. "autoRotate": false,
  201. "autoRotateAfterStill": 3,
  202. "distance": 100.1931248935421, //默认比例
  203. "alpha": 83.592048936336816,
  204. "beta": 0.48683006219769,
  205. "minAlpha": 5,
  206. "maxAlpha": 40,
  207. "minBeta": -1036800,
  208. "maxBeta": 1036800,
  209. "animation": true,
  210. "animationDurationUpdate": 1000,
  211. "animationEasingUpdate": "cubicInOut",
  212. "orthographicSize": 60,
  213. "autoRotateDirection": "cw",
  214. "autoRotateSpeed": 10,
  215. "damping": 0.8,
  216. "rotateSensitivity": 1,
  217. "zoomSensitivity": 1,
  218. "panSensitivity": 1,
  219. "panMouseButton": "middle",
  220. "rotateMouseButton": "left",
  221. "minDistance": 40,
  222. "maxDistance": 400,
  223. "maxOrthographicSize": 400,
  224. "minOrthographicSize": 20,
  225. "center": [
  226. 0,
  227. -5,
  228. 0,
  229. ]
  230. },
  231. },
  232. {
  233. type: "scatter3D",
  234. coordinateSystem: "geo3D",
  235. data: [],
  236. symbol: "pin",
  237. symbolSize: 20,
  238. animation: true,
  239. animationDurationUpdate: 500,
  240. geo3DIndex: 0,
  241. silent: false,
  242. itemStyle: {
  243. opacity: 1,
  244. width: 1,
  245. },
  246. shading: "lambert",
  247. label: {
  248. show: false,
  249. position: "right",
  250. distance: 200, // 距离图形元素的距离
  251. color: "#ff0000",
  252. backgroundColor: "rgba(255, 255, 255, 0)",
  253. rich: {
  254. get: {
  255. color: "#00E3FF",
  256. lineHeight: 12,
  257. },
  258. set: {
  259. color: "#FFF100",
  260. lineHeight: 12,
  261. },
  262. date11: {
  263. color: "#FFFFFF",
  264. lineHeight: 12,
  265. },
  266. },
  267. zlevel: 6,
  268. },
  269. emphasis: {
  270. itemStyle: {
  271. color: "#FFF200",
  272. },
  273. label: {
  274. show: false,
  275. },
  276. },
  277. zlevel: 6,
  278. },
  279. ],
  280. };
  281. // myChart.showLoading();
  282. echarts.registerMap('centerMap', geoJson);
  283. // myChart.hideLoading();
  284. var mapFeatures = echarts.getMap("centerMap").geoJson.features;
  285. var geoCoordMap = {};
  286. mapFeatures.forEach(function (v) {
  287. // v.properties.center = _this.convertCoord(v.properties.center)
  288. // 地区名称
  289. var name = v.properties.name;
  290. // 地区经纬度
  291. geoCoordMap[name] = v.properties.center;
  292. });
  293. let currentIdx = -1;
  294. function highlightNext() {
  295. if (currentIdx++ >= 0) {
  296. // 防止下标增加到超过区域数组长度
  297. currentIdx %= mapFeatures.length;
  298. }
  299. highlightRegion(currentIdx) // 此处的currentIdx经过if判断,已经+1了
  300. setTimeout(highlightNext, 5000);
  301. }
  302. function highlightRegion(index) { // 高亮地图区域,改变对应的散点样式
  303. let regionName = mapFeatures[index].properties.name; // 高亮的区名
  304. option.geo3D.regions = [ // 高亮3D地图对应的区块
  305. {
  306. name: regionName,
  307. label: {
  308. show: true,
  309. color: "##000000",
  310. },
  311. itemStyle: {
  312. color: "#ffffff",
  313. opacity: 1,
  314. }
  315. }
  316. ];
  317. // 当前高亮区域有散点,需删除stroke动效中的该条数据并在fill动效中增加该条数据
  318. option.series[0].data = scatterData.filter(item => item.name !== regionName); // stroke散点数据
  319. option.series[1].data = scatterData.filter(item => item.name === regionName); // fill散点数据
  320. myChart.setOption(option);
  321. myChart.dispatchAction({ // 触发散点高亮事件,改变标签样式
  322. type: 'showTip',
  323. seriesIndex: 1, // series中的第二个图层(fill散点图层)
  324. dataIndex: 0 // 高亮第一条数据,由于fill散点图层只有一条数据,这里可以不指定
  325. });
  326. myChart.dispatchAction({
  327. type: 'highlight',
  328. seriesIndex: 0,
  329. dataIndex: 0
  330. });
  331. // 显示弹框
  332. myChart.dispatchAction({
  333. type: 'showTip',
  334. seriesIndex: 0,
  335. dataIndex: 0
  336. });
  337. // myChart.on('mouseover', () => {
  338. // console.log('mouseover')
  339. // // 停止定时器,清除之前的高亮
  340. // clearInterval(this.mTime)
  341. // this.mTime = ''
  342. // myChart.dispatchAction({
  343. // type: 'downplay',
  344. // seriesIndex: 0,
  345. // dataIndex: this.dataIndex
  346. // })
  347. // })
  348. }
  349. myChart.setOption(option);
  350. highlightNext()
  351. // this.mapActive(myChart)
  352. }
  353. }

这样就生成了一个3d地图,地图轮播效果

 

完整代码:

  1. <template>
  2. <div id="hello">
  3. </div>
  4. </template>
  5. <script>
  6. import * as echarts from 'echarts';
  7. import geoJson from "../assets/mapJSon/rkz.json"
  8. import coordtransform from 'coordtransform'
  9. export default {
  10. name: 'MapDemo',
  11. data() {
  12. return {
  13. dataIndex: 0,
  14. mTime:null
  15. }
  16. },
  17. props: {
  18. msg: String
  19. },
  20. methods: {
  21. convertCoord(coord) {
  22. const gcj02 = coordtransform.wgs84togcj02(coord[0], coord[1])
  23. const bd09 = coordtransform.gcj02tobd09(gcj02[0], gcj02[1])
  24. return bd09
  25. },
  26. },
  27. mounted() {
  28. // 基于准备好的dom,初始化echarts实例
  29. var myChart = echarts.init(document.getElementById('hello'));
  30. var scatterData = [
  31. { name: "亚东县", value: "2945米" },
  32. { name: "仁布县", value: "3950米" },
  33. { name: "谢通门县", value: "4008米" },
  34. { name: "萨迦县", value: "4330米" },
  35. { name: "拉孜县", value: "4012米" },
  36. { name: "昂仁县", value: "4320米" },
  37. { name: "江孜县", value: "约4000米" },
  38. { name: "白朗县", value: "平均4200米" },
  39. { name: "聂拉木县", value: "4300米" },
  40. { name: "昂仁县", value: "4320米" },
  41. { name: "岗巴县", value: "4700米以上" },
  42. { name: "定结县", value: "2500-4700米" },
  43. { name: "定日县", value: "平均5000米。" },
  44. { name: "吉隆县", value: "4200米" },
  45. { name: "萨嘎县", value: "4487米" },
  46. { name: "仲巴县", value: "4772米" },
  47. { name: "南木林县", value: "3790米到4952米" },
  48. { name: "桑珠孜区", value: "3840米" },
  49. { name: "康马县", value: "4200-4600米" }
  50. ];
  51. // 绘制图表
  52. let option = {
  53. // backgroundColor: "#fff",
  54. tooltip: {
  55. // 鼠标是否可以进入悬浮框
  56. show: true,
  57. confine: true,
  58. enterable: true,
  59. // 触发方式 mousemove, click, none, mousemove|click
  60. triggerOn: 'mousemove',
  61. // item 图形触发, axis 坐标轴触发, none 不触发
  62. trigger: 'item',
  63. // 浮层隐藏的延迟
  64. hideDelay: 100,
  65. // 背景色
  66. backgroundColor: 'rgba(110, 110, 110,.5)',
  67. formatter: function (params) {
  68. const altitudeMap = {
  69. '亚东县': '2945米',
  70. '仁布县': '3950米',
  71. '谢通门县': '4008米',
  72. '萨迦县': '4330米',
  73. '拉孜县': '4012米',
  74. '昂仁县': '4320米',
  75. '江孜县': '约4000米',
  76. '白朗县': '平均4200米',
  77. '聂拉木县': '4300米',
  78. '岗巴县': '4700米以上',
  79. '定结县': '2500-4700米',
  80. '定日县': '平均5000米',
  81. '吉隆县': '4200米',
  82. '萨嘎县': '4487米',
  83. '仲巴县': '4772米',
  84. '南木林县': '3790米到4952米',
  85. '桑珠孜区': '3840米',
  86. '康马县': '4200-4600米',
  87. };
  88. return `
  89. <div style="background-color: #ffffff;box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);padding: 20px;border-radius: 5px;font-size: 36px;color: #333;z-index: 1000;border-color:#333">
  90. <div style="font-weight: bold;margin-bottom: 30px;">${params.name}</div>
  91. <div>海拔:${altitudeMap[params.name] ? altitudeMap[params.name] : '未知'}</div>
  92. </div>
  93. `
  94. }
  95. },
  96. geo3D: {
  97. show: true,
  98. map: "centerMap",
  99. left: "4%", //偏移量调整
  100. top: "5%", //偏移量调整
  101. roam: true,
  102. zoom: 10,
  103. regionHeight: 5,
  104. label: {
  105. show: true,
  106. distance: 200,
  107. borderRadius: 0,
  108. distanca: 0,
  109. fontSize: 30,
  110. color: "#ffffff", // 地图初始化区域字体颜色
  111. borderWidth: 0,
  112. borderColor: '#ffffff'
  113. },
  114. itemStyle: {
  115. // 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
  116. color: "#271f71", // 地图板块的颜色
  117. fontSize: 30,
  118. opacity: 1, // 图形的不透明度 [ default: 1 ]
  119. borderWidth: 10, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
  120. borderColor: "#6a63f4", // 图形描边的颜色。[ default: #333 ]
  121. },
  122. emphasis: {
  123. label: {
  124. show: true,
  125. color: "#000000", //悬浮字体颜色
  126. fontSize: 38,
  127. },
  128. itemStyle: {
  129. color: "#e2e1e1",
  130. opacity: 1,
  131. },
  132. },
  133. // shading: "color",
  134. light: {
  135. // 光照阴影
  136. main: {
  137. color: "#FFFFFF", // 光照颜色
  138. intensity: 2, // 光照强度
  139. shadowQuality: "light", // 阴影亮度
  140. shadow: true, // 是否显示阴影
  141. alpha: 50,
  142. beta: 10,
  143. },
  144. },
  145. regions: [],
  146. viewControl: {
  147. "projection": "perspective",
  148. "autoRotate": false,
  149. "autoRotateAfterStill": 3,
  150. "distance": 100.1931248935421, //默认比例
  151. "alpha": 83.592048936336816,
  152. "beta": 0.48683006219769,
  153. "minAlpha": 5,
  154. "maxAlpha": 40,
  155. "minBeta": -1036800,
  156. "maxBeta": 1036800,
  157. "animation": true,
  158. "animationDurationUpdate": 1000,
  159. "animationEasingUpdate": "cubicInOut",
  160. "orthographicSize": 60,
  161. "autoRotateDirection": "cw",
  162. "autoRotateSpeed": 10,
  163. "damping": 0.8,
  164. "rotateSensitivity": 1,
  165. "zoomSensitivity": 1,
  166. "panSensitivity": 1,
  167. "panMouseButton": "middle",
  168. "rotateMouseButton": "left",
  169. "minDistance": 40,
  170. "maxDistance": 400,
  171. "maxOrthographicSize": 400,
  172. "minOrthographicSize": 20,
  173. "center": [
  174. 0,
  175. 0,
  176. 0, 0
  177. ]
  178. },
  179. },
  180. series: [
  181. {
  182. type: "map3D", // 加载series数据
  183. seriesIndex: 0, // 第一个系列
  184. map: "centerMap",
  185. regionHeight: 0,
  186. boxHeight: 500,
  187. // left: 0,
  188. left: "4%", //偏移量调整
  189. top: "5%", //偏移量调整
  190. itemStyle: {
  191. // 三维地理坐标系组件 中三维图形的视觉属性,包括颜色,透明度,描边等。
  192. color: "rgba(37, 37, 38,1)", // 地图板块的颜色
  193. opacity: 0, // 图形的不透明度 [ default: 1 ]
  194. borderWidth: 0, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域 [ default: 0 ]
  195. borderColor: "#69E8F5", // 图形描边的颜色。[ default: #333 ]
  196. },
  197. label: {
  198. show: true,
  199. color: "#FFFFFF",
  200. },
  201. regions: [],
  202. zlevel: 5,
  203. viewControl: {
  204. "projection": "perspective",
  205. "autoRotate": false,
  206. "autoRotateAfterStill": 3,
  207. "distance": 100.1931248935421, //默认比例
  208. "alpha": 83.592048936336816,
  209. "beta": 0.48683006219769,
  210. "minAlpha": 5,
  211. "maxAlpha": 40,
  212. "minBeta": -1036800,
  213. "maxBeta": 1036800,
  214. "animation": true,
  215. "animationDurationUpdate": 1000,
  216. "animationEasingUpdate": "cubicInOut",
  217. "orthographicSize": 60,
  218. "autoRotateDirection": "cw",
  219. "autoRotateSpeed": 10,
  220. "damping": 0.8,
  221. "rotateSensitivity": 1,
  222. "zoomSensitivity": 1,
  223. "panSensitivity": 1,
  224. "panMouseButton": "middle",
  225. "rotateMouseButton": "left",
  226. "minDistance": 40,
  227. "maxDistance": 400,
  228. "maxOrthographicSize": 400,
  229. "minOrthographicSize": 20,
  230. "center": [
  231. 0,
  232. -5,
  233. 0,
  234. ]
  235. },
  236. },
  237. {
  238. type: "scatter3D",
  239. coordinateSystem: "geo3D",
  240. data: [],
  241. symbol: "pin",
  242. symbolSize: 20,
  243. animation: true,
  244. animationDurationUpdate: 500,
  245. geo3DIndex: 0,
  246. silent: false,
  247. itemStyle: {
  248. opacity: 1,
  249. width: 1,
  250. },
  251. shading: "lambert",
  252. label: {
  253. show: false,
  254. position: "right",
  255. distance: 200, // 距离图形元素的距离
  256. color: "#ff0000",
  257. backgroundColor: "rgba(255, 255, 255, 0)",
  258. rich: {
  259. get: {
  260. color: "#00E3FF",
  261. lineHeight: 12,
  262. },
  263. set: {
  264. color: "#FFF100",
  265. lineHeight: 12,
  266. },
  267. date11: {
  268. color: "#FFFFFF",
  269. lineHeight: 12,
  270. },
  271. },
  272. zlevel: 6,
  273. },
  274. emphasis: {
  275. itemStyle: {
  276. color: "#FFF200",
  277. },
  278. label: {
  279. show: false,
  280. },
  281. },
  282. zlevel: 6,
  283. },
  284. ],
  285. };
  286. // myChart.showLoading();
  287. echarts.registerMap('centerMap', geoJson);
  288. // myChart.hideLoading();
  289. var mapFeatures = echarts.getMap("centerMap").geoJson.features;
  290. var geoCoordMap = {};
  291. mapFeatures.forEach(function (v) {
  292. // v.properties.center = _this.convertCoord(v.properties.center)
  293. // 地区名称
  294. var name = v.properties.name;
  295. // 地区经纬度
  296. geoCoordMap[name] = v.properties.center;
  297. });
  298. let currentIdx = -1;
  299. function highlightNext() {
  300. if (currentIdx++ >= 0) {
  301. // 防止下标增加到超过区域数组长度
  302. currentIdx %= mapFeatures.length;
  303. }
  304. highlightRegion(currentIdx) // 此处的currentIdx经过if判断,已经+1了
  305. setTimeout(highlightNext, 5000);
  306. }
  307. function highlightRegion(index) { // 高亮地图区域,改变对应的散点样式
  308. let regionName = mapFeatures[index].properties.name; // 高亮的区名
  309. option.geo3D.regions = [ // 高亮3D地图对应的区块
  310. {
  311. name: regionName,
  312. label: {
  313. show: true,
  314. color: "##000000",
  315. },
  316. itemStyle: {
  317. color: "#ffffff",
  318. opacity: 1,
  319. }
  320. }
  321. ];
  322. // 当前高亮区域有散点,需删除stroke动效中的该条数据并在fill动效中增加该条数据
  323. option.series[0].data = scatterData.filter(item => item.name !== regionName); // stroke散点数据
  324. option.series[1].data = scatterData.filter(item => item.name === regionName); // fill散点数据
  325. myChart.setOption(option);
  326. myChart.dispatchAction({ // 触发散点高亮事件,改变标签样式
  327. type: 'showTip',
  328. seriesIndex: 1, // series中的第二个图层(fill散点图层)
  329. dataIndex: 0 // 高亮第一条数据,由于fill散点图层只有一条数据,这里可以不指定
  330. });
  331. myChart.dispatchAction({
  332. type: 'highlight',
  333. seriesIndex: 0,
  334. dataIndex: 0
  335. });
  336. // 显示弹框
  337. myChart.dispatchAction({
  338. type: 'showTip',
  339. seriesIndex: 0,
  340. dataIndex: 0
  341. });
  342. // myChart.on('mouseover', () => {
  343. // console.log('mouseover')
  344. // // 停止定时器,清除之前的高亮
  345. // clearInterval(this.mTime)
  346. // this.mTime = ''
  347. // myChart.dispatchAction({
  348. // type: 'downplay',
  349. // seriesIndex: 0,
  350. // dataIndex: this.dataIndex
  351. // })
  352. // })
  353. }
  354. myChart.setOption(option);
  355. highlightNext()
  356. // this.mapActive(myChart)
  357. }
  358. }
  359. </script>
  360. <style scoped>
  361. #hello {
  362. position: absolute;
  363. top: 50%;
  364. left: 48%;
  365. width: 2604px;
  366. height: 1700px;
  367. z-index: 9999;
  368. /* border: 20px solid red;s */
  369. /* border-color: rgba(0, 0, 0, 0) !important; */
  370. transform: translate(-50%, -50%);
  371. }
  372. </style>

总结

在网上寻找适合自己的方案总是非常耗费精力和时间的。但是,我克服了这些困难,经过自己的研究和实践,最终终于做出来了自己想要的结果。

作为一名程序员,我觉得最重要的是保持不断探索、学习和尝试的精神。当我遇到问题时,我会尝试各种可能的解决方案,来找到最适合我自己的答案。这样不仅可以提升自己的技能水平,也可以增强自己的解决问题的能力。

通过自己的努力和研究,我创建了自己想要的效果,这让我非常自豪和满足。我希望我能够将这个过程记录下来,与其他人分享,让更多的人从中受益。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号