Python基础之数字化大屏

在公司内部或前台,有时需要展示数字化看板,展示公司的业务信息。看着别的公司展示的炫酷的数字化大屏,是否很羡慕?本文以Python+flask+jQuery+eCharts,简述如何开发数字化大屏进行数据展示,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

  • Python+flask开发web系统,实现数据传输。
  • jQuery通过ajax技术,实现数据的异步通信,局部刷新。
  • eCharts进行图表的展示(包括柱状图,折线图,地图等)。
  • html+css页面布局等技术。

示例效果图

在本例中,主要展示某公司的产品累计趋势,产品新增趋势,销售柱状图,地图等内容,包括数字,图表等方式,具体如下所示:

 

页面设计

为了数据展示,将数字化大屏页面分为8个部分(标题,时间,左1,左2,中1,中2,右1,右2)如下所示:

 

页面布局核心代码,如下所示:

 1 <!DOCTYPE html>
 2 <html lang="en" 3 head 4     meta charset="UTF-8" 5     title>数字化大屏</ 6     link rel="stylesheet" href="../static/css/main.css" 7  8 body 9 header class="head"10     div ="title"11         h1>某某公司数字化大屏12     div13     ="time"></14 header15 aside ="left"16     id="left1" class="left1">这里是左侧边栏117     ="left2"="left2">这里是左侧边栏218 aside19 section ="center"20     ="center1"21         ="num">112322         >23423         >134524         >45625         ="txt">累计生产26         >剩余生产27         >累计销售28         >累计返厂29     30     ="center2" id="center2"31 section32 ="right"33     ="right1"="right1">这里是右侧边栏134     ="right2"="right2">这里是右侧边栏235 36 37 html>

核心代码

后台数据

在本例中,flask做为web开发框架,提供了一个轻量级的实现web服务的功能。另本为了演示,实现了部分功能,其他则为静态数据,如下所示:

from flask import Flask
 request
 render_template
 4  jsonify
 5  random
 6 
 7 app = Flask(__name__)
 8 
 9 
10 @app.route('/main'11 def main():
return render_template(main.html13 
14 
15 @app.route(/get_c1_data',methods=[getpost])
16  get_c1_data():
17     """获取C1数据"""
18     total_confirmed = random.randint(0,10000)  # 累计生产
19     remain_suspect = random.randint(0,5000)   剩余生产
20     total_cure = random.randint(0,1)"> 累计销售
21     total_dead = random.randint(0,200)   累计返厂
22     return jsonify({"total_confirmed": total_confirmed,1)">remain_suspect": remain_suspect,1)">total_cure": total_cure,23                     total_dead: total_dead})
24 
25 
26 if __name__ == __main__:
27     app.run()

注意:jQuery进行ajax数据访问,返回的json格式的数据,所以引入flask中的jsonify模块,进行数据转换。

ajax访问

在本例中,为了实现局部刷新,采用ajax的方式进行访问,如下所示:

 1     <script type="text/javascript">
 2         function get_time() {
 3             var cur_time = new Date();
 4             var str_time = cur_time.getFullYear() + "年" + ((cur_time.getMonth() + 1) > 9 ? (cur_time.getMonth() + 1) : "0" + (cur_time.getMonth() + 1)) + "月" + (cur_time.getDate() > 9 ? cur_time.getDate() : "0" + cur_time.getDate()) + "日" + " " + (cur_time.getHours() > 9 ? cur_time.getHours() : "0" + cur_time.getHours()) + ":" + (cur_time.getMinutes() > 9 ? cur_time.getMinutes() : "0" + cur_time.getMinutes()) + ":" + (cur_time.getSeconds() > 9 ? cur_time.getSeconds() : "0" + cur_time.getSeconds());
 5             $(".time").text(str_time);
 6         }
 7 
 8          get_c1_data() {
            $.ajax({
10                 url: "/get_c1_data",1)">11                 type: "post"12                 success:  (data) {
13                     $(".num").eq(0).text(data.total_confirmed);
14                     $(".num").eq(1).text(data.remain_suspect);
15                     $(".num").eq(2).text(data.total_cure);
16                     $(".num").eq(3).text(data.total_dead);
17 
                },1)">19                 error:  () {
20 
21                 }
22             });
23 25         $(document).ready(            get_time();
27             get_c1_data();
28             setInterval(get_time,1000);
29             setInterval(get_c1_data,1)">30         });
31     </script>

图表展示

在本例中,展示了多种图表,且各自独立,为了方便起见,将各个模块的图表,单独保存在js文件中。

折线图(累计趋势图)

var left1 = document.getElementById('left1'var ec_left1 = echarts.init(left1,'dark'var ec_left1_option;
 4 
 5 ec_left1_option = {
  title: {
 7     text: '某某产品累计趋势' 8     left:'left'
  },1)">10   tooltip: {
11     trigger: 'axis'
12 13   legend: {
14     data: ['累计生产','剩余生产','累计销售','累计返厂'],1)">15     left:'right'
17   grid: {
18     left: '3%'19     right: '4%'20     bottom: '3%'21     containLabel: true
23   // toolbox: {
24      feature: {
25        saveAsImage: {}
26      }
27    },
28   xAxis: {
29     type: 'category'30     boundaryGap: false31     data: ['09-24','09-25','09-26','09-27','09-28','09-29','09-30']
33   yAxis: {
34     type: 'value'
  series: [
    {
38       name: '累计生产'39       type: 'line'40       stack: 'Total',1)">41       data: [120,132,101,134,90,230,21042     },1)">43 44       name: '剩余生产'45       type: 'line'46       47       data: [220,182,191,234,290,330,31048 49 50       name: '累计销售'51       type: 'line'52       53       data: [150,232,201,154,190,41054 55 56       name: '累计返厂'57       type: 'line'58       59       data: [320,332,301,334,390,32060     }
61   ]
62 };
63 
64 ec_left1_option && ec_left1.setOption(ec_left1_option);

折线(新增趋势图)

var left2 = document.getElementById('left2'var ec_left2 = echarts.init(left2,1)"> ec_left2_option;
 5 ec_left2_option = 7     text: '某某公司产品新增趋势'14     data: ['每日数量','每日累计'38       name: '每日数量'44       name: '每日累计'47       data: [320,1)">50 51 
52 ec_left2_option && ec_left2.setOption(ec_left2_option);

柱状图

var right1 = document.getElementById('right1'var ec_right1 = echarts.init(right1,1)"> ec_right1_option;
 5 ec_right1_option =    title: {
 7     text: '非重点城市销售Top5' 8     left:'center'
11     type: 'category'12     data: ['广东','河南','江苏','湖南','河北','沈阳','吉林'15     type: 'value'
19       data: [120,200,150,80,70,110,13020       type: 'bar'
25 ec_right1_option && ec_right1.setOption(ec_right1_option);

圆盘转速图

  1 var right2 = document.getElementById('right2'  2 var ec_right2 = echarts.init(right2,1)">  3  ec_right2_option;
  4 
  5 ec_right2_option =  6   backgroundColor: '#333'  7    tooltip: {
  8      formatter: '{a} <br/>{b} : {c}%'
  9    10    11    12        restore: {},1)"> 13    14    15    16  17      left
 18  19       name: 'gauge 0' 20       type: 'gauge' 21       min: -200 22       max: 250 23       startAngle: -30 24       endAngle: -315 25       splitNumber: 9 26       radius: '35%' 27       center: ['21%','55%' 28       axisLine: {
 29         lineStyle: {
 30           color: [[1,'#AE96A6']]
 31  32       },1)"> 33       splitLine: {
 34         show: false
 35  36       axisTick: {
 37         show:  38  39       axisLabel: {
 40         show:  41  42       anchor: {},1)"> 43       pointer: {
 44         show:  45  46       detail: {
 47         show:  48  49       title: {
 50         fontSize: 8 51         fontWeight: 800 52         fontFamily: 'Arial' 53         color: '#fff' 54         offsetCenter: [0,'-60%' 55  56       progress: {
 57         show: true 58         width: 3 59         itemStyle: {
 60           color: '#fff'
 61  62  63       data: [
 64         {
 65           value: 250 66           name: 'km/h'
 67  68       ]
 69  70  71       name: 'gauge 1' 72       type: 'gauge' 73       min: 0 74       max: 250 75       startAngle: -140 76       endAngle: -305 77       splitNumber: 5 78       radius: '35%' 79       center: ['21%',1)"> 80  81  82           color: [[1,1)"> 83  84  85  86         distance: -7 87         length: 12 88  89           color: '#fff' 90           width: 4
 91  92  93  94         distance: -8 95         length: 8 96  97           color: '#fff' 98           width: 2
 99 100 101 102         distance: 14103         fontSize: 10104         fontWeight: 800105         fontFamily: 'Arial'106         color: '#fff'
107 108 109 110         icon: 'path://M-36.5,23.9L-41,4.4c-0.1-0.4-0.4-0.7-0.7-0.7c-0.5-0.1-1.1,0.2-1.2,0.7l-4.5,19.5c0,0.1,0.2v92.3c0,0.6,0.4,1,1h9c0.6,1-0.4,1-1V24.1C-36.5,24-36.5,23.9-36.5,23.9z M-39.5,114.6h-5v-85h5V114.6z'111         width: 5112         length: '40%'113         offsetCenter: [0,'-58%'114 115           color: '#f00'116           shadowColor: 'rgba(255,0)'117           shadowBlur: 5118           shadowOffsetY: 2
119 120 121 122         color: '#fff'123         fontSize: 14124         fontWeight: 800125         fontFamily: 'Arial'126         offsetCenter: [0,0127 128 129         show: 130 131 132 133           value: 0134           name: '当前位置:\n \n 中科路'
135 136 137 138      middle
139 140       name: 'gauge 2'141       type: 'gauge'142       min: 0143       max: 8144       z: 10145       startAngle: 210146       endAngle: -30147       splitNumber: 8148       radius: '50%'149       center: ['50%','50%'150 151         show: 152 153           width: 0154           color: [
155             [0.825,'#fff'156             [1,'#f00'157           ]
158 159 160 161         distance: 20162         length: 15163 164           color: 'auto'165           width: 4166           shadowColor: 'rgba(255,0.5)'167           shadowBlur: 15168           shadowOffsetY: -10
169 170 171 172         distance: 20173         length: 8174 175           color: 'auto'176           width: 2177           shadowColor: 'rgba(255,255)'178           shadowBlur: 10179           shadowOffsetY: -10
180 181 182 183         distance: 10184         fontSize: 15185         fontWeight: 800186         fontFamily: 'Arial'187         color: '#fff'
188 189 190 191         icon: 'path://M-36.5,1)">192         width: 10193         offsetCenter: [0,'-10%'194         length: '75%'195 196           color: '#f00'197           shadowColor: 'rgba(255,1)">198           shadowBlur: 5199           shadowOffsetY: 3
200 201 202 203         color: '#fff'204         fontSize: 12205         fontWeight: 800206         fontFamily: 'Arial'207         offsetCenter: [0,'-30%'208 209 210 211           value: 0.6212           name: '1/min x 1000'
213 214       ],1)">215 216         show: 217       }
218 219 220       name: 'gauge 3'221       type: 'gauge'222       min: 0223       max: 8224       z: 10225       splitNumber: 8226       radius: '50%'227 228 229           width: 14230           color: [[1,'#000'231 232 233 234         show: 235 236 237         show: 238 239 240         show: 241 242 243 244         show: 245 246 247         show: 248 249 250         offsetCenter: ['25%',1)">251         formatter: '{a|{value}}{b|km/h}'252         rich: {
253           a: {
254             fontSize: 20255             fontWeight: 800256             fontFamily: 'Arial'257             color: '#fff'258             align: 'center'259             padding: [0,5,1)">260           },1)">261           b: {
262             fontSize: 14263             fontWeight: 800264             fontFamily: 'Arial'265             color: '#fff'266             padding: [0,20,1)">267           }
268 269 270        value is speed
271 272 273           value: 0274           name: ''
275 276 277 278     right
279 280       name: 'gauge 4'281       type: 'gauge'282       min: 0283       max: 8284       startAngle: 135285       endAngle: -150286       splitNumber: 8287       radius: '35%'288       center: ['79%',1)">289 290 291           color: [[1,1)">292 293 294 295         show: 296 297 298         show: 299 300 301         show: 302 303 304 305         show: 306 307       title: {},1)">308 309         offsetCenter: ['-15%',1)">310         formatter: [
311           '{a|                  00:00}'312           '{a|行驶时间       0:00}{b| h}'313           '{a|行驶距离        0.0}{b| km}'314           '{a|平均耗能        ---}{b| 1/100km}'315           '{a|平均速度        ---}{b| km/h}'
316         ].join('\n'),1)">317 318 319             fontSize: 10320             fontWeight: 800321             fontFamily: 'Arial'322             lineHeight: 22323             color: '#fff'324             align: 'left'
325 326 327             fontWeight: 600328             fontFamily: 'Arial'329             lineHeight: 22330             color: '#fff'331             align: 'left'
332 333 334 335 336         show: 337         width: 3338 339           color: '#fff'
340 341 342 343 344           value: 250345           name: ''
346 347 348 349 350       name: 'gauge 5'351       type: 'gauge'352       min: 0353       max: 1354       startAngle: 125355       endAngle: 55356       splitNumber: 2357       radius: '34%'358       center: ['79%','55.3%'359 360 361           width: 9362 363             [0.15,1)">364             [1,'rgba(255,1)">365 366 367 368 369         distance: -14370         length: 16371 372           color: '#fff'373           width: 4
374 375 376 377         distance: -14378         length: 10379 380           color: '#fff'381           width: 2
382 383 384 385         distance: 12386         fontSize: 10387         fontWeight: 800388         fontFamily: 'Arial'389         color: '#fff'390         formatter:  (value) {
391           if (value === 0.5) {
392             return '2/4';
393 394           if (value === 1395             return '4/4'396 397           return value + ''398 399 400 401         show: 402         width: 5403 404           color: '#fff'
405 406 407       anchor: {
408         show: 409         itemStyle: {},1)">410         offsetCenter: ['-22%','-57%'411         size: 18412         icon: 'path://M1.11979167,1.11111112 C1.11979167,0.497461393 1.61725306,0 2.23090279,0 L12.2309028,0 C12.8445525,1.43824153e-08 13.3420139,0.497461403 13.3420139,1.11111112 L13.3420139,10 L15.5642361,10 C16.7915356,10 17.7864583,10.9949228 17.7864583,12.2222222 L17.7864583,16.6666667 C17.7865523,17.28025 18.2839861,17.7776077 18.8975694,17.7776077 C19.5111527,17.7776077 20.0085866,17.28025 20.0086805,16.6666667 L20.0086805,8.88888888 L17.7864583,8.88888888 C17.1728086,8.88888888 16.6753472,8.3914275 16.6753472,7.77777779 L16.6753472,3.79333333 L15.6197917,2.73777777 C15.1859413,2.30392741 15.1859413,1.60051702 15.6197917,1.16666667 L15.6197917,1.16666667 C16.053642,0.732816318 16.7570524,0.732816318 17.1909028,1.16666667 L21.9053472,5.88111112 C22.1140468,6.08922811 22.2312072,6.37193273 22.2309028,6.66666667 L22.2309028,16.6666667 C22.2309028,18.5076158 20.7385186,20 18.8975695,20 C17.0566203,20 15.5642361,18.5076158 15.5642361,16.6666667 L15.5642361,12.2222222 L13.3420139,17.7777778 L13.3420139,17.7777778 C13.9556636,17.7777778 14.453125,18.2752392 14.453125,18.8888889 L14.453125,18.8888889 C14.453125,19.5025386 13.9556636,20 13.3420139,20 L1.11979165,20 C0.506141934,20 0.00868054688,19.5025386 0.00868054687,18.8888889 L0.00868054687,18.8888889 C0.00868054688,18.2752392 0.506141934,17.7777778 1.11979165,17.7777778 L1.11979167,1.11111112 Z M3.34201388,2.22222221 L3.34201388,8.88888888 L11.1197917,2.22222221 Z'
413 414 415         show: 416 417 418 419         offsetCenter: ['10%','-56%'420         formatter: '{a|831}{b| km}'421 422 423             fontSize: 15424             fontWeight: 800425             fontFamily: 'Arial'426             color: '#fff'
427 428 429             fontWeight: 600430             fontFamily: 'Arial'431             color: '#fff'
432 433 434 435 436 437           value: 0.85438           name: ''
439 440 441 442 443       name: 'gauge 6'444       type: 'gauge'445       min: -120446       max: -60447       startAngle: 230448       endAngle: 310449       clockwise: 450       splitNumber: 2451       radius: '35%'452       center: ['79%',1)">453 454 455 456             [1,1)">457             [1.1,1)">458 459 460 461 462         distance: -8463         length: 12464 465           color: '#fff'466           width: 4
467 468 469 470         splitNumber: 3471         length: 8472         distance: -8473 474           color: '#fff'475           width: 2
476 477 478 479         distance: 14480         fontSize: 10481         fontWeight: 800482         fontFamily: 'Arial'483         color: '#fff'484         formatter: 485           return -value + ''486 487 488 489         show: 490 491         offsetCenter: [0,1)">492         size: 20493         icon: 'path://M-34.1-1.1L-34.1-1.1c0-0.3-0.3-0.6-0.6-0.6h-3.6v-1.5c0-0.5-0.2-0.9-0.6-1.1s-0.9-0.2-1.3,0c-0.4,0.2-0.6,0.7-0.6,1.1V7.9c0,0.1c-0.8,0.5-1.2,1.5-0.9,2.5c0.3,0.9,1.1,1.6,2.1,1.6c1,1.8-0.6,2.1-1.5c0.3-0.9,0-1.9-0.8-2.5V6.3h3.5c0.4,0.7-0.3,0.7-0.7l0,0c0-0.4-0.3-0.7-0.7-0.7h-3.5V2.9h3.5c0.4,0c0-0.4-0.3-0.7-0.7-0.7h-3.5v-2.1h3.6C-34.4-0.5-34.1-0.8-34.1-1.1z M-44.9,11.6c-0.7,0-1.4-0.2-2-0.6c-0.4-0.3-0.9-0.4-1.4-0.4c-0.4,0-0.9,0.4c-0.4,0.2-1.4-0.9-0.9-1.3c0.6-0.4,1.3-0.6,2-0.7c0.8,1.5,0.2,2.2,0.5c0.4,0.3,1.3,0.4c0.6,1.1-0.2,1.5-0.6s1.6,0.7,1.3S-44,11.6-44.9,11.6L-44.9,11.6z M-34.3,0-1.4-0.3-2-0.7c-0.6-0.4,0.5-1.6,0.9-1.3s0.8,1.2,0.4c0.5,1-0.1,1.4-0.4c0.6-0.3,1.3-0.5,2-0.6h0c0.9,1.7,2.4,0.9c0.7,0.5-0.5,1.6-0.9,1.3c-0.4-0.3-1-0.6-1.5-0.6h0c-0.5,0.2-1.3,0.4c-0.6,0.3-1.3,0.5-2,0.6H-34.3z M-33.5,16.3c-0.7,0-1.4-0.3-1.9-0.8c-0.4-0.3-0.6-0.5-1-0.5c-0.4,0-0.7,0.2-1,0.5-1.3,0.7-2,0.7c-0.7,0-1.4-0.3-1.9-0.8c-0.2-0.3-0.6-0.4-0.9-0.4c-0.4,0.1-1.1,0.5c-0.6,0.7-2.1,0.7c-0.7-0.1-1.4-0.4-1.9-0.9c-0.4-0.3-0.6-0.5-1-0.5c-0.3,0-0.6,0.2-0.9,0.4s-1.6-0.7-1.1-1.2c0.5-0.5,1.2-0.8,1.9-0.9c1-0.1,0.8c0.3,0.5,0.6-0.1,1-0.4c0.6-0.5,1.4-0.8,2.1-0.8c0.7,1.4,1.9,0.8c0.2,0.4c0.4,1.3-0.7,2,0.9c0.4,0.4c0.3,0.7-0.2,1.1-0.5c0.5-0.4,1.2-0.9,2.3-0.8c0.7,0.7c0.5,0.4-0.7,1.5-1,1.3s-0.6-0.4-1-0.4c-0.4,0.5C-32,15.9-32.7,16.2-33.5,16.3L-33.5,16.3z'
494 495 496         icon: 'path://M2.9,0.7L2.9,0.7c1.4,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,2.9,0.7z'497         width: 15498         length: '4'499         offsetCenter: [0,'-90%'500 501           color: '#f00'
502 503 504 505 506         show: 507 508 509 510           value: -120511           name: ''
512 513 514 515 516 517 
518 ec_right2_option && ec_right2.setOption(ec_right2_option);
View Code

中国地图

 var echarts = require('echarts');
  2 const data = [
  3   { name: '海门',value: 9  4   { name: '鄂尔多斯',value: 12  5   { name: '招远',1)">  6   { name: '舟山',1)">  7   { name: '齐齐哈尔',value: 14  8   { name: '盐城',value: 15  9   { name: '赤峰',value: 16 10   { name: '青岛',value: 18 11   { name: '乳山',1)"> 12   { name: '金昌',value: 19 13   { name: '泉州',value: 21 14   { name: '莱西',1)"> 15   { name: '日照',1)"> 16   { name: '胶南',value: 22 17   { name: '南通',value: 23 18   { name: '拉萨',value: 24 19   { name: '云浮',1)"> 20   { name: '梅州',value: 25 21   { name: '文登',1)"> 22   { name: '上海',1)"> 23   { name: '攀枝花',1)"> 24   { name: '威海',1)"> 25   { name: '承德',1)"> 26   { name: '厦门',value: 26 27   { name: '汕尾',1)"> 28   { name: '潮州',1)"> 29   { name: '丹东',value: 27 30   { name: '太仓',1)"> 31   { name: '曲靖',1)"> 32   { name: '烟台',value: 28 33   { name: '福州',value: 29 34   { name: '瓦房店',value: 30 35   { name: '即墨',1)"> 36   { name: '抚顺',value: 31 37   { name: '玉溪',1)"> 38   { name: '张家口',1)"> 39   { name: '阳泉',1)"> 40   { name: '莱州',value: 32 41   { name: '湖州',1)"> 42   { name: '汕头',1)"> 43   { name: '昆山',value: 33 44   { name: '宁波',1)"> 45   { name: '湛江',1)"> 46   { name: '揭阳',value: 34 47   { name: '荣成',1)"> 48   { name: '连云港',value: 35 49   { name: '葫芦岛',1)"> 50   { name: '常熟',value: 36 51   { name: '东莞',1)"> 52   { name: '河源',1)"> 53   { name: '淮安',1)"> 54   { name: '泰州',1)"> 55   { name: '南宁',value: 37 56   { name: '营口',1)"> 57   { name: '惠州',1)"> 58   { name: '江阴',1)"> 59   { name: '蓬莱',1)"> 60   { name: '韶关',value: 38 61   { name: '嘉峪关',1)"> 62   { name: '广州',1)"> 63   { name: '延安',1)"> 64   { name: '太原',value: 39 65   { name: '清远',1)"> 66   { name: '中山',1)"> 67   { name: '昆明',1)"> 68   { name: '寿光',value: 40 69   { name: '盘锦',1)"> 70   { name: '长治',value: 41 71   { name: '深圳',1)"> 72   { name: '珠海',value: 42 73   { name: '宿迁',value: 43 74   { name: '咸阳',1)"> 75   { name: '铜川',value: 44 76   { name: '平度',1)"> 77   { name: '佛山',1)"> 78   { name: '海口',1)"> 79   { name: '江门',value: 45 80   { name: '章丘',1)"> 81   { name: '肇庆',value: 46 82   { name: '大连',value: 47 83   { name: '临汾',1)"> 84   { name: '吴江',1)"> 85   { name: '石嘴山',value: 49 86   { name: '沈阳',value: 50 87   { name: '苏州',1)"> 88   { name: '茂名',1)"> 89   { name: '嘉兴',value: 51 90   { name: '长春',1)"> 91   { name: '胶州',value: 52 92   { name: '银川',1)"> 93   { name: '张家港',1)"> 94   { name: '三门峡',value: 53 95   { name: '锦州',value: 54 96   { name: '南昌',1)"> 97   { name: '柳州',1)"> 98   { name: '三亚',1)"> 99   { name: '自贡',value: 56100   { name: '吉林',1)">101   { name: '阳江',value: 57102   { name: '泸州',1)">103   { name: '西宁',1)">104   { name: '宜宾',value: 58105   { name: '呼和浩特',1)">106   { name: '成都',1)">107   { name: '大同',1)">108   { name: '镇江',value: 59109   { name: '桂林',1)">110   { name: '张家界',1)">111   { name: '宜兴',1)">112   { name: '北海',value: 60113   { name: '西安',value: 61114   { name: '金坛',value: 62115   { name: '东营',1)">116   { name: '牡丹江',value: 63117   { name: '遵义',1)">118   { name: '绍兴',1)">119   { name: '扬州',value: 64120   { name: '常州',1)">121   { name: '潍坊',value: 65122   { name: '重庆',value: 66123   { name: '台州',value: 67124   { name: '南京',1)">125   { name: '滨州',value: 70126   { name: '贵阳',value: 71127   { name: '无锡',1)">128   { name: '本溪',1)">129   { name: '克拉玛依',value: 72130   { name: '渭南',1)">131   { name: '马鞍山',1)">132   { name: '宝鸡',1)">133   { name: '焦作',value: 75134   { name: '句容',1)">135   { name: '北京',value: 79136   { name: '徐州',1)">137   { name: '衡水',value: 80138   { name: '包头',1)">139   { name: '绵阳',1)">140   { name: '乌鲁木齐',value: 84141   { name: '枣庄',1)">142   { name: '杭州',1)">143   { name: '淄博',value: 85144   { name: '鞍山',value: 86145   { name: '溧阳',1)">146   { name: '库尔勒',1)">147   { name: '安阳',value: 90148   { name: '开封',1)">149   { name: '济南',value: 92150   { name: '德阳',value: 93151   { name: '温州',value: 95152   { name: '九江',value: 96153   { name: '邯郸',value: 98154   { name: '临安',value: 99155   { name: '兰州',1)">156   { name: '沧州',value: 100157   { name: '临沂',value: 103158   { name: '南充',value: 104159   { name: '天津',value: 105160   { name: '富阳',value: 106161   { name: '泰安',value: 112162   { name: '诸暨',1)">163   { name: '郑州',value: 113164   { name: '哈尔滨',value: 114165   { name: '聊城',value: 116166   { name: '芜湖',value: 117167   { name: '唐山',value: 119168   { name: '平顶山',1)">169   { name: '邢台',1)">170   { name: '德州',value: 120171   { name: '济宁',1)">172   { name: '荆州',value: 127173   { name: '宜昌',value: 130174   { name: '义乌',value: 132175   { name: '丽水',value: 133176   { name: '洛阳',value: 134177   { name: '秦皇岛',value: 136178   { name: '株洲',value: 143179   { name: '石家庄',value: 147180   { name: '莱芜',value: 148181   { name: '常德',value: 152182   { name: '保定',value: 153183   { name: '湘潭',value: 154184   { name: '金华',value: 157185   { name: '岳阳',value: 169186   { name: '长沙',value: 175187   { name: '衢州',value: 177188   { name: '廊坊',value: 193189   { name: '菏泽',value: 194190   { name: '合肥',value: 229191   { name: '武汉',value: 273192   { name: '大庆',value: 279 }
193 ];
194 const geoCoordMap =195   海门: [121.15,31.89196   鄂尔多斯: [109.781327,39.608266197   招远: [120.38,37.35198   舟山: [122.207216,29.985295199   齐齐哈尔: [123.97,47.33200   盐城: [120.13,33.38201   赤峰: [118.87,42.28202   青岛: [120.33,36.07203   乳山: [121.52,36.89204   金昌: [102.188043,38.520089205   泉州: [118.58,24.93206   莱西: [120.53,36.86207   日照: [119.46,35.42208   胶南: [119.97,35.88209   南通: [121.05,32.08210   拉萨: [91.11,29.97211   云浮: [112.02,22.93212   梅州: [116.1,24.55213   文登: [122.05,37.2214   上海: [121.48,31.22215   攀枝花: [101.718637,26.582347216   威海: [122.1,37.5217   承德: [117.93,40.97218   厦门: [118.1,24.46219   汕尾: [115.375279,22.786211220   潮州: [116.63,23.68221   丹东: [124.37,40.13222   太仓: [121.1,31.45223   曲靖: [103.79,25.51224   烟台: [121.39,37.52225   福州: [119.3,26.08226   瓦房店: [121.979603,39.627114227   即墨: [120.45,36.38228   抚顺: [123.97,41.97229   玉溪: [102.52,24.35230   张家口: [114.87,40.82231   阳泉: [113.57,37.85232   莱州: [119.942327,37.177017233   湖州: [120.1,30.86234   汕头: [116.69,23.39235   昆山: [120.95,31.39236   宁波: [121.56,29.86237   湛江: [110.359377,21.270708238   揭阳: [116.35,23.55239   荣成: [122.41,37.16240   连云港: [119.16,34.59241   葫芦岛: [120.836932,40.711052242   常熟: [120.74,31.64243   东莞: [113.75,23.04244   河源: [114.68,23.73245   淮安: [119.15,33.5246   泰州: [119.9,32.49247   南宁: [108.33,22.84248   营口: [122.18,40.65249   惠州: [114.4,23.09250   江阴: [120.26,31.91251   蓬莱: [120.75,37.8252   韶关: [113.62,24.84253   嘉峪关: [98.289152,39.77313254   广州: [113.23,23.16255   延安: [109.47,36.6256   太原: [112.53,37.87257   清远: [113.01,23.7258   中山: [113.38,22.52259   昆明: [102.73,25.04260   寿光: [118.73,1)">261   盘锦: [122.070714,41.119997262   长治: [113.08,36.18263   深圳: [114.07,22.62264   珠海: [113.52,22.3265   宿迁: [118.3,33.96266   咸阳: [108.72,34.36267   铜川: [109.11,35.09268   平度: [119.97,36.77269   佛山: [113.11,23.05270   海口: [110.35,20.02271   江门: [113.06,22.61272   章丘: [117.53,36.72273   肇庆: [112.44,1)">274   大连: [121.62,38.92275   临汾: [111.5,36.08276   吴江: [120.63,31.16277   石嘴山: [106.39,39.04278   沈阳: [123.38,41.8279   苏州: [120.62,31.32280   茂名: [110.88,21.68281   嘉兴: [120.76,30.77282   长春: [125.35,43.88283   胶州: [120.03336,36.264622284   银川: [106.27,38.47285   张家港: [120.555821,31.875428286   三门峡: [111.19,34.76287   锦州: [121.15,41.13288   南昌: [115.89,28.68289   柳州: [109.4,24.33290   三亚: [109.511909,18.252847291   自贡: [104.778442,29.33903292   吉林: [126.57,43.87293   阳江: [111.95,21.85294   泸州: [105.39,28.91295   西宁: [101.74,36.56296   宜宾: [104.56,29.77297   呼和浩特: [111.65,1)">298   成都: [104.06,30.67299   大同: [113.3,40.12300   镇江: [119.44,32.2301   桂林: [110.28,25.29302   张家界: [110.479191,29.117096303   宜兴: [119.82,31.36304   北海: [109.12,21.49305   西安: [108.95,34.27306   金坛: [119.56,31.74307   东营: [118.49,37.46308   牡丹江: [129.58,44.6309   遵义: [106.9,27.7310   绍兴: [120.58,30.01311   扬州: [119.42,32.39312   常州: [119.95,31.79313   潍坊: [119.1,36.62314   重庆: [106.54,29.59315   台州: [121.420757,28.656386316   南京: [118.78,32.04317   滨州: [118.03,37.36318   贵阳: [106.71,26.57319   无锡: [120.29,31.59320   本溪: [123.73,41.3321   克拉玛依: [84.77,45.59322   渭南: [109.5,34.52323   马鞍山: [118.48,31.56324   宝鸡: [107.15,34.38325   焦作: [113.21,35.24326   句容: [119.16,31.95327   北京: [116.46,39.92328   徐州: [117.2,34.26329   衡水: [115.72,37.72330   包头: [110,40.58331   绵阳: [104.73,31.48332   乌鲁木齐: [87.68,43.77333   枣庄: [117.57,34.86334   杭州: [120.19,30.26335   淄博: [118.05,36.78336   鞍山: [122.85,41.12337   溧阳: [119.48,31.43338   库尔勒: [86.06,41.68339   安阳: [114.35,36.1340   开封: [114.35,34.79341   济南: [117,36.65342   德阳: [104.37,31.13343   温州: [120.65,28.01344   九江: [115.97,29.71345   邯郸: [114.47,1)">346   临安: [119.72,30.23347   兰州: [103.73,36.03348   沧州: [116.83,38.33349   临沂: [118.35,35.05350   南充: [106.110698,30.837793351   天津: [117.2,39.13352   富阳: [119.95,30.07353   泰安: [117.13,1)">354   诸暨: [120.23,1)">355   郑州: [113.65,1)">356   哈尔滨: [126.63,45.75357   聊城: [115.97,36.45358   芜湖: [118.38,31.33359   唐山: [118.02,39.63360   平顶山: [113.29,33.75361   邢台: [114.48,37.05362   德州: [116.29,37.45363   济宁: [116.59,35.38364   荆州: [112.239741,30.335165365   宜昌: [111.3,30.7366   义乌: [120.06,29.32367   丽水: [119.92,28.45368   洛阳: [112.44,34.7369   秦皇岛: [119.57,39.95370   株洲: [113.16,27.83371   石家庄: [114.48,38.03372   莱芜: [117.67,36.19373   常德: [111.69,29.05374   保定: [115.48,38.85375   湘潭: [112.91,27.87376   金华: [119.64,29.12377   岳阳: [113.09,29.37378   长沙: [113,28.21379   衢州: [118.88,28.97380   廊坊: [116.7,39.53381   菏泽: [115.480656,35.23375382   合肥: [117.27,31.86383   武汉: [114.31,30.52384   大庆: [125.03,46.58385 386 const convertData = 387   var res = [];
388   for (var i = 0; i < data.length; i++389     var geoCoord = geoCoordMap[data[i].name];
390     if (geoCoord) {
391       res.push({
392         name: data[i].name,1)">        value: geoCoord.concat(data[i].value)
394       });
395   }
397   return res;
399 const ec_center_option =400    title: {
401      text: '全国主要城市空气质量 - 百度地图',1)">402      subtext: 'data from PM25.in',1)">403      sublink: 'http://www.pm25.in',1)">404      left: 'center'
405   407     trigger: 'item'
408   bmap: {
410     center: [104.114129,37.550339411     zoom: 5412     roam:     mapStyle: {
      styleJson: [
415 416           featureType: 'water'417           elementType: 'all'          stylers: {
419             color: '#d1d1d1'
420         },1)">423           featureType: 'land'424           elementType: 'all'425 426             color: '#f3f3f3'
429 430           featureType: 'railway'431           elementType: 'all'433             visibility: 'off'
437           featureType: 'highway'438           elementType: 'all'440             color: '#fdfdfd'
443 444           featureType: 'highway'445           elementType: 'labels'446 447             visibility: 'on'
448 449 450 451           featureType: 'arterial'452           elementType: 'geometry'454             color: '#fefefe'
456 457 458           featureType: 'arterial'459           elementType: 'geometry.fill'461             color: '#fefefe'
462 463 465           featureType: 'poi'466           elementType: 'all'468             visibility: 'off'
470 471 472           featureType: 'green'473           elementType: 'all'474 475             visibility: 'off'
479           featureType: 'subway'480           elementType: 'all'481 482             visibility: 'off'
483 484 485 486           featureType: 'manmade'487           elementType: 'all'489             color: '#d1d1d1'
491 492 493           featureType: 'local'494           elementType: 'all'496             color: '#d1d1d1'
497 498 499 500           featureType: 'arterial'501           elementType: 'labels'503             visibility: 'off'
506 507           featureType: 'boundary'508           elementType: 'all'510             color: '#fefefe'
511 514           featureType: 'building'515           elementType: 'all'517             color: '#d1d1d1'
518 519 520 521           featureType: 'label'522           elementType: 'labels.text.fill'523 524             color: '#999999'
525 526 527 528 529 530 531 532       name: 'pm2.5'533       type: 'scatter'534       coordinateSystem: 'bmap'535       data: convertData(data),1)">536       symbolSize:  (val) {
537         return val[2] / 10538 539       encode: {
540         value: 2
541 542       label: {
543         formatter: '{b}'544         position: 'right'545         show: 546 547       emphasis: {
548         label: {
549           show: 550 551 552 553 554       name: 'Top 5'555       type: 'effectScatter'556       coordinateSystem: 'bmap'557       data: convertData(
558           data
559               .sort( (a,b) {
560                 return b.value - a.value;
561               })
562               .slice(0,6563       ),1)">564       symbolSize: 565         566 567 568         value: 2
569 570       showEffectOn: 'render'571       rippleEffect: {
572         brushType: 'stroke'
573 574 575         formatter: '{b}'576         position: 'right'577         show: 578 579       itemStyle: {
580         shadowBlur: 10581         shadowColor: '#333'
582 583 584         scale: 585 586       zlevel: 1
587 588 589 590  基于准备好的dom,初始化echarts实例
591 var ec_center = echarts.init(document.getElementById('center2'),1)">592 ec_center_option&&ec_center.setOption(ec_center_option);
View Code

页面整体调用

 7     script src="../static/js/jquery-3.6.0.js"script 8     ="../static/js/echarts.min.js" 9     type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@3.6.0/map/js/china.js"="https://cdn.jsdelivr.net/npm/echarts@3.6.0/map/js/world.js"11     ="../static/js/bmap.min.js"="https://api.map.baidu.com/api?v=2.0&ak=你的ak"="../static/js/dark.js"14     ="text/javascript"15         function16             var cur_time = new17              str_time = cur_time.getFullYear() + "" + ((cur_time.getMonth() 1) > 9 ? (cur_time.getMonth() ) : 0))  (cur_time.getDate()  cur_time.getDate() :  cur_time.getDate())  (cur_time.getHours()  cur_time.getHours() :  cur_time.getHours()) : (cur_time.getMinutes()  cur_time.getMinutes() :  cur_time.getMinutes())  (cur_time.getSeconds()  cur_time.getSeconds() : 18             $(.time19 21         22 23                 url: /get_c1_data24                 type: post25                 success: 26                     $(.num).eq(27 28 229 330 
31 32                 error: 33 
34 35 36 37 
38         $(document).ready(39 40 41             setInterval(get_time,100042             setInterval(get_c1_data,1)">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 ="../static/js/ec_center.js" type76 ="../static/js/ec_left1.js"77 ="../static/js/ec_left2.js"78 ="../static/js/ec_right1.js"79 ="../static/js/ec_right2.js"80 81 >
View Code

源码链接

备注

本文主要是记录学习,抛转引玉。与大家一起进步。

城南【作者】曾巩 【朝代】宋

雨过横塘水满堤,乱山高下路东西。
一番桃李花开尽,惟有青青草色齐。

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...