陈 琳,任 芳
(1.四川省气象台,四川 成都 610072;2.陕西省气象服务中心,陕西 西安 710014)
基于OpenAPI的Python空气质量监测数据程序设计
陈琳1,任芳2
(1.四川省气象台,四川成都610072;2.陕西省气象服务中心,陕西西安710014)
环境气象预报是政府和环保部门应对空气重污染时的重要决策支撑。只有实时快捷地获取当前空气质量监测数据,气象部门才能正常开展环境气象预报业务。为了快速、准确地获取西南区域空气质量监测产品,并生成Micaps格式产品,开发了基于一个OpenAPI的Python多线程程序。程序可直接调用API底层连接的数据库,获取数据效率高,具有较高的实时性和准确性,已投入四川省气象台天气预报业务运行。
OpenAPI接口;Python语言;多线程;空气质量监测数据;Micaps
随着人们对环境质量的重视,空气污染已成为当下民众关注的热点。而环境气象预报作为气象服务的新兴业务,也受到气象部门越来越大的重视。为了加快环境气象业务系统建设,需进行环境气象多源数据分析和重污染天气影响评估。对于研究环境气象预报方法来说,环境监测数据资料的获取与保存至关重要。
当前,环境监测数据是由各省环境监测总站将其按时以数据交换方式提供给各级气象台,由于各方面原因,环境监测总站提供的数据无具体值且数据实时性远不能达到环境气象预报要求,此外,网上虽有当天的空气监测实况,但网上的各类数据无法加载到气象部门的专业业务系统(如Micaps系统)中,使环境预报业务难以正常开展。本文主要阐述利用Python提供的OpenAPI处理标准库,将环境监测数据产品生成Micaps格式的实现方法。
2.1OpenAPI
API的全称是应用编程接口(Application Programming Interface),这并不是一个新概念,在计算机操作系统出现的早期就已经存在了。在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为叫做开放网站的API,与之对应的,所开放的API就被称作OpenAPI。
2.2Python脚本语言
Python是一种简单易学、功能强大的开源编程语言,几乎能够在目前所有的操作系统上运行,它有高效率的多层数据结构,能简单而有效地实现面向对象编程[1]。Python简洁的语法和对动态输入的支持,再加上其解释性语言的本质,使得它在大多数平台上的很多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发[2]。尤其是Python提供了针对网络协议的标准库,对网络协议的各个层次进行了抽象封装,程序员可以集中精力处理程序逻辑。其次,Python非常擅长处理字节流的各种模式,具有很快的开发速度[3][4]。
2.3Python多线程
Python使用函数和类两种方式包装线程对象,其调用线程thread模块的thread.start_new_thread()函数来创建一个新的线程,具体语法为:thread.start_new_thread ( function, args[, kwargs] ) ,其中function参数为调用的线程函数;args为传递给线程函数的参数,kwargs是可选参数[5]。调用关键代码如下:
try:
thread.start_new_thread(gethtml(url), ("Thread-1", 2, ) )
thread.start_new_thread(gethtml(url), ("Thread-2", 4, ) )
except: Exception,e:
return Exception,":",e
其中,gethtml(url)函数用于获取全国城市空气质量指数(AQI)排行榜。
由于国家环境监测总站未发布OpenAPI,程序采用第三方商业网站提供的OpenAPI。该网站数据全部来源于国家环保网站公开数据,网站再根据国家环保网站的实时数据进行二次核实。程序设计内容主要包括从OpenAPI获得数据、匹配站点生成Micaps格式产品、生成可执行文件等3个模块。从OpenAPI获得数据是基础,只有下载了OpenAPI提供的数据,才能匹配预先设置的西南区域站点信息,得到各种空气质量监测数据。程序设计流程如图1所示:
图1 程序设计流程Fig.1 Program design process
3.1从OpenAPI获取数据
统一资源定位符(URL)是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它[6]。在Python语言众多网络函数库中,功能最强大的是Urllib库,该库提供一系列用于操作URL的功能,使用户可以像读取本地文件一样读取www和ftp上的数据。通过使用Urllib库的request模块可以非常方便地抓取URL内容,如发送一个GET请求到指定的页面,即可返回JSON数据[7]。
从OpenAPI获得数据的程序设计流程如图2所示,具体流程如下:先导入从OpenAPI获得数据所需的函数库urllib和json,再定义一个函数gethtml(url),获取全国城市的空气质量指数(AQI)排行榜,该函数返回的是JSON格式的数组,里面包含目前支持的全国190个城市AQI排行榜信息,其中每项信息包含area (城市名称)、aqi(空气质量指数)、co(一氧化碳1 h平均)、no2(二氧化氮1 h平均)等16种空气质量监测数据。
图2 从OpenAPI获取数据流程Fig.2 Processes of Getting data from OpenAPI
由于OpenAPI获取到本地的数据是JSON格式的,还需把JSON格式数据转换成字典格式。字典是Python中唯一内建的映射类型,可存储任意类型对象,它的每个键值对用冒号分割,每个对之间用逗号分割,整个字典包括在花括号{}中,键必须是唯一的,但值则不必。JSON格式数组转换成字典后的数据格式如下:
[{"aqi":16,"area":"成都","co":0.456,…}{ "aqi":18,"area":"三亚","co":0.97, …}{"aqi":26,"area":"泉州",”co":0.717,… }]。
此部分关键代码如下所示:
def gethtml(url):
try:
htmls = urllib.urlopen(url)
airproduct = json.loads( htmls.read())
excep: Exception,e:
return Exception,":",e
return (airproduct)
其中,url=http://www.####.###/api/querys/aqi_ranking.json&开发者密钥,airproduct = json.loads(htmls.read())的作用是把JSON格式转换成字典格式。
3.2生成Micaps格式产品
3.2.1数据预处理为了将数据加载在气象专业软件Micaps系统上,需把数据转换成Micaps 120类格式。具体步骤如下:首先生成西南区域有空气质量指数(AQI)的52个城市的经纬度信息文件geo.txt,文件内容如表1所示。
表1 西南区域52个城市经纬度信息
站点名在字典airproduct中以“area”键表示,airproduct [i]['area']表示第i个站点“area”键的值。把经纬度信息以字符串形式读入内存中,与之前的字典airproduct中“area”键的值进行匹配,如匹配到相同值,用列表list[]记录站点在字典中的索引值i。此部分关键代码如下所示:
for i in range(0, len(listgeo)):
for j in range(0, len(airproduct)):
if airproduct[j]['area']==listgeo[i].split(' ')[3].decode("gbk"):
list.append(j)
break
其中len(listgeo)代表经纬度信息列表listgeo的长度;len(airproduct)代表字典airproduct的长度。
接下来再利用索引列表list[]查找52个城市空气质量检测数据的值,把查找到的值放在函数getele()的列表listele[]中。列表listele[]是记录空气质量监测要素的列表,其中ys表示空气质量监测要素名,如“aqi”,“co”。例如调用函数getele(‘aqi’)表示在利用列表list[]的索引值查找字典airproduct键“aqi”的值,查找到的值用列表listele储存,getele(‘co’)以此类推。关键代码如下所示:
def getele(ys):
listele = []
for a in range(0, len(list)):
listele.append(str(airproduct[a][ys]))
return listele
3.2.2生成产品国家环境监测总站空气质量监测数据每小时更新1次,本程序每小时生成1个Micaps 120类数据文件,文件名格式如16022413.000。引入Python中的datetime库,截取时间的字符串作为文件名,保存文件的路径path="d:” + datetime.now().strftime('%Y%m%d%H')[2:10] + ".000"。最后把文件头、站点经纬度和监测数据等信息列表写入文件,即生成Micaps 120格式产品,生成文件内容见图3。
图3 Micaps 120格式的空气质量监测数据产品Fig.3 Micaps 120 of air pollution products
在生成的Micaps 120类文件中,空气质量监测数据主要包含aqi(空气质量指数)、CO 1 h平均、NO21 h平均、O31 h平均、O38 h滑动平均、SO21 h平均等要素。图4为2016年2月24日13时空气质量监测产品在Micaps 3.2系统的显示界面。
图4 Micaps 3.2系统显示界面Fig.4 Micaps 3.2 system display interface
此部分关键代码如下:
for x in range(len(listgeo)):
file(path,"w").writelines(listgeo[x].split(' ')[0]+" "+listgeo[x].split(' ')[1]+" "+listgeo[x].split(' ')[2]+" "+getele(‘aqi’)[x]+…+getele(‘so2’)+" ")
其中len(listgeo)代表经纬度信息列表listgeo的长度,listgeo[x].split(' ')[0]用于获取geo.txt的站点编号,listgeo[x].split(' ')[1]和listgeo[x].split(' ')[2]用于分别获取geo.txt中站点的纬度和经度。
3.3生成可执行文件
为了使Python脚本程序能在未安装Python环境的Windows系统下运行,必须利用py2exe等工具把Python脚本(以.py为后缀)转换成Windows可执行程序(*.exe)。事先把Python脚本命名为airquality.py,然后在网上下载py2exe安装程序,安装完成后,建立一个用于发布程序的脚本文件[8],命名为setup.py,其内容如下:
from distutils.core import setup
import py2exe
setup(console=["airquality.py"])
在Python的运行命令提示窗口,键入如下命令:python setup.py py2exe,该命令执行后,将产生一个名为dist的子目录,其中包含了可执行程序airquality.exe。把airquality.exe放在Windows环境下,每小时执行1次,即可自动获取每小时更新1次的空气质量监测数据。
利用Python丰富的标准库以及快速开发的特长,设计了一个基于OpenAPI的Python空气质量监测数据产品程序,实现每小时定时自动生成Micaps格式的西南区域空气质量监测产品。目前该程序已部署到四川省气象台日常天气预报业务中,其生成的空气质量监测产品为环境气象预报的研究工作提供了实况对比和技术支撑,满足了预报员对空气质量监测实况资料采集的需求。
[1] 刘志凯,张太红,刘磊.基于Web的Python3编程环境[J]. 计算机系统应用,2015,24(7):236-239.
[2] 王大伟.基于Python的Web API自动化测试方法研究[J]. 电子科学技术,2015,2(5):573-581.
[3] Magnus Lie Hetland,司维,曾军葳,等. Python基础教程[M]. 北京:人民邮电出版社,2014:243-245.
[4] 高森. Python网络编程基础[M]. 北京:电子工业出版社,2007:326-327.
[5] 李俊丽.基于Linux的Python多线程爬虫程序设[J] .计算机与数字工程,2015(5):861-863.
[6] Elizabeth Castro.HTML XHTML CSS基础教程[M].北京:人民邮电出版社,2007:35-37.
[7] TJ.O’Connor,崔孝晨,武晓音.Python绝技:运用Python成为顶级黑客[M].北京:电子工业出版社,2016:213-220.
[8] 刘凌霞,郝宁波,吴海涛.21天学通Python[M].北京:电子工业出版社,2016:191-194.
Python Multithreaded Air Pollution Products Program Based on OpenAPI
CHEN Lin1,REN Fang2
(1.Sichuan Provincial Meteorology Observatory, Sichuan Chengdu 610072, China;2.Shanxi Provincial Meteorological Service Center, Xian 710014, China)
The environmental meteorological forecast is an important decision support for the government and the environmental protection departments to deal with the heavy air pollution. Only with real-time and fast access to current air pollution products, can the meteorological department carry out the normal environment and meteorological forecasting business. In order to quickly and accurately obtain southwest regional air pollution products and generate the Micaps products, an OpenAPI Python multithreaded program was developed. The program is of high performance, it can directly call API connections at the bottom of the database, the fetching data is more efficient, and the program is with timeliness and accuracy. This program has been applied successfully in daily operations of the Sichuan Meteorological Observatory.
Python;multithreading;air pollution products;OpenAPI;Micaps
1003-6598(2016)03-0078-04
2016-03-09
陈琳(1983—),女,工程师,主要从事气象信息技术工作,E-mail:suelincl@126.com。
TP311
B