基于ArcGIS For Android的地震信息发布系统的设计与实现
2016-03-25杨哲
杨哲
基于ArcGIS For Android的地震信息发布系统的设计与实现
杨哲
摘 要:利用ArcGIS For Android,结合计算机互联网络技术、智能手机技术。设计并实现了Android地震信息发布系统的原型,这个原型可以在智能手机平台上有效的展现可视化的地震信息数据。实现了向社会公众及政府部门提供地震信息服务的设计目标。
关键词:ArcGIS For Android;XML;地震信息发布;地理信息系统
0 引言
地震是由地壳下岩层的断层发生位移所引起的,地球每时每刻都在发生只有仪器才能测量到的小型地震(全球每年会发生1450000次以上的里氏2级以下地震),断层的位移往往发生在几十或者数百公里深的地下。但是当发生大型的断层位移时,其所释放的巨大能量会以地震波的形式传播到地表,造成人员伤亡和财产损失。中国的建筑物特别是农村地区的建筑物防震性能较差,而且人口密度高,如果发生里氏5级以上的浅源地震就有可能造成巨大人员伤亡。
中国属于地震多发国之一,准确快速的测地震数据以及急时向社会公众发布地震信息,是政府相关部门的主要职责之一。随着互联网技术以及智能手机等相关技术的发展,用户对地震信息发布服务的时效性以及准确性要求也越来越高。近年来,地理信息系统(GIS)技术发展迅速,自互联网以及智能手机问世以来GIS的所有方面都出现了范式转变。GIS的概念模型从孤立的架构转变为一个可互操作的框架,从孤立的解决方案转变为分布式的解决方案,从封闭的专用数据格式转变为规范的开放格式,运行环境由桌面环境变为网络以及移动环境。随着GIS范式的转变,把ArcGIS for Android等最新的移动GIS应用程序编程接口技术应用到地震信息发布系统中是完全可行的[1]。
本程序使Android Studio基于ArcGIS For Android开发,程序利用美国地质调查局提供的实时地震信息XML文件作为数据源,自动解析XML文档,获得地震信息,并将地震信息显示于MapView控件上。用户可以随时随地了解地震信息。同时,本程序使用Android servers于手机后台运行,若地震发生时用户处于危险区域时系统会发出报警。
1 系统的总体设计
地震信息发布系统所发布的数据类型比较少,但是对于数据的实时性要求很高,不能够及时准确的提供地震信息就会延误抗震救灾工作,带来不必要的生命和财产损失。根据地震信息发布系统用户的具体需求,结合ArcGIS For Android的技术特点,将整个系统分成两大功能模块,分别是:地震信息发布模块与后台报警模块。整个系统的构架如图1所示:
图1 地震信息发布系统框图
根据系统工程设计的思想,系统需要满足满实时性、实用性、可靠性、完备性、科学性、规范性、经济性、可扩展性和开放性等设计原则。本系统自动获取地震数据、发布地震信息。其数据类型、编码和图形符号符合现有的国家和行业规范,能够实现空间数据和属性数据的无缝链接,符合社会公众的操作习惯,不仅实现地震信息管理的科学化、规范化和自动化的管理要求,又满足社会公众及政府部门对地震信息发布服务的需求,从而达到多方受益的目标。
2 系统的实现
本系统使用ArcGIS for Android开发,ArcGIS for Android 是美国ESRI 公司的移动端GIS解决方案,将GIS的适用范围从桌面以及Web平台扩展到移动平台。ArcGIS for Android 使开发人员能够使用Java 语言在Android系统上构建多种与地图相关的应用程序,这些应用程序可以使用ArcGIS Server 提供的强大制图、地理编码、地理处理和自定义功能。
Android Studio使用Gradle脚本来编译APK应用程序[2],要在加载ArcGIS for Android所提供的MapView控件首先需引入ESRI提供的二进制Maven文件,只需在工程的build.gradle (Module: app)文件内dependencies的标签下添加一个compile 'com.esri.arcgis.android:arcgis-android:10.2.5'值即可[3]。
2.1 XML简介与解析
为了实时的获取地震点的信息,本程序解析由美国地质调查局提供的实时地震信息XML文件,文件的地址为: http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary
/1.0_hour.atom
2.1.1 XML简介
XML是一种可扩展标记语言,它为人类可读以及机器可读的文档格式定义了一系列的编码规则。XML的设计目的是为了在互联网上不同系统之间传递大量的结构化数据。XML是一种文本化的数据格式,由于使用了Unicode编码,XML支持世界上的每一种语言。截至2009年,开发者们开发了数百种基于XML的语言,例如RSS,Atom,SOAP以及XHTML。
一个完整的XML文档包括Unicode字符、标记、内容、标签、元素、属性以及XML声明。下面是美国地质调查局提供的实时地震信息XML文件的部分内容。
几乎每一个合法的Unicode字符都可以出现在XML文档中,应用程序可以通过简单的规则区分标记和内容。标记由“<”开始,以“>”结束,或者由“&”开始,以“,”结束,不是标记的字符串都是内容。标签一种标记结构,由“<”开始,以“>”结束。标签有开始标签,例如:<time>;结束标签,例如:</time>, XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分,元素可包含文本、其他元素(称之为子元素)、或者同时包含两者。元素也可以拥有属性。XML 元素可以在开始标签中包含属性,属性(Attribute) 提供关于元素的额外(附加)信息。例如在<img src="photo.jpg" alt='kmust, by yz' />中,img元素有src和alt两个属性,属性值分别为photo.jpg以及kmust, by yz。XML文档声明也是XML文档中必不可少的一部分,XML声明区分了XML文档与HTML文档。每个XML文档的开头便是XML声明,例如:<xml version="1.0" encoding="UTF-8">指定了XML文件的版本以及编码字符集。美国地质调查局提供的实时地震信息XML文件的每个元素的含义如表1所示:
表1 XML文件中每个标签的含义
2.1.2 XML文件的解析
为了解析XML文件,本程序先通过网络将XML文件读入一个输入流InputStream。Android系统中解析XML文件可以使用XmlPullParser。XML文件实质上是一棵递归定义的树,此文件的首、末两个标签实质上就是这棵树的树根。Parser函数用于处理命名空间,并将输入流作为输入,调用nextTag函数后程序就读取了XML文件的首标签,相当于找到了这棵树的根节点,找到根节点以后就可以递归的处理根节点的子树,根节点的每一棵标签为entry的子树都是一个地震点的实体信息。下面的代码用于寻找entry标签,在找到entry标签之后,readEntry函数将用同样的方法处理entry标签内部的title,updated,georss:point,georss:elev标签。
private List readXML(XmlPullParser parser) throws XmlPullParserException, IOException {
List entries = new ArrayList();
parser.require(XmlPullParser.START_TAG, ns, "feed");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG)
{
continue;
}
String name = parser.getName();
if (name.equals("entry")) {
entries.add(readEntry(parser));
} else {
skip(parser);
}
}
return entries;
}
这段代码中的skip函数用于跳过不需要的标签,当它检测到下一个标签不是一个开始标签时抛出异常,否则跳过与这个开始标签配对的结束标签之间的所有内容(包括开始标签与结束标签)。由于XML文件中的标签可以嵌套定义,为了保证skip方法在检测到正确的结束标签时终止,方法内部会维护一个局部变量depth用于记录嵌套的深度,depth的值被初始化为1。depth的值为0时表示函数成功的跳过了一个标签,否则如果当前处理的标签内出现一个另一个开始标签,depth的值增加1,直道遇到一个结束标签时depth的值才会减少1。
处理XML文件的最后一步是用readEntry函数所获取的地震实体的所有属性构造一个Earthquake类的对象,将这个对象加入一个列表的末尾,最后将这个列表返回。
2.2 地震信息的发布。
地震信息发布模块是本系统最重要的功能。用户打开应用程序后首先就会进入到本模块,在MapView地图控件上用户可以看到显示地震地点的红色圆点,点击圆点以后用户可以在弹出的信息窗口内查看到震级、发震时间等地震的具体信息。
为了防止访问网络时的延时对程序UI模块加载时的影响,Android程序推荐用多线程的方式访问网络,可以使用一个继承自AsyncTask类的子类DownloadXML实现这种多线程的网络访问。DownloadXML类需要重写基类的doInBackground与onPostExecute两个方法。在doInBackground方法内使用上一节所介绍的方法解析XML文件。解析的结果是一个包含地震点信息的List。在onPostExecute方法内,首先接受结果List,并且使用com.esri.core.geometry.Point对象接收地震信息点的位置属性。震级以及发震时间等其它属性则需要使用HashMap传入Point对象。具体实现代码如下:
eq = (Earthquake) result.get(i);
Point point = new Point();
point.setXY(eq.longitude, eq.latitude);
java.util.Map<java.lang.String, java.lang.Object> cc = new HashMap<String, java.lang.Object>();
cc.put("title", eq.M);
cc.put("time", eq.updated);
cc.put("location", eq.point);
cc.put("elev", eq.elev);
由于arcgisonline提供的基础地图服务使用Web墨卡托坐标,而XML文件所获取的地震点使用WGS84坐标,要将地震点信息正确的显示到地图上需要用GeometryEngine.project(point,SpatialReference.create(4326),SpatialReference.create(3857));函数进行空间参考转换,SpatialReference.create(4326)代表输入点使用的WGS84坐标系,SpatialReference.create(3857))代表基地图使用的Web墨卡托坐标系。
实现用户点击地震点以后弹出地震的详细信息可用map.setOnSingleTapListener回调函数进行监听,这个函数获取用户点击时的x,y屏幕坐标,自动将屏幕坐标转换为地理坐标,并且在一定的容差范围内查找地震点信息,如果查找成功会在Callout对象中显示地震详细信息。地震信息的显示如图2所示:
图2 地震信息的显示
2.3 后台警报服务的实现
本模块使用Android Service在后台运行,通过android系统获取用户的位置[4],实时计算用户与震中的距离,当距离小于一个阀值时系统会发出警报。由于不需要计算精确的距离以及节省后台进程的内存,本模块不使用ArcGIS For Android提供的精确距离计算方法。而是将地球椭球体近似为球体,利用如下公式[5]就可以计算出用户位置与震中位置两点之间的弧长。
其中s表示弧长,latitude1,longitude1 表示用户位置的经纬度,latitude2,longitude2 表示震中位置的经纬度,a= latitude 1 - latitude 2 为两点纬度之差 b= longitude1 -longitude 2 为两点经度之差,6378.137为地球半径的近似。
3 总结
通过使用ArcGIS For Android提供的应用程序编程接口,本文所提出地震信息发布系统的原型被证明可以在智能手机上有效的展现可视化的地震信息数据。此外,ArcGIS For Android以及XML等技术在构建其他客户端服务器型智能手机应用时也具有一定的参考价值。
参考文献
[1] 敖杰刚,王志红. 基于 ArcGIS Server 的 REST 技术综述[J].测绘标准化, 2012,4 :13-15.
[2] Android SDK[EB/OL]. https://developer.android.com/tra ining/index.html
[3] Create an Offline Map[EB/OL].
[4] https://developers.arcgis.com/android/guide/create-an-offl ine-map.htm
[5] 黄志勇.基于Android平台的移动位置信息服务开发研究[J].自动化技术与应用,2011,30 (12): 22-26.
[6] 刘军伟.地球表面上两点之间距离的几种求算方法[J].许昌学院学报,2007, 26(5) : 126-129.
Design and Implementation of Earthquake Information Publish System Based on ArcGIS for Android
Yang Zhe
(Kunming University of Science and Technology, Kunming650093, China)
Abstract:By using the ArcGIS for Android and combining with computer network and smartphone technology, this paper designs and implements a system prototype for earthquake information publish. This prototype is proved to be effective on the smartphone to show the visualization of earthquake information and data. Achieve the goal of the design to provide the public and government departments with earthquake information.
Key words:ArcGIS For Android; XML; Earthquake Information Publish; GIS
收稿日期:(2015.04.27)
作者简介:杨 哲(1990),男,白族,云南昆明,昆明理工大学,硕士,研究方向:地理信息系统二次开发。昆明,邮编650093
文章编号:1007-757X(2016)01-0054-03
中图分类号:TP311
文献标志码:A