0 引 言
随着经济社会的不断发展,自然灾害对经济发展和社会生活造成的损失在不断增大,预防和减轻自然灾害已成为摆在全社会面前的共同任务。手机气象服务以其及时、便捷、灵活的特点为用户获取各种气象信息提供了方便,在防灾减灾、气象预警、重大气象保障服务等方面发挥着不可或缺的作用[1]。同时,Android是一种基于Linux的自由及开放源代码的操作系统,在智能手机操作系统市场拥有巨大的占有率[2]。因此开发一款面向气象部门和相关单位的基于Android系统的手机县级气象服务系统,能够有效提高气象服务的社会效益和经济效益。 []
1 系统设计
1.1 主要技术
开发Android软件,首先要搭建Android开发环境,具体搭建流程为依次安装JDK、Eclipse、Android SDK和ADT[3]。其中Eclipse是一个开放源代码、基于Java的可扩展开发平台,软件开发工作在其基础上进行。同时还使用到一些第三方开发包,如实现图表功能的AChartEngine?1.1.0.jar、地图服务和定位服务的BaiduMapApi_v3_0_0.jar、多页面滑动切换的Android?Support?v4.jar。
1.2 功能设计
目前市面上天气客户端种类繁多,但是它们的天气信息仅有最近几天天气预报和少量实况数据,且更新较迟缓。针对这一现状,气象部门自己开发了一款气象产品丰富、实况数据全面的手机客户端,这一研发成果具有重要意义。系统所有功能模块如图1所示,气象产品有灾害预警、重要天气消息推送、近6天图形化天气预报,短中期天气预报、旬天气预报、气候趋势预报;实况数据包括最新实况显示(以数据列表和地图标注两种方式显示)、前24小时气温和降雨序列、任意时段数据统计、任意时段和任意站点的逐时数据检索。
图1 功能模块图
1.3 总体结构
在软件开发设计中,应用最多的就是分层技术。软件分层采用分而治之的思想,将问题分解之后各个击破,实现“高内聚、低耦合” [4]。因此系统在结构图2 总体结构图
1.3.1 应用层
应用层是呈现给用户的功能界面,即手机客户端。因为气象数据的保密性,对社会公众仅提供预警预报服务,特殊用户需要授权后才能够查看实况数据。
1.3.2 Web层
因Android系统不能直接对远程数据库进行操作,所以需要一个中间件来存取数据[5]。应用层通过URL方式提交数据请求到Web层,Web层收到请求后从数据库中提取所需数据后生成并返回便于手机客户端解析的XML格式页面,这里使用Asp.net技术完成该功能。
1.3.3 数据层
数据层由分别存储气象产品、气象数据和软件管理3个数据库组成。为了保障数据库的安全性,数据库的服务器使用独立服务器,并设在气象内网中,Web层用内网IP访问数据库。
1.3.4 管理层
管理层负责管理数据层的数据库。其中后台管理软件可进行新版本发布、重要天气消息推送、授权管理、手机客户端安装信息查看等操作。
2 主要功能的实现
2.1 数据获取和显示
在Android应用程序中,如果UI线程处理占用时间过长(如网络获取数据、大量数据计算),就会出现ANR(应用程序无响应)异常[6]。因此,为了保证良好的用户体验,数据获取需要在多线程中进行。另外,由于Andorid规定只有UI线程才能更新用户界面[7],为此需要使用Thread+Handler来解决上述问题。在Thread中用HttpURLConnection类发送数据请求,线程请求到XML数据页面后,使用XMLPullParser类解析数据,再将数据封装到Message类中,最后用Handler.sendMessage(message)方法发送给Handler的回调方法handleMessage进行界面更新[8]。
2.2 权限管理
权限管理是通过“手机号+标识码”结合实现的。先要在后台管理软件新增授权用户后(手机号为必填项),用户才能在手机客户端的授权管理页面用手机号进行授权。授权的具体流程为先查询数据库中是否存在该手机号,若不存在则授权失败;如果存在,再查询是否存在对应标识码,有标识码表示该手机号已经授权过,不能重复授权,没有对应标识码则授权成功并生成惟一的标识码,生成的标识码同时保存在数据库和手机客户端中,如图3所示。
图3 授权流程图
另外若用户需要用已授权过的手机号重新授权,则要在后台管理软件中清除该手机号的标识码就可以再次用于授权。为了保证之前的授权因此而失效,在每次运行手机客户端时都要用手机客户端存储的标识码和数据库中的标识码进行比对,如果相同才视为有效的授权。
2.3 天气趋势图
天气预报趋势图为现今手机天气软件必不可少的功能界面,具有直观、漂亮的特点,如图4的第2页面所示。为提高代码的可复用性和可读性,将其封装成一个自定义控件WeatherTrendView,通过WeatherTrendView的setBitmap(List topBmpList, List lowBmpList)方法指定天气现象图标,setTemperature(List topTemList, List lowTemList)方法指定气温数据。控件的界面绘制在重写的onDraw(Canvas canvas)事件中实现,关键代码如下:
protected void onDraw(Canvas canvas) {
<!--此处有省略代码-->
temarg = temmin + (temmax - temmin)/2;
//temmax为最高气温最大值,temmin为最低气温最小值
FontMetrics fontMetrics = mTextPaint.getFontMetrics();
float fontHeight = fontMetrics.bottom - fontMetrics.top;
//获取趋势图中标注气温的字体高度
int h1 = this.getHeight()/2; //控件中间位置的高度
int h2 = (int) (h1 - fontHeight/2);
float scale = c.getResources().getDisplayMetrics().density;
int icoHeight = (int)(40 * scale + 0.5f);
//将图标高度从dp转化为px
int h3 = (int) (h1 - fontHeight - icoHeight);
int extraHeight = (int)(150 * scale + 0.5f);
//控件上下所需的占位高度
temspace=(this.getHeight() - extraHeight)/((temmax-temmin)); //计算趋势图中每度所占高度
for(int i = 0; i < topTem.size(); i++) {
//绘制最高气温趋势
sp
ace = (temarg -topTem.get(i)) * temspace;
//获取上一个最高气温相对控件中间位置的偏移高度
if(topTem.get(i)!=32 766){ //气温值为32 766时表示空值
if (i != topTem.size() - 1) {
space1=(temarg - topTem.get(i+1))*temspace;
//获取下一个最高气温相对控件中间位置的偏移高度
canvas.drawLine(x[i],h1+space,x[i+1],h1+space1, mLinePaint1);
//用直线连接相邻最高气温,x数组为水平等分的宽度值
}
canvas.drawText(topTem.get(i)+"°",x[i],h2+space, mTextPaint); //标注最高气温数值
canvas.drawCircle(x[i],h1+space,radius,mPointPaint);
//绘制圆点
canvas.drawBitmap(topBmps[i], x[i]-topBmps[i].getWidth()/2, h3 + space, null); //绘制天气现象图标
}
}
<!--此处省略绘制最低气温趋势代码-->
}
图4 手机客户端重要功能界面
2.4 地图和定位
地图和定位服务均基于百度地图Android SDK实现,百度地图Android SDK是一套基于Android 2.1及以上版本设备的免费的应用程序接口。通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序,效果如图4的第5页面所示。地图上叠加监测站点是使用标注覆盖物MarkerOptions和文字覆盖物TextOptions实现的,在初始化每个MarkerOptions时把监测数据初始化在title属性值中,在其点击事件中就可以通过marker.getTitle()获取并予以显示。定位功能用于地图服务时显示当前位置和获取用户安装手机客户端时的地理位置,百度地图Android SDK可利用设备当前的GPS信息(GPS定位),基站信息(基站定位)和WiFi信息(WiFi定位)完成定位,使定位更为精准、快速,且提供将当前所处地点的位置坐标转换为详细地址描述的信息[9]。
2.5 气温和降雨序列图
AChartEngine是为Android应用而设计的开源/免费的绘图工具库,可用于绘制折线图、区域图、散点图、时间图、柱状图、饼状图、环形图等多种图表[10]。系统用其绘制前24小时气温折线图和前24小时降雨量柱状图。因手机屏幕宽度不够完全显示24小时序列图,AChartEngine支持左右滑动查看剩余部分。效果如图4的第4页面所示。 []
3 结 语
Android系统已基本实现天气预警、预报和实况数据的整合,为气象服务业务提供强有力的支撑,提高了气象服务能力。但随着社会发展对气象服务要求的不断提高,系统功能仍需继续努力改进和完善,不断提升综合气象服务能力,以适应社会与经济的发展对气象服务的需求。
参考文献
[1] 张延龙,杨昆,李炳文,等.基于3G手机的气象服务分析[J].现代电子技术,2011,34(18):24?25.
[2] 刘峰,袁少雄,黄光庆,等.地质灾害Android终端应用系统及其数据库研究进展[J].地理空间信息,2013(6):51?53.