小言_互联网的博客

基于 Echarts + Python Flask 实现的动态实时可视化数据大屏展示范例二

427人阅读  评论(0)

近年来,数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的“酷炫吊炸天”的霸道总裁大屏驾驶舱。今天为大家来分享的是 物流大数据服务平台。

话不多说,开始分享干货,欢迎讨论!QQ和微信号相同 6550523

首先看动态效果图 :

 

一、 确定需求方案

最终样式图

1、确定产品上线部署的屏幕LED分辨率

1920px*1080px,F11全屏后占满整屏且无滚动条。其它分辨率也可自适应。

2、功能模块

  • 湖南货物收入
  • 湖南省地图
  • 全国地图
  • 货物周转量
  • 湖南高速公路
  • 湖南省飞机场
  • 湖南省业务量
  • 货物周转量

3、部署方式 

基于免安装可执行程序:支持Windows、Linux、Mac等各种操作系统;将程序复制到服务器上即可,无需其它环境依赖;

观看方式:既可在服务器上直接观看程序界面,也可在远程用浏览器打开播放,例如Chrome浏览器、360浏览器等。

二、整体架构设计

1、前端基于Echarts开源库设计,使用WebStorm编辑器;

2、后端基于Python Web实现,使用Pycharm编辑器;

3、数据传输格式:JSON;

4、数据源类型:目前已支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite、Excel表格等,还可以定制HTTP API接口方式或其它类型数据库。

5、数据更新方式:摒弃了前端页面定时拉取的方式(这种方式带来严重的资源浪费),采用后端数据实时更新,实时推送到前端展示;

三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

1、前端html代码:


  
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="*" http-equiv="Access-Control-Allow-Origin"/>
  6. <title>index </title>
  7. <script src="js/jquery.js" type="text/javascript"> </script>
  8. <link href="css/comon0.css" rel="stylesheet">
  9. </head>
  10. <script>
  11. $( window).load( function () {
  12. $( ".loading").fadeOut()
  13. })
  14. /****/
  15. $( document).ready( function () {
  16. var whei = $( window).width()
  17. $( "html").css({ fontSize: whei / 20})
  18. $( window).resize( function () {
  19. var whei = $( window).width()
  20. $( "html").css({ fontSize: whei / 20})
  21. });
  22. });
  23. </script>
  24. <body>
  25. <!--<div class="canvas" style="opacity: .2">-->
  26. <!-- <iframe frameborder="0" src="js/index.html" style="width: 100%; height: 100%"></iframe>-->
  27. <!--</div>-->
  28. <div class="loading">
  29. <div class="loadbox"> <img src="picture/loading.gif"> 页面加载中... </div>
  30. </div>
  31. <div class="head">
  32. <h1>案例 - 物流大数据服务平台 </h1>
  33. <div class="weather"> <!--<img src="picture/weather.png"><span>多云转小雨</span>--> <span id="showTime"> </span> </div>
  34. <script>
  35. var t = null;
  36. t = setTimeout(time, 1000); //开始运行
  37. function time() {
  38. clearTimeout(t); //清除定时器
  39. dt = new Date();
  40. var y = dt.getFullYear();
  41. var mt = dt.getMonth() + 1;
  42. var day = dt.getDate();
  43. var h = dt.getHours(); //获取时
  44. var m = dt.getMinutes(); //获取分
  45. var s = dt.getSeconds(); //获取秒
  46. document.getElementById( "showTime").innerHTML = y + "年" + mt + "月" + day + "-" + h + "时" + m + "分" + s + "秒";
  47. //async_data();
  48. t = setTimeout(time, 1000); //设定定时器,循环运行
  49. }
  50. </script>
  51. </div>
  52. <div class="mainbox">
  53. <ul class="clearfix">
  54. <li>
  55. <div class="boxall" style="height: 3.1rem">
  56. <div class="main_title"> <img alt="" src="img/t_1.png">湖南货物收入 </div>
  57. <div class="allnav" id="echart_1"> </div>
  58. <div class="boxfoot"> </div>
  59. </div>
  60. <div class="boxall" style="height: 3.15rem">
  61. <div class="main_title">湖南省地图 <img alt="" src="img/t_2.png"> </div>
  62. <div class="allnav" id="echart_2"> </div>
  63. <div class="boxfoot"> </div>
  64. </div>
  65. <div class="boxall" style="height: 3.1rem" >
  66. <div class="main_title">
  67. <img alt="" src="img/t_7.png">
  68. 湖南省交通
  69. </div>
  70. <div class="main_table t_btn8">
  71. <table id="table_1">
  72. <thead>
  73. <tr>
  74. <th>运营数(辆) </th>
  75. <th>线路总长度(公里) </th>
  76. <th>客运总量(万人次) </th>
  77. <th>日期 </th>
  78. </tr>
  79. </thead>
  80. <tbody>
  81. <tr>
  82. <td>21059 </td>
  83. <td>26497 </td>
  84. <td>184448 </td>
  85. <td>2018年 </td>
  86. </tr>
  87. <tr>
  88. <td>18777 </td>
  89. <td>21140 </td>
  90. <td>188808 </td>
  91. <td>2017年 </td>
  92. </tr>
  93. <tr>
  94. <td>15757 </td>
  95. <td>20225 </td>
  96. <td>201143 </td>
  97. <td>2016年 </td>
  98. </tr>
  99. <tr>
  100. <td>17458 </td>
  101. <td>19567 </td>
  102. <td>202446 </td>
  103. <td>2015年 </td>
  104. </tr>
  105. <tr>
  106. <td>11323 </td>
  107. <td>14562 </td>
  108. <td>279854 </td>
  109. <td>2014年 </td>
  110. </tr>
  111. </tbody>
  112. </table>
  113. </div>
  114. <div class="boxfoot"> </div>
  115. </div>
  116. </li>
  117. <li>
  118. <div class="boxall" style="height: 6.5rem">
  119. <div class="main_title">全国地图 <img alt="" src="img/t_map.png"> </div>
  120. <div class="map4" id="echart_map" > </div>
  121. <div class="boxfoot"> </div>
  122. </div>
  123. <div class="boxall" style="height: 3.1rem" >
  124. <div class="main_title" >
  125. <img alt="" src="img/t_7.png">
  126. 湖南省业务量
  127. </div>
  128. <div class="main_table t_btn8">
  129. <table id="table_2">
  130. <thead>
  131. <tr>
  132. <th>运营数(辆) </th>
  133. <th>线路总长度(公里) </th>
  134. <th>客运总量(万人次) </th>
  135. <th>日期 </th>
  136. </tr>
  137. </thead>
  138. <tbody>
  139. <tr>
  140. <td>21059 </td>
  141. <td>26497 </td>
  142. <td>184448 </td>
  143. <td>2018年 </td>
  144. </tr>
  145. <tr>
  146. <td>18777 </td>
  147. <td>21140 </td>
  148. <td>188808 </td>
  149. <td>2017年 </td>
  150. </tr>
  151. <tr>
  152. <td>15757 </td>
  153. <td>20225 </td>
  154. <td>201143 </td>
  155. <td>2016年 </td>
  156. </tr>
  157. <tr>
  158. <td>17458 </td>
  159. <td>19567 </td>
  160. <td>202446 </td>
  161. <td>2015年 </td>
  162. </tr>
  163. <tr>
  164. <td>11323 </td>
  165. <td>14562 </td>
  166. <td>279854 </td>
  167. <td>2014年 </td>
  168. </tr>
  169. </tbody>
  170. </table>
  171. </div>
  172. <div class="boxfoot"> </div>
  173. </div>
  174. </li>
  175. <li>
  176. <div class="boxall" style="height:3.1rem">
  177. <div class="main_title"> <img alt="" src="img/t_4.png">货物周转量 </div>
  178. <div class="allnav" id="echart_3"> </div>
  179. <div class="boxfoot"> </div>
  180. </div>
  181. <div class="boxall" style="height: 3.15rem">
  182. <div class="main_title"> <img alt="" src="img/t_5.png">湖南高速公路 </div>
  183. <div class="allnav" id="echart_4"> </div>
  184. <div class="boxfoot"> </div>
  185. </div>
  186. <div class="boxall" style="height: 3.1rem">
  187. <div class="main_title"> <img alt="" src="img/t_6.png">湖南省飞机场 </div>
  188. <div class="allnav" id="echart_5"> </div>
  189. <div class="boxfoot"> </div>
  190. </div>
  191. </li>
  192. </ul>
  193. </div>
  194. <div class="back"> </div>
  195. <script src="js/area_echarts.js" type="text/javascript"> </script>
  196. <script src="js/jquery-2.2.1.min.js"> </script>
  197. <script src="js/bootstrap.min.js"> </script>
  198. <script src="js/common.js"> </script>
  199. <!--<script src="js/dataTool.js"></script>-->
  200. <script src="js/echarts.min.js"> </script>
  201. <script src="js/index.js"> </script>
  202. <script src="js/china.js"> </script>
  203. <script src="js/hunan.js"> </script>
  204. </body>
  205. </html>

2.前端JS代码


  
  1. $( function () {
  2. echart_1();
  3. echart_2();
  4. echart_3();
  5. echart_4();
  6. echart_map();
  7. echart_5();
  8. //echart_1湖南货物收入
  9. function echart_1() {
  10. chart_1_data = [{
  11. value: 900.58,
  12. name: '张家口',
  13. itemStyle: {
  14. normal: {
  15. color: '#f845f1'
  16. }
  17. }
  18. },
  19. {
  20. value: 1100.58,
  21. name: '承德',
  22. itemStyle: {
  23. normal: {
  24. color: '#ad46f3'
  25. }
  26. }
  27. },
  28. {
  29. value: 1200.58,
  30. name: '衡水',
  31. itemStyle: {
  32. normal: {
  33. color: '#5045f6'
  34. }
  35. }
  36. },
  37. {
  38. value: 1300.58,
  39. name: '邢台',
  40. itemStyle: {
  41. normal: {
  42. color: '#4777f5'
  43. }
  44. }
  45. },
  46. {
  47. value: 1400.58,
  48. name: '邯郸',
  49. itemStyle: {
  50. normal: {
  51. color: '#44aff0'
  52. }
  53. }
  54. },
  55. {
  56. value: 1500.58,
  57. name: '保定',
  58. itemStyle: {
  59. normal: {
  60. color: '#45dbf7'
  61. }
  62. }
  63. },
  64. {
  65. value: 1500.58,
  66. name: '秦皇岛',
  67. itemStyle: {
  68. normal: {
  69. color: '#f6d54a'
  70. }
  71. }
  72. },
  73. {
  74. value: 1600.58,
  75. name: '石家庄',
  76. itemStyle: {
  77. normal: {
  78. color: '#f69846'
  79. }
  80. }
  81. },
  82. {
  83. value: 1800,
  84. name: '唐山',
  85. itemStyle: {
  86. normal: {
  87. color: '#ff4343'
  88. }
  89. }
  90. },
  91. {
  92. value: 0,
  93. name: "",
  94. itemStyle: {
  95. normal: {
  96. color: 'transparent'
  97. }
  98. },
  99. label: {
  100. show: false
  101. },
  102. labelLine: {
  103. show: false
  104. }
  105. },
  106. {
  107. value: 0,
  108. name: "",
  109. itemStyle: {
  110. normal: {
  111. color: 'transparent'
  112. }
  113. },
  114. label: {
  115. show: false
  116. },
  117. labelLine: {
  118. show: false
  119. }
  120. },
  121. {
  122. value: 0,
  123. name: "",
  124. itemStyle: {
  125. normal: {
  126. color: 'transparent'
  127. }
  128. },
  129. label: {
  130. show: false
  131. },
  132. labelLine: {
  133. show: false
  134. }
  135. },
  136. {
  137. value: 0,
  138. name: "",
  139. itemStyle: {
  140. normal: {
  141. color: 'transparent'
  142. }
  143. },
  144. label: {
  145. show: false
  146. },
  147. labelLine: {
  148. show: false
  149. }
  150. },
  151. {
  152. value: 0,
  153. name: "",
  154. itemStyle: {
  155. normal: {
  156. color: 'transparent'
  157. }
  158. },
  159. label: {
  160. show: false
  161. },
  162. labelLine: {
  163. show: false
  164. }
  165. },
  166. {
  167. value: 0,
  168. name: "",
  169. itemStyle: {
  170. normal: {
  171. color: 'transparent'
  172. }
  173. },
  174. label: {
  175. show: false
  176. },
  177. labelLine: {
  178. show: false
  179. }
  180. },
  181. {
  182. value: 0,
  183. name: "",
  184. itemStyle: {
  185. normal: {
  186. color: 'transparent'
  187. }
  188. },
  189. label: {
  190. show: false
  191. },
  192. labelLine: {
  193. show: false
  194. }
  195. },
  196. {
  197. value: 0,
  198. name: "",
  199. itemStyle: {
  200. normal: {
  201. color: 'transparent'
  202. }
  203. },
  204. label: {
  205. show: false
  206. },
  207. labelLine: {
  208. show: false
  209. }
  210. },
  211. {
  212. value: 0,
  213. name: "",
  214. itemStyle: {
  215. normal: {
  216. color: 'transparent'
  217. }
  218. },
  219. label: {
  220. show: false
  221. },
  222. labelLine: {
  223. show: false
  224. }
  225. }
  226. ]
  227. // console.log(JSON.stringify( chart_1_data ));
  228. // 基于准备好的dom,初始化echarts实例
  229. var myChart = echarts.init( document.getElementById( 'echart_1'));
  230. option = {
  231. //鼠标缩放和平移
  232. roam: true,
  233. tooltip: {
  234. trigger: 'item',
  235. formatter: "{a} <br/>{b} : {c}万元"
  236. },
  237. legend: {
  238. x: 'center',
  239. y: '15%',
  240. data: [ '张家口', '承德', '衡水', '邢台', '邯郸', '保定', '秦皇岛', '石家庄', '唐山'],
  241. icon: 'circle',
  242. textStyle: {
  243. color: '#fff',
  244. }
  245. },
  246. calculable: true,
  247. series: [{
  248. name: '',
  249. type: 'pie',
  250. //起始角度,支持范围[0, 360]
  251. startAngle: 0,
  252. //饼图的半径,数组的第一项是内半径,第二项是外半径
  253. radius: [ 41, 100.75],
  254. //支持设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度
  255. center: [ '50%', '40%'],
  256. //是否展示成南丁格尔图,通过半径区分数据大小。可选择两种模式:
  257. // 'radius' 面积展现数据的百分比,半径展现数据的大小。
  258. // 'area' 所有扇区面积相同,仅通过半径展现数据大小
  259. roseType: 'area',
  260. //是否启用防止标签重叠策略,默认开启,圆环图这个例子中需要强制所有标签放在中心位置,可以将该值设为 false。
  261. avoidLabelOverlap: false,
  262. label: {
  263. normal: {
  264. show: true,
  265. formatter: '{c}万元'
  266. },
  267. emphasis: {
  268. show: true
  269. }
  270. },
  271. labelLine: {
  272. normal: {
  273. show: true,
  274. length2: 1,
  275. },
  276. emphasis: {
  277. show: true
  278. }
  279. },
  280. data: chart_1_data
  281. }]
  282. };
  283. // 使用刚指定的配置项和数据显示图表。
  284. myChart.setOption(option);
  285. window.addEventListener( "resize", function () {
  286. myChart.resize();
  287. });
  288. }
  289. //echart_2湖南省地图
  290. function echart_2() {
  291. series_data = [{
  292. name: '长沙市',
  293. value: 100
  294. }, {
  295. name: '株洲市',
  296. value: 96
  297. }, {
  298. name: '湘潭市',
  299. value: 98
  300. }, {
  301. name: '衡阳市',
  302. value: 80
  303. }, {
  304. name: '邵阳市',
  305. value: 88
  306. }, {
  307. name: '岳阳市',
  308. value: 79
  309. }, {
  310. name: '常德市',
  311. value: 77,
  312. }, {
  313. name: '张家界市',
  314. value: 33
  315. }, {
  316. name: '益阳市',
  317. value: 69,
  318. }, {
  319. name: '郴州市',
  320. value: 66
  321. }, {
  322. name: '永州市',
  323. value: 22
  324. }, {
  325. name: '娄底市',
  326. value: 51
  327. }, {
  328. name: '湘西土家族苗族自治州',
  329. value: 44
  330. }, {
  331. name: '怀化市',
  332. value: 9
  333. }];
  334. // console.log(JSON.stringify(data));
  335. // 基于准备好的dom,初始化echarts实例
  336. var myChart = echarts.init( document.getElementById( 'echart_2'));
  337. myChart.setOption(option = {
  338. //鼠标缩放和平移
  339. roam: true,
  340. // backgroundColor: '#ffffff',
  341. tooltip: {
  342. trigger: 'item',
  343. formatter: '{b}<br/>{c} (p / km2)'
  344. },
  345. visualMap: {
  346. show: true,
  347. min: 0,
  348. max: 100,
  349. left: 'left',
  350. top: 'bottom',
  351. text: [ '高', '低'], // 文本,默认为数值文本
  352. // realtime: true,
  353. calculable: true,
  354. // text文字颜色
  355. textStyle:{
  356. color: '#ffffff',
  357. },
  358. inRange: {
  359. color: [ 'lightskyblue', 'yellow', 'orangered']
  360. }
  361. },
  362. series: [{
  363. type: 'map',
  364. mapType: 'hunan',
  365. zlevel: 2,
  366. label: {
  367. show: true
  368. },
  369. data: series_data
  370. }]
  371. });
  372. // 使用刚指定的配置项和数据显示图表。
  373. window.addEventListener( "resize", function () {
  374. myChart.resize();
  375. });
  376. }
  377. // echart_map中国地图
  378. function echart_map() {
  379. // 基于准备好的dom,初始化echarts实例
  380. var myChart = echarts.init( document.getElementById( 'echart_map'));
  381. var mapName = 'china'
  382. var data = []
  383. var toolTipData = [];
  384. /*获取地图数据*/
  385. myChart.showLoading();
  386. var mapFeatures = echarts.getMap(mapName).geoJson.features;
  387. myChart.hideLoading();
  388. var geoCoordMap = {
  389. '福州': [ 119.4543, 25.9222],
  390. '长春': [ 125.8154, 44.2584],
  391. '重庆': [ 107.7539, 30.1904],
  392. '西安': [ 109.1162, 34.2004],
  393. '成都': [ 103.9526, 30.7617],
  394. '常州': [ 119.4543, 31.5582],
  395. '北京': [ 116.4551, 40.2539],
  396. '北海': [ 109.314, 21.6211],
  397. '海口': [ 110.3893, 19.8516],
  398. '长沙': [ 113.019455, 28.200103],
  399. '上海': [ 121.40, 31.73],
  400. '内蒙古': [ 106.82, 39.67]
  401. };
  402. var GZData = [
  403. [{
  404. name: '长沙'
  405. }, {
  406. name: '福州',
  407. value: 95
  408. }],
  409. [{
  410. name: '长沙'
  411. }, {
  412. name: '长春',
  413. value: 80
  414. }],
  415. [{
  416. name: '长沙'
  417. }, {
  418. name: '重庆',
  419. value: 70
  420. }],
  421. [{
  422. name: '长沙'
  423. }, {
  424. name: '西安',
  425. value: 60
  426. }],
  427. [{
  428. name: '长沙'
  429. }, {
  430. name: '成都',
  431. value: 50
  432. }],
  433. [{
  434. name: '长沙'
  435. }, {
  436. name: '常州',
  437. value: 40
  438. }],
  439. [{
  440. name: '长沙'
  441. }, {
  442. name: '北京',
  443. value: 30
  444. }],
  445. [{
  446. name: '长沙'
  447. }, {
  448. name: '北海',
  449. value: 20
  450. }],
  451. [{
  452. name: '长沙'
  453. }, {
  454. name: '海口',
  455. value: 10
  456. }],
  457. [{
  458. name: '长沙'
  459. }, {
  460. name: '上海',
  461. value: 80
  462. }],
  463. [{
  464. name: '长沙'
  465. }, {
  466. name: '内蒙古',
  467. value: 80
  468. }]
  469. ];
  470. var convertData = function (data) {
  471. var res = [];
  472. for ( var i = 0; i < data.length; i++) {
  473. var dataItem = data[i];
  474. var fromCoord = geoCoordMap[dataItem[ 0].name];
  475. var toCoord = geoCoordMap[dataItem[ 1].name];
  476. if (fromCoord && toCoord) {
  477. res.push({
  478. fromName: dataItem[ 0].name,
  479. toName: dataItem[ 1].name,
  480. coords: [fromCoord, toCoord]
  481. });
  482. }
  483. }
  484. return res;
  485. };
  486. var color = [ '#c5f80e'];
  487. var series = [];
  488. [
  489. [ '石家庄', GZData]
  490. ].forEach( function (item, i) {
  491. console.log(i, item, item[ 0], item[ 1])
  492. series.push({
  493. name: item[ 0],
  494. type: 'lines',
  495. zlevel: 2,
  496. symbol: [ 'none', 'arrow'],
  497. symbolSize: 10,
  498. effect: {
  499. show: true,
  500. period: 6,
  501. trailLength: 0,
  502. symbol: 'arrow',
  503. symbolSize: 5
  504. },
  505. lineStyle: {
  506. normal: {
  507. color: color[i],
  508. width: 1,
  509. opacity: 0.6,
  510. curveness: 0.2
  511. }
  512. },
  513. data: convertData(item[ 1])
  514. }, {
  515. name: item[ 0],
  516. type: 'effectScatter',
  517. coordinateSystem: 'geo',
  518. zlevel: 2,
  519. rippleEffect: {
  520. brushType: 'stroke'
  521. },
  522. label: {
  523. normal: {
  524. show: true,
  525. position: 'right',
  526. formatter: '{b}'
  527. }
  528. },
  529. symbolSize: function (val) {
  530. return val[ 2] / 8;
  531. },
  532. itemStyle: {
  533. normal: {
  534. color: color[i]
  535. }
  536. },
  537. data: item[ 1].map( function (dataItem) {
  538. v = {
  539. name: dataItem[ 1].name,
  540. value: geoCoordMap[dataItem[ 1].name].concat([dataItem[ 1].value])
  541. };
  542. return v
  543. })
  544. });
  545. });
  546. option = {
  547. //鼠标缩放和平移
  548. roam: true,
  549. tooltip: {
  550. trigger: 'item'
  551. },
  552. geo: {
  553. map: 'china',
  554. label: {
  555. emphasis: {
  556. show: false
  557. }
  558. },
  559. roam: true,
  560. itemStyle: {
  561. normal: {
  562. borderColor: 'rgba(147, 235, 248, 1)',
  563. borderWidth: 1,
  564. areaColor: {
  565. type: 'radial',
  566. x: 0.5,
  567. y: 0.5,
  568. r: 0.8,
  569. colorStops: [{
  570. offset: 0,
  571. color: 'rgba(175,238,238, 0)' // 0% 处的颜色
  572. }, {
  573. offset: 1,
  574. color: 'rgba(47,79,79, .1)' // 100% 处的颜色
  575. }],
  576. globalCoord: false // 缺省为 false
  577. },
  578. shadowColor: 'rgba(128, 217, 248, 1)',
  579. // shadowColor: 'rgba(255, 255, 255, 1)',
  580. shadowOffsetX: -2,
  581. shadowOffsetY: 2,
  582. shadowBlur: 10
  583. },
  584. emphasis: {
  585. areaColor: '#389BB7',
  586. borderWidth: 0
  587. }
  588. }
  589. },
  590. series: series
  591. };
  592. // 使用刚指定的配置项和数据显示图表。
  593. myChart.setOption(option);
  594. window.addEventListener( "resize", function () {
  595. myChart.resize();
  596. });
  597. }
  598. //echart_3货物周转量
  599. function echart_3() {
  600. // 基于准备好的dom,初始化echarts实例
  601. var myChart = echarts.init( document.getElementById( 'echart_3'));
  602. data = [
  603. {
  604. name: '铁路货物',
  605. type: 'line',
  606. areaStyle: {},
  607. data:[ 3961.88, 4233.63, 4183.14, 3633.01, 3704.47]
  608. },
  609. {
  610. name: '国家铁路货物',
  611. type: 'line',
  612. areaStyle: {},
  613. data:[ 3374.76, 3364.76, 3274.76, 3371.82, 3259.87]
  614. },
  615. {
  616. name: '地方铁路货物',
  617. type: 'line',
  618. areaStyle: {},
  619. data:[ 14.77, 15.17, 13.17, 14.56, 15.84]
  620. },
  621. {
  622. name: '合资铁路货物',
  623. type: 'line',
  624. areaStyle: {},
  625. data:[ 686.17, 847.26, 895.22, 865.28, 886.72]
  626. },
  627. {
  628. name: '公路货物',
  629. type: 'line',
  630. areaStyle: {},
  631. data:[ 6133.47, 6577.89, 7019.56, 6821.48, 7294.59]
  632. },
  633. {
  634. name: '水运货物',
  635. type: 'line',
  636. areaStyle: {},
  637. data:[ 509.60, 862.54, 1481.77, 1552.79, 1333.62]
  638. }
  639. ]
  640. // console.log(JSON.stringify(data))
  641. // myChart.clear();
  642. option = {
  643. //鼠标缩放和平移
  644. roam: true,
  645. title: {
  646. text: ''
  647. },
  648. tooltip: {
  649. trigger: 'axis'
  650. },
  651. legend: {
  652. data: [ '铁路货物', '国家铁路货物', '地方铁路货物', '合资铁路货物', '公路货物', '水运货物'],
  653. textStyle: {
  654. color: '#fff'
  655. },
  656. // top: '8%',
  657. },
  658. grid: {
  659. top: '40%',
  660. left: '3%',
  661. right: '4%',
  662. bottom: '3%',
  663. containLabel: true
  664. },
  665. color: [ '#FF4949', '#FFA74D', '#FFEA51', '#4BF0FF', '#44AFF0', '#4E82FF', '#584BFF', '#BE4DFF', '#F845F1'],
  666. xAxis: {
  667. type: 'category',
  668. boundaryGap: false,
  669. data: [ '2012年', '2013年', '2014年', '2015年', '2016年'],
  670. splitLine: {
  671. show: false
  672. },
  673. axisLine: {
  674. lineStyle: {
  675. color: '#fff'
  676. }
  677. }
  678. },
  679. yAxis: {
  680. name: '亿吨公里',
  681. type: 'value',
  682. splitLine: {
  683. show: false
  684. },
  685. axisLine: {
  686. lineStyle: {
  687. color: '#fff'
  688. }
  689. }
  690. },
  691. series: data
  692. };
  693. // 使用刚指定的配置项和数据显示图表。
  694. myChart.setOption(option);
  695. window.addEventListener( "resize", function () {
  696. myChart.resize();
  697. });
  698. }
  699. //湖南高速公路
  700. function echart_4() {
  701. // 基于准备好的dom,初始化echarts实例
  702. var myChart = echarts.init( document.getElementById( 'echart_4'));
  703. myChart.setOption({
  704. tooltip : {
  705. trigger: 'item'
  706. },
  707. series: [{
  708. type: 'map',
  709. mapType: 'hunan'
  710. }]
  711. });
  712. var geoCoordMap = {
  713. '怀化': [ 109.999867, 27.518949],
  714. '吉首': [ 109.741528, 28.332629],
  715. '张家界': [ 110.491722, 29.112001],
  716. '常德': [ 111.701486, 29.076683],
  717. '益阳': [ 112.348741, 28.544124],
  718. '岳阳': [ 113.126486, 29.382401],
  719. '长沙': [ 113.019455, 28.200103],
  720. '株洲': [ 113.163141, 27.8418],
  721. '湘潭': [ 112.91977, 27.882141],
  722. '邵阳': [ 111.467859, 27.21915],
  723. '娄底': [ 112.012438, 27.745506],
  724. '衡阳': [ 112.63809, 26.895225],
  725. '永州': [ 111.577632, 26.460144],
  726. '郴州': [ 113.039396, 25.81497]
  727. };
  728. var goData = [
  729. [{
  730. name: '张家界'
  731. }, {
  732. id: 1,
  733. name: '常德',
  734. value: 86
  735. }],
  736. [{
  737. name: '吉首'
  738. }, {
  739. id: 1,
  740. name: '常德',
  741. value: 86
  742. }],
  743. [{
  744. name: '常德'
  745. }, {
  746. id: 1,
  747. name: '益阳',
  748. value: 70
  749. }],
  750. [{
  751. name: '益阳'
  752. }, {
  753. id: 1,
  754. name: '长沙',
  755. value: 95
  756. }],
  757. [{
  758. name: '长沙'
  759. }, {
  760. id: 1,
  761. name: '岳阳',
  762. value: 70
  763. }],
  764. [{
  765. name: '长沙'
  766. }, {
  767. id: 1,
  768. name: '湘潭',
  769. value: 80
  770. }],
  771. [{
  772. name: '长沙'
  773. }, {
  774. id: 1,
  775. name: '株洲',
  776. value: 80
  777. }],
  778. [{
  779. name: '长沙'
  780. }, {
  781. id: 1,
  782. name: '衡阳',
  783. value: 80
  784. }],
  785. [{
  786. name: '衡阳'
  787. }, {
  788. id: 1,
  789. name: '郴州',
  790. value: 70
  791. }],
  792. [{
  793. name: '衡阳'
  794. }, {
  795. id: 1,
  796. name: '永州',
  797. value: 70
  798. }],
  799. [{
  800. name: '湘潭'
  801. }, {
  802. id: 1,
  803. name: '娄底',
  804. value: 60
  805. }],
  806. [{
  807. name: '娄底'
  808. }, {
  809. id: 1,
  810. name: '邵阳',
  811. value: 75
  812. }],
  813. [{
  814. name: '邵阳'
  815. }, {
  816. id: 1,
  817. name: '怀化',
  818. value: 75
  819. }],
  820. ];
  821. //值控制圆点大小
  822. var backData = [
  823. [{
  824. name: '常德'
  825. }, {
  826. id: 1,
  827. name: '张家界',
  828. value: 80
  829. }],
  830. [{
  831. name: '常德'
  832. }, {
  833. id: 1,
  834. name: '吉首',
  835. value: 66
  836. }],
  837. [{
  838. name: '益阳'
  839. }, {
  840. id: 1,
  841. name: '常德',
  842. value: 86
  843. }],
  844. [{
  845. name: '长沙'
  846. }, {
  847. id: 1,
  848. name: '益阳',
  849. value: 70
  850. }],
  851. [{
  852. name: '岳阳'
  853. }, {
  854. id: 1,
  855. name: '长沙',
  856. value: 95
  857. }],
  858. [{
  859. name: '湘潭'
  860. }, {
  861. id: 1,
  862. name: '长沙',
  863. value: 95
  864. }],
  865. [{
  866. name: '株洲'
  867. }, {
  868. id: 1,
  869. name: '长沙',
  870. value: 95
  871. }],
  872. [{
  873. name: '衡阳'
  874. }, {
  875. id: 1,
  876. name: '长沙',
  877. value: 95
  878. }],
  879. [{
  880. name: '郴州'
  881. }, {
  882. id: 1,
  883. name: '衡阳',
  884. value: 80
  885. }],
  886. [{
  887. name: '永州'
  888. }, {
  889. id: 1,
  890. name: '衡阳',
  891. value: 80
  892. }],
  893. [{
  894. name: '娄底'
  895. }, {
  896. id: 1,
  897. name: '湘潭',
  898. value: 80
  899. }],
  900. [{
  901. name: '邵阳'
  902. }, {
  903. id: 1,
  904. name: '娄底',
  905. value: 60
  906. }],
  907. [{
  908. name: '怀化'
  909. }, {
  910. id: 1,
  911. name: '邵阳',
  912. value: 75
  913. }],
  914. ];
  915. var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z';
  916. var arcAngle = function (data) {
  917. var j, k;
  918. for ( var i = 0; i < data.length; i++) {
  919. var dataItem = data[i];
  920. if (dataItem[ 1].id == 1) {
  921. j = 0.2;
  922. return j;
  923. } else if (dataItem[ 1].id == 2) {
  924. k = -0.2;
  925. return k;
  926. }
  927. }
  928. }
  929. var convertData = function (data) {
  930. var res = [];
  931. for ( var i = 0; i < data.length; i++) {
  932. var dataItem = data[i];
  933. var fromCoord = geoCoordMap[dataItem[ 0].name];
  934. var toCoord = geoCoordMap[dataItem[ 1].name];
  935. if (dataItem[ 1].id == 1) {
  936. if (fromCoord && toCoord) {
  937. res.push([{
  938. coord: fromCoord,
  939. }, {
  940. coord: toCoord,
  941. value: dataItem[ 1].value //线条颜色
  942. }]);
  943. }
  944. } else if (dataItem[ 1].id == 2) {
  945. if (fromCoord && toCoord) {
  946. res.push([{
  947. coord: fromCoord,
  948. }, {
  949. coord: toCoord
  950. }]);
  951. }
  952. }
  953. }
  954. return res;
  955. };
  956. var color = [ '#fff', '#FF1493', '#0000FF'];
  957. var series = [];
  958. [
  959. [ '1', goData],
  960. [ '2', backData]
  961. ].forEach( function (item, i) {
  962. series.push({
  963. name: item[ 0],
  964. type: 'lines',
  965. zlevel: 2,
  966. symbol: [ 'arrow', 'arrow'],
  967. //线特效配置
  968. effect: {
  969. show: true,
  970. period: 6,
  971. trailLength: 0.1,
  972. symbol: 'arrow', //标记类型
  973. symbolSize: 5
  974. },
  975. lineStyle: {
  976. normal: {
  977. width: 1,
  978. opacity: 0.4,
  979. curveness: arcAngle(item[ 1]), //弧线角度
  980. color: '#fff'
  981. }
  982. },
  983. edgeLabel: {
  984. normal: {
  985. show: true,
  986. textStyle: {
  987. fontSize: 14
  988. },
  989. formatter: function (params) {
  990. var txt = '';
  991. if (params.data.speed !== undefined) {
  992. txt = params.data.speed;
  993. }
  994. return txt;
  995. },
  996. }
  997. },
  998. data: convertData(item[ 1])
  999. }, {
  1000. name: item[ 0],
  1001. type: 'effectScatter',
  1002. coordinateSystem: 'geo',
  1003. zlevel: 2,
  1004. //波纹效果
  1005. rippleEffect: {
  1006. period: 2,
  1007. brushType: 'stroke',
  1008. scale: 3
  1009. },
  1010. label: {
  1011. normal: {
  1012. show: true,
  1013. color: '#fff',
  1014. position: 'right',
  1015. formatter: '{b}'
  1016. }
  1017. },
  1018. //终点形象
  1019. symbol: 'circle',
  1020. //圆点大小
  1021. symbolSize: function (val) {
  1022. return val[ 2] / 8;
  1023. },
  1024. itemStyle: {
  1025. normal: {
  1026. show: true
  1027. }
  1028. },
  1029. data: item[ 1].map( function (dataItem) {
  1030. return {
  1031. name: dataItem[ 1].name,
  1032. value: geoCoordMap[dataItem[ 1].name].concat([dataItem[ 1].value])
  1033. };
  1034. })
  1035. });
  1036. });
  1037. option = {
  1038. title: {
  1039. text: '',
  1040. subtext: '',
  1041. left: 'center',
  1042. textStyle: {
  1043. color: '#fff'
  1044. }
  1045. },
  1046. tooltip: {
  1047. trigger: 'item',
  1048. formatter: '{b}'
  1049. },
  1050. //线颜色及飞行轨道颜色
  1051. visualMap: {
  1052. left: 'left',
  1053. top: 'bottom',
  1054. text: [ '高', '低'], // 文本,默认为数值文本
  1055. textStyle:{
  1056. color: '#ffffff',
  1057. },
  1058. // realtime: true,
  1059. calculable: true,
  1060. color: [ 'green', 'red', 'blue']
  1061. },
  1062. //地图相关设置
  1063. geo: {
  1064. map: 'hunan',
  1065. //视角缩放比例
  1066. zoom: 1,
  1067. //显示文本样式
  1068. label: {
  1069. normal: {
  1070. show: false, //没有数据的地方不显示文本
  1071. textStyle: {
  1072. color: '#fff'
  1073. }
  1074. },
  1075. emphasis: {
  1076. textStyle: {
  1077. color: '#fff'
  1078. }
  1079. }
  1080. },
  1081. //鼠标缩放和平移
  1082. roam: true,
  1083. itemStyle: {
  1084. normal: {
  1085. // color: '#ddd',
  1086. borderColor: 'rgba(147, 235, 248, 1)',
  1087. borderWidth: 1,
  1088. areaColor: {
  1089. type: 'radial',
  1090. x: 0.5,
  1091. y: 0.5,
  1092. r: 0.8,
  1093. colorStops: [{
  1094. offset: 0,
  1095. color: 'rgba(175,238,238, 0)' // 0% 处的颜色
  1096. }, {
  1097. offset: 1,
  1098. color: 'rgba( 47,79,79, .2)' // 100% 处的颜色
  1099. }],
  1100. globalCoord: false // 缺省为 false
  1101. },
  1102. shadowColor: 'rgba(128, 217, 248, 1)',
  1103. // shadowColor: 'rgba(255, 255, 255, 1)',
  1104. shadowOffsetX: -2,
  1105. shadowOffsetY: 2,
  1106. shadowBlur: 10
  1107. },
  1108. emphasis: {
  1109. areaColor: '#389BB7',
  1110. borderWidth: 0
  1111. }
  1112. }
  1113. },
  1114. series: series
  1115. //series: []
  1116. };
  1117. // 使用刚指定的配置项和数据显示图表。
  1118. myChart.setOption(option);
  1119. window.addEventListener( "resize", function () {
  1120. myChart.resize();
  1121. });
  1122. }
  1123. //湖南省飞机场
  1124. function echart_5() {
  1125. // 基于准备好的dom,初始化echarts实例
  1126. var myChart = echarts.init( document.getElementById( 'echart_5'));
  1127. function showProvince() {
  1128. var geoCoordMap = {
  1129. '长沙黄花国际机场': [ 113.226512, 28.192929],
  1130. '张家界荷花机场': [ 110.454598, 29.107223],
  1131. '常德桃花源机场': [ 111.651508, 28.921516],
  1132. '永州零陵机场': [ 111.622869, 26.340994],
  1133. '怀化芷江机场': [ 109.714784, 27.44615],
  1134. };
  1135. var data = [{
  1136. name: '长沙黄花国际机场',
  1137. value: 100
  1138. },
  1139. {
  1140. name: '张家界荷花机场',
  1141. value: 100
  1142. },
  1143. {
  1144. name: '常德桃花源机场',
  1145. value: 100
  1146. },
  1147. {
  1148. name: '永州零陵机场',
  1149. value: 100
  1150. },
  1151. {
  1152. name: '怀化芷江机场',
  1153. value: 100
  1154. }
  1155. ];
  1156. var max = 480,
  1157. min = 9; // todo
  1158. var maxSize4Pin = 100,
  1159. minSize4Pin = 20;
  1160. var convertData = function (data) {
  1161. var res = [];
  1162. for ( var i = 0; i < data.length; i++) {
  1163. var geoCoord = geoCoordMap[data[i].name];
  1164. if (geoCoord) {
  1165. res.push({
  1166. name: data[i].name,
  1167. value: geoCoord.concat(data[i].value)
  1168. });
  1169. }
  1170. }
  1171. return res;
  1172. };
  1173. console.log( JSON.stringify(convertData(data)))
  1174. myChart.setOption(option = {
  1175. title: {
  1176. top: 20,
  1177. text: '',
  1178. subtext: '',
  1179. x: 'center',
  1180. textStyle: {
  1181. color: '#ccc'
  1182. }
  1183. },
  1184. legend: {
  1185. orient: 'vertical',
  1186. y: 'bottom',
  1187. x: 'right',
  1188. data: [ 'pm2.5'],
  1189. textStyle: {
  1190. color: '#fff'
  1191. }
  1192. },
  1193. visualMap: {
  1194. show: false,
  1195. min: 0,
  1196. max: 500,
  1197. left: 'left',
  1198. top: 'bottom',
  1199. text: [ '高', '低'], // 文本,默认为数值文本
  1200. calculable: true,
  1201. seriesIndex: [ 1],
  1202. inRange: {}
  1203. },
  1204. geo: {
  1205. show: true,
  1206. map: 'hunan',
  1207. mapType: 'hunan',
  1208. label: {
  1209. normal: {},
  1210. //鼠标移入后查看效果
  1211. emphasis: {
  1212. textStyle: {
  1213. color: '#fff'
  1214. }
  1215. }
  1216. },
  1217. //鼠标缩放和平移
  1218. roam: true,
  1219. itemStyle: {
  1220. normal: {
  1221. // color: '#ddd',
  1222. borderColor: 'rgba(147, 235, 248, 1)',
  1223. borderWidth: 1,
  1224. areaColor: {
  1225. type: 'radial',
  1226. x: 0.5,
  1227. y: 0.5,
  1228. r: 0.8,
  1229. colorStops: [{
  1230. offset: 0,
  1231. color: 'rgba(175,238,238, 0)' // 0% 处的颜色
  1232. }, {
  1233. offset: 1,
  1234. color: 'rgba( 47,79,79, .2)' // 100% 处的颜色
  1235. }],
  1236. globalCoord: false // 缺省为 false
  1237. },
  1238. shadowColor: 'rgba(128, 217, 248, 1)',
  1239. shadowOffsetX: -2,
  1240. shadowOffsetY: 2,
  1241. shadowBlur: 10
  1242. },
  1243. emphasis: {
  1244. areaColor: '#389BB7',
  1245. borderWidth: 0
  1246. }
  1247. }
  1248. },
  1249. series: [{
  1250. name: 'light',
  1251. type: 'map',
  1252. coordinateSystem: 'geo',
  1253. data: convertData(data),
  1254. itemStyle: {
  1255. normal: {
  1256. color: '#F4E925'
  1257. }
  1258. }
  1259. },
  1260. {
  1261. name: '点',
  1262. type: 'scatter',
  1263. coordinateSystem: 'geo',
  1264. symbol: 'pin',
  1265. symbolSize: function (val) {
  1266. var a = (maxSize4Pin - minSize4Pin) / (max - min);
  1267. var b = minSize4Pin - a * min;
  1268. b = maxSize4Pin - a * max;
  1269. return a * val[ 2] + b;
  1270. },
  1271. label: {
  1272. normal: {
  1273. // show: true,
  1274. // textStyle: {
  1275. // color: '#fff',
  1276. // fontSize: 9,
  1277. // }
  1278. }
  1279. },
  1280. itemStyle: {
  1281. normal: {
  1282. color: '#F62157', //标志颜色
  1283. }
  1284. },
  1285. zlevel: 6,
  1286. data: convertData(data),
  1287. },
  1288. {
  1289. name: 'light',
  1290. type: 'map',
  1291. mapType: 'hunan',
  1292. geoIndex: 0,
  1293. aspectScale: 0.75, //长宽比
  1294. showLegendSymbol: false, // 存在legend时显示
  1295. label: {
  1296. normal: {
  1297. show: false
  1298. },
  1299. emphasis: {
  1300. show: false,
  1301. textStyle: {
  1302. color: '#fff'
  1303. }
  1304. }
  1305. },
  1306. roam: true,
  1307. itemStyle: {
  1308. normal: {
  1309. areaColor: '#031525',
  1310. borderColor: '#FFFFFF',
  1311. },
  1312. emphasis: {
  1313. areaColor: '#2B91B7'
  1314. }
  1315. },
  1316. animation: false,
  1317. data: data
  1318. },
  1319. {
  1320. name: ' ',
  1321. type: 'effectScatter',
  1322. coordinateSystem: 'geo',
  1323. data: convertData(data.sort( function (a, b) {
  1324. return b.value - a.value;
  1325. }).slice( 0, 5)),
  1326. symbolSize: function (val) {
  1327. return val[ 2] / 10;
  1328. },
  1329. showEffectOn: 'render',
  1330. rippleEffect: {
  1331. brushType: 'stroke'
  1332. },
  1333. hoverAnimation: true,
  1334. label: {
  1335. normal: {
  1336. formatter: '{b}',
  1337. position: 'right',
  1338. show: true
  1339. }
  1340. },
  1341. itemStyle: {
  1342. normal: {
  1343. color: '#05C3F9',
  1344. shadowBlur: 10,
  1345. shadowColor: '#05C3F9'
  1346. }
  1347. },
  1348. zlevel: 1
  1349. },
  1350. ]
  1351. });
  1352. }
  1353. showProvince();
  1354. // 使用刚指定的配置项和数据显示图表。
  1355. // myChart.setOption(option);
  1356. window.addEventListener( "resize", function () {
  1357. myChart.resize();
  1358. });
  1359. }
  1360. //点击跳转
  1361. // $('#chart_map').click(function () {
  1362. // window.location.href = './page/index.html';
  1363. // });
  1364. // $('.t_btn2').click(function () {
  1365. // window.location.href = "./page/index.html?id=2";
  1366. // });
  1367. // $('.t_btn3').click(function () {
  1368. // window.location.href = "./page/index.html?id=3";
  1369. // });
  1370. // $('.t_btn4').click(function () {
  1371. // window.location.href = "./page/index.html?id=4";
  1372. // });
  1373. // $('.t_btn5').click(function () {
  1374. // window.location.href = "./page/index.html?id=5";
  1375. // });
  1376. // $('.t_btn6').click(function () {
  1377. // window.location.href = "./page/index.html?id=6";
  1378. // });
  1379. // $('.t_btn7').click(function () {
  1380. // window.location.href = "./page/index.html?id=7";
  1381. // });
  1382. // $('.t_btn8').click(function () {
  1383. // window.location.href = "./page/index.html?id=8";
  1384. // });
  1385. // $('.t_btn9').click(function () {
  1386. // window.location.href = "./page/index.html?id=9";
  1387. // });
  1388. });
  1389. function async_data_chart_1() {
  1390. // 异步加载数据
  1391. $.getJSON( 'json/chart_1.json').done( function (data) {
  1392. var myChart = echarts.init( document.getElementById( 'echart_1'));
  1393. ret = myChart.setOption({
  1394. series: [{
  1395. data: data
  1396. }]
  1397. });
  1398. }); //end $.getJSON
  1399. }
  1400. function async_data_chart_2() {
  1401. // 异步加载数据
  1402. $.getJSON( 'json/chart_2.json').done( function (data) {
  1403. var myChart = echarts.init( document.getElementById( 'echart_2'));
  1404. ret = myChart.setOption({
  1405. series: [{
  1406. data: data
  1407. }]
  1408. });
  1409. }); //end $.getJSON
  1410. }
  1411. function async_data_chart_map() {
  1412. // 异步加载数据
  1413. $.getJSON( 'json/chart_map_effectScatter.json').done( function (data_effectScatter) {
  1414. $.getJSON( 'json/chart_map_lines.json').done( function (data_lines) {
  1415. var myChart = echarts.init( document.getElementById( 'echart_map'));
  1416. ret = myChart.setOption({
  1417. series: [{
  1418. name: data_lines[ "name"],
  1419. data: data_lines[ "data"]
  1420. }, {
  1421. name: data_effectScatter[ "name"],
  1422. data: data_effectScatter[ "data"]
  1423. }]
  1424. });
  1425. }); //end $.getJSON
  1426. }); //end $.getJSON
  1427. }
  1428. function async_data_chart_3() {
  1429. // 异步加载数据
  1430. $.getJSON( 'json/chart_3.json').done( function (data) {
  1431. var myChart = echarts.init( document.getElementById( 'echart_3'));
  1432. myChart.setOption({
  1433. legend: data[ "legend"],
  1434. xAxis: data[ "xAxis"],
  1435. yAxis: data[ "yAxis"],
  1436. series: data[ "series"]
  1437. });
  1438. }); //end $.getJSON
  1439. }
  1440. function async_data_chart_4() {
  1441. // 异步加载数据
  1442. $.getJSON( 'json/chart_4.json').done( function (data) {
  1443. var myChart = echarts.init( document.getElementById( 'echart_4'));
  1444. myChart.setOption({
  1445. series: data
  1446. });
  1447. }); //end $.getJSON
  1448. }
  1449. function async_data_chart_5() {
  1450. // 异步加载数据
  1451. $.getJSON( 'json/chart_5.json').done( function (data) {
  1452. var myChart = echarts.init( document.getElementById( 'echart_5'));
  1453. myChart.setOption({
  1454. series: [{ data: data},
  1455. { data: data},
  1456. { data: data},
  1457. { data: data}]
  1458. });
  1459. }); //end $.getJSON
  1460. }
  1461. function genTr(tr_data) {
  1462. // tr_data = data["tr"]
  1463. var $theadHtml = $( "<thead></thead>");
  1464. var $trTmp = $( "<tr></tr>");
  1465. for( var i = 0; i < tr_data.length; i++ ) {
  1466. $trTmp.append( "<td>" + tr_data[i] + "</td>");
  1467. }
  1468. $trTmp.appendTo($theadHtml)
  1469. return $theadHtml
  1470. }
  1471. function genTd(td_data){
  1472. var $tbodyHtml = $( "<tbody></tbody>");
  1473. for( var i = 0; i < td_data.length; i++ ) {
  1474. //动态创建一个tr行标签,并且转换成jQuery对象
  1475. var $trTmp = $( "<tr></tr>");
  1476. var tdTmp = td_data[i]
  1477. //往行里面追加 td单元格
  1478. for( var k = 0; k < tdTmp.length; k++ ) {
  1479. $trTmp.append( "<td>"+ tdTmp[k] + "</td>");
  1480. }
  1481. // $tbodyHtml.append($trTmp)
  1482. $trTmp.appendTo($tbodyHtml)
  1483. console.log( "td_data %d", i)
  1484. }
  1485. return $tbodyHtml
  1486. }
  1487. function async_data_table_1() {
  1488. // 异步加载数据
  1489. $.getJSON( 'json/table_1.json').done( function (data) {
  1490. $( "#table_1").empty();
  1491. genTr(data[ "tr"]).appendTo( "#table_1");
  1492. genTd(data[ "td"]).appendTo( "#table_1");
  1493. }); //end $.getJSON
  1494. }
  1495. function async_data_table_2() {
  1496. // 异步加载数据
  1497. $.getJSON( 'json/table_2.json').done( function (data) {
  1498. $( "#table_2").empty();
  1499. genTr(data[ "tr"]).appendTo( "#table_2");
  1500. genTd(data[ "td"]).appendTo( "#table_2");
  1501. }); //end $.getJSON
  1502. }
  1503. function async_data_table_3() {
  1504. // 异步加载数据
  1505. $.getJSON( 'json/table_3.json').done( function (data) {
  1506. $( "#table_3").empty();
  1507. genTr(data[ "tr"]).appendTo( "#table_3");
  1508. genTd(data[ "td"]).appendTo( "#table_3");
  1509. }); //end $.getJSON
  1510. }
  1511. function async_data() {
  1512. async_data_chart_1();
  1513. async_data_chart_2();
  1514. async_data_chart_map();
  1515. async_data_chart_3();
  1516. async_data_chart_4();
  1517. async_data_chart_5();
  1518. async_data_table_1();
  1519. async_data_table_2();
  1520. async_data_table_3();
  1521. }
  1522. // async_data();

3、后端python代码


  
  1. import _thread
  2. import sys
  3. from PyQt5.QtWidgets import *
  4. from PyQt5.QtCore import *
  5. from PyQt5.QtWebEngineWidgets import QWebEngineView
  6. from pyecharts import Geo
  7. from PyQt5.QtCore import QUrl
  8. from win32api import GetSystemMetrics
  9. from PyQt5 import QtGui
  10. from httpserver import *
  11. from asyncJson import *
  12. class MainWindow(QMainWindow):
  13. def __init__(self, *args, **kwargs):
  14. super().__init_ _(*args, **kwargs)
  15. self.loadfinished = False
  16. self.setWindowTitle( '大屏展示')
  17. self.showMaximized()
  18. #全屏显示
  19. self.showFullScreen()
  20. self.isFullScreen = True
  21. self.webview = WebEngineView()
  22. self.webview.load(QUrl(index_url))
  23. self.setCentralWidget( self.webview)
  24. QShortcut(QtGui.QKeySequence( "Escape"), self, self.Esc)
  25. self.webview.loadFinished.connect( self.SetLoadFinished)
  26. _thread.start_new_thread(HttpServer, ())
  27. _thread.start_new_thread( self.ChangeData, ())
  28. def SetLoadFinished(self):
  29. self.loadfinished = True
  30. #模拟刷新数据
  31. def ChangeData(self):
  32. while 1:
  33. #页面加载完毕再开始刷新数据
  34. if self.loadfinished == False :
  35. # print("self.loadfinished == False")
  36. continue
  37. # print("self.loadfinished == True")
  38. # change_all_json()
  39. change_chart_1()
  40. self.webview.page().runJavaScript( "async_data_chart_1()")
  41. change_chart_2()
  42. self.webview.page().runJavaScript( "async_data_chart_2()")
  43. change_chart_map()
  44. self.webview.page().runJavaScript( "async_data_chart_map()")
  45. time.sleep( 1)
  46. change_chart_3()
  47. self.webview.page().runJavaScript( "async_data_chart_3()")
  48. change_chart_4()
  49. self.webview.page().runJavaScript( "async_data_chart_4()")
  50. time.sleep( 1)
  51. change_chart_5()
  52. self.webview.page().runJavaScript( "async_data_chart_5()")
  53. change_table(table_1_FILENAME)
  54. self.webview.page().runJavaScript( "async_data_table_1()")
  55. change_table(table_2_FILENAME)
  56. self.webview.page().runJavaScript( "async_data_table_2()")
  57. change_table(table_3_FILENAME)
  58. self.webview.page().runJavaScript( "async_data_table_3()")
  59. time.sleep( 1)
  60. #按ESC全屏或缩小
  61. def Esc(self):
  62. if self.isFullScreen == True :
  63. self.isFullScreen = False
  64. #不加这句的话,标题栏就看不到了
  65. self.showNormal()
  66. #设置固定宽高
  67. self.setGeometry(GetSystemMetrics( 0)/ 2, GetSystemMetrics( 1)/ 2, 1280, 768)
  68. #再移动到屏幕中央
  69. screen = QDesktopWidget().screenGeometry()
  70. size = self.geometry()
  71. self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
  72. else:
  73. self.showFullScreen()
  74. self.isFullScreen = True
  75. class WebEngineView(QWebEngineView):
  76. windowList = []
  77. # 重写createwindow()
  78. def createWindow(self, QWebEnginePage_WebWindowType):
  79. new_webview = WebEngineView()
  80. new_window = MainWindow()
  81. new_window.setCentralWidget(new_webview)
  82. #new_window.show()
  83. self.windowList.append(new_window) #注:没有这句会崩溃!!!
  84. return new_webview
  85. if __name_ _ == "__main__":
  86. app = QApplication(sys.argv)
  87. w = MainWindow()
  88. w.show()
  89. sys.exit(app.exec _())

四、上线运行

------------------------------------------------------------------------------------------------------------------------------------------------------

提供服务:

部署方式:

  1. B/S版: 可以流畅的运行在 PC (Windows系统,Linux及各衍生系统)和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等);
  2. C/S版: 整个项目仅一个可执行文件,超简单的方式,没有之一。

异构数据源整合,实时数据接入:

  1. 兼容多种数据源:
    各种经典关系型数据库(Oracle, SQL Server, MySQL, DB2 等) ;
    各种 NoSQL 数据库(MongoDB 等);
    各种数据文件(CSV, EXCEL)等。
  2. 同时还提供多种数据对接模式,包括动静态JSON和API接口:
    静态JSON通常应用于对外展会宣传等无需定时更新的场景;
    API模式主要应用于实时监控等需要数据定时更新的场景,帮助工作人员实时掌握数据动态。

本次分享结束,欢迎讨论!QQ和微信号相同 6550523

引用:基于互联网大牛的前端改进一下,做了个可执行程序,获取数据后更新到页面上。

 

 

 


转载:https://blog.csdn.net/lildkdkdkjf/article/details/106783264
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场