基于Android的地铁出口导航系统设计与实现
2013-01-16于文驰韩彦岭洪中华
张 云,于文驰,韩彦岭,洪中华
(上海海洋大学 信息学院,上海 201306)
随着上海市轨道交通的覆盖,人们的出行很大一部分依赖着地铁提供的快捷。对于日益增多的地铁站和同时成倍增长的地铁出口,站内提供的引导地图已经很难满足人们的需求,使得为地铁出行乘客设计一款能够准确查询地铁出口周边信息的软件极为迫切。为地铁乘客提供专业的地铁出口导航软件不仅需要信息搜集的准确性,最重要的是要考虑到乘客在途中查询的方便快捷性。而现在智能机特别是基于android智能手机的日渐普及,开发出能在android手机上运行的地铁出口导航系统将极大的方便市民的出行。
本文介绍了一款基于android手机平台的上海地铁出口导航软件,在该软件中,实现了地铁站的各个出口周边信息的查询,侧重展示了软件开发时所用到的各项技术及开发流程。
该软件与同类型软件相比较,特点在于:1)能够提供离线地铁出口地图,便于手机没有信号的情况下,也能够提供详细的地铁出口说明;2)直接触控屏幕上显示的地图中的站点,便可以出现地铁出口的详细情况等。
1 Android的系统架构
Android一词的本义指“机器人”,同时也是Google公司于2007年11月5日宣布的基于Linux平台开源手机操作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的、真正开放和完整的移动软件。
Android分为4层,从高到底分别是应用层、应用框架层、系统的运行库层和Linux内核层。
应用层:用JAVA语言编写的运行在虚拟机上的程序。Google最开始时就在Android系统中捆绑了一些核心应用,比如E-Mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。
应用框架层:是编写Google发布的核心应用时所使用的API框架,开发人员也可以使用这些框架来开发自己的应用,简化了程序开发的架构设计,但是必须遵守其框架开发原则。
系统运行库层:含有C/C++的实现,包含C/C++库,能够被Android系统中不同组件使用,通过Android应用程序框架为开发者进行服务。
Linux内核层:Android最新的核心系统服务基于Linux3.0.1内核,如安全性、内在管理、进程管理、网络协议栈和驱动模型等都依赖于该内核[1-2]。
2 软件总体设计
软件的总体设计思路是在android手机上开发一个地铁出口查询软件,为用户提供更为精细的出行计划安排,方便更快捷的到达目的地。使用本软件可以根据需求,查任意一个地铁站附近的街道、可换乘公交路线及地铁线路的首末班车时间,还能够浏览地铁站周边详细地图信息。在图1中表示了该软件系统的实现的功能。如图1所示,该系统主要由4个主要功能组成,分别是:
1)位置服务功能,该功能主要实现出口周边导航定位功能;
2)出口选择功能,该功能主要实现便捷服务和地图信息显示的2个子功能。其中,边界服务功能主要是针对出口处公交路线换乘指南,和出口处街道指南。地图信息服务功能主要包括在线周边地图显示和离线地图显示,即使在手机没有信号的情况下,也能显示出口地图;
3)运营时间功能,该功能主要实现地铁首末班车时间的查询功能;
4)智能查询功能,该功能主要实现最近出口查询功能,提供最为便捷的查询服务。
图1 软件功能图Fig.1 Software function map
基于上述思路,本软件的设计可分为如下步骤:1)界面UI设计;2)数据的存储与解析;3)操作图片后地铁站的变化后的坐标与原始地铁站坐标的匹配;4)不同功能页面的跳转5)完善程序并打包发布。步骤的内容将在以下的章节中做详细说明。
3 基于Android的导航软件系统实现
3.1 系统主界面的实现
Android手机程序是由多个Activity交互组成的,对于获取的操作信息在不同的Activity之间传递,由此实现不同的功能展示。程序的主界面是一张填充屏幕的上海市轨道交通图,用户通过多点触控操作和长按屏幕来查询所选的地铁站点,因此该页面采用了LinearLayout布局文件进行布局,然后再上面加一个ImageView控件,以此实现轨道交通图在主界面的填充显示。
选取站点进入后,显示的是需要用户进行选择的信息,比如首末班车时间、出口地图以及需查询的几号出口。在这里选用的是在LinearLayout布局文件上放置一个ListView组件,再通过ArrayAdapter适配器根据从数据库中读取的每个地铁站不同的出口数目而适应显示。同时加上Checked Text View控件以实现对用户作出的选择进行事件响应。
在出口地图界面有一个ImageView控件用来放置离线的地铁站周边地图,还有一Button按钮提供在线Google Map选择,这两者都是在LinearLayout布局文件下实现的。接着在下一个布局文件中采用AbsoluteLayout布局,再引入Google MapView Widget,以实现Google Map的显示。
对于站点出口信息是在LinearLayout布局文件中放置ListView组件,通过ArrayAdapter适配器根据信息量的不同适应显示的。这一模块和进入站点后显示的界面有相似之处,只不过不再需要添加CheckedTextView控件[3-5]。
3.2 地铁站屏幕坐标的存储与变换
地铁站的原始屏幕坐标是在模拟器上用鼠标分别点击显示并记录到XML文件里的。当对轨道交通图进行缩放、移动操作后,地铁站的屏幕肯定会随着用户的操作而变化,因此需要设计出一种算法,能够根据记录图片的各项变化,使站点原始坐标经过相应的转换得出变化后的屏幕坐标。
3.2.1 XML存储站点坐标
XML信息读取后是被加载到内存里,而一般的数据库读取是通过频繁的I/O访问,在本软件中,地铁站的坐标会随用户的操作而快速频繁变化,这对数据解析读取的效率要求是很高的。把地铁站原始屏幕坐标存放到XML文件中,在程序中通过合适的方法把信息解析出来可以使软件的效率大大提高,因此这里我们采取将地铁站的原始屏幕坐标以XML文件的格式进行存储。
程序运行后,先对存储在XML文件里的原始屏幕坐标进行解析,存入到一个新建的数组中,以实现下一步坐标的匹配。由于该数据文件比较小,而且不会随着使用而增大,所以采用DOM解析器来解析XML数据。
DOM解析器将所有XML文档读取到内存中,然后允许使用DOM API遍历XML树、检索所需的数据。这是非常直观的代码,并且,在某些方面比基于 SAX的实现更加简单。虽然,DOM因为一切内容都会先读取到内存中,因此通常比较占用内存,但由于本程序所需解析的XML文档始终保持着很小的大小,以此使用DOM解析显得更为方便快捷[6]。
3.2.2 坐标变换原理
所谓坐标转换,就是将已记录点的坐标转变为动态变化后的坐标位置[7]。首先要了解手机屏幕坐标系统的正负值关系。如图2所示,在笛卡儿坐标系统中x轴向右为正值,保持增加数值,而y轴向上为正值的增加数值,但手机屏幕坐标系虽然x轴向右是正值,但y轴却是向下为正值,而且手机屏幕的原点也与笛卡儿坐标系统的不同,位于手机屏幕的左上角。
图2 手机屏幕坐标系Fig.2 Mobile-phone screen coordinate
3.2.3 屏幕坐标变换算法
当对图片进行操作时,可以时刻记录图片像素的变化情况,比如在x轴、y轴的移动距离x、y。当不再对图片进行操作时,通过对比缩放前后的分辨率,可以得到整张图片的变化比例,设为Sx、Sy。把用户最终所点击的坐标X1、Y1与缩放中心的坐标相减(一般为屏幕中心的坐标,会随屏幕大小的不同有所不同,以m、n为例),除以缩放的比例s后,与屏幕中心的坐标相加,最终减去移动的距离x、y,即可得到所选择地铁站的原始坐标X0、Y0。设置一个合适的误差范围,当条件符合时,即可确定所选择站点的编号,再由此编号来获取出口的相关信息。以公式可表示为(X0-m)*Sx+m=X1;(Y0-n)*Sy+n=Y1,由此实现了地铁站屏幕坐标匹配的全过程。
3.2.4 站点匹配的实现
当响应用户在屏幕上的长按事件时,后台会将当前的屏幕坐标通过自主设计的匹配算法自动搜索误差范围内的初始屏幕坐标。匹配成功即可得知用户选择的是哪一个地铁站,由此可以从XML文件中得到和地铁站坐标对应的编号。通过这个和站带你对应的编号我们可以从数据库中读取该站点的所有信息,包括街道信息、可换乘公交、地铁站周边地图,以及使用GoogleMap服务所必需的经纬度。
3.3 集成数据库SQLite
3.3.1 SQLite数据库
作为被android完美支持的轻量级数据库,SQLite的核心文件仅500多K,与大部分SQL有着很好的支持性,本身包含着零配置、事务化、跨平台等一系列的优点。SQLite在Android系统运行时已被集成,每个应用程序均可对其进行使用[8]。本程序数据库的存储位置设置为:data/data/com.shou.MetroExitQuery/databases。
3.3.2 SQLite在应用程序中的集成
1)创建数据库
Android本身并没有提供数据库,当程序中需要使用SQLite数据库时,必须先自行创建,然后创建表、索引,填充数据[9]。 本软件使用的数据库是预先创建好的.sqlite文件。其中填充着上海市各个地铁站的出口数据以便供程序中使用。系统会检测要创建的数据库是否存在,不存在则创建,若存在则打开。代码如下:
mDbHelper=DatabaseHelper.getInstance(mContext);
mDb=mDbHelper.getReadableDatabase();
try{
mDbHelper.copyDataBase();
}catch (IOException e) {
}
2)打开数据库
将加载程序时存放在databases文件下的sqlite数据文件打开,为出口信息的显示做第一步准备。
Private static String
DB_PATH=
“/data/data/com.shou.MetroExitQuery/databases/”;
public void openDataBase() throws SQLException{
String myPath=DB_PATH+DATABASE_NAME;
myDataBase=
SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY);
}
3)数据的读取
将不同表中的数据读取出来进行整合利用,以作为数组进行传递利用。例如从数据库中的存放街道名称信息的“guide_street”列存到一个数组中,我们可以通过cursor.getColumnIndex(“name”)和 cursor.getString()结合的方法从数据库中取得数据,代码示例:
while (cursor.moveToNext()){
lid_1 =cursor.getString (cursor.getColumnIndex(“guide_street”));
guidence_street[nNum]=lid_1;
}
4)关闭
数据库使用完毕,需将其关闭:myDataBase.close();
3.4 集成Google Map API
Google Map API是 Google为开发者提供的 Maps编程API,它允许开发者在不建立自己地图服务器的情况下,将GoogleMap地图数据嵌入到网站之中,从而实现嵌入GoogleMap的地图服务应用,并借助GoogleMap的地图数据为用户提供位置服务。如图3所示,集成Google Map的效果图。
图3 集成Google Map的效果图(以上海南站为例;左为离线地图,右在线地图)Fig.3 Image map with google map(Shanghai South Station Map, left:Off-line, right:on-line)
3.4.1 安装Google Map API
开发关于MAP的应用一般需要安装Google Map API。启动SDK管理器后选择 “Installed Options”查看是否已安装Google Map API,如果没有则需在“Available Packages”中查找并下载安装[10]。
当建立Eclipse工程,必须在Build Target中勾选Google API,版本根据安装情况自主选择。
3.4.2 从Google获得map-api密钥
获得map-api密钥,需要从用于签名应用程序的证书里获得MD5指纹,然后再Google网站上输入它,以成相关的map-api密钥。
首先必须找到调试证书,他由Eclipse生成和维护,可使用Eclipse IDE找到它的精准位置。在Eclipse工具下,选择windows-->Preference转到Android-->Build,则调试证书的位置将显示在“Default debug keystore”字段中。
然后取得debug.keystore的MD5值。首先运行cmd命令行进入debug.keystore文件所在的路径,命令行下输入如下语句:keytool-list-keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是 “android",这样即可取得MD5值。
最后需要打开浏览器到Google Map API的主页去申请一个 Map的 key, 网址:http://code.google.com/android/mapsapi-signup.html。在其中的MD5 fingerprint一栏中输入填入上一步获取的认证指纹(MD5),输入后,点 Generate API Key,之后会产生本软件需要的Google Map API。
至此从Google获得map-api密钥已经完成。
3.4.3 Google Map应用模块
1)将Google Map的API KEY写到显示地图的MapView控件中:
xmlns:android=“http://schemas.android.com/apk/res/android” android:id=“@+id/map_view” android:apiKey="API-KEY-HERE"/> 2)添加使用访问权限 在AndroidManifest.xml配置文件中加上对Internet和Map的使用访问权限,由于Google Map的API是另外提供的API,因此也需要使用use-library标签进行说明: 3)MapController的使用 当需要对地图显示的地点、放大倍数等进行设置时,使用MapController可以很好的对地图进行控制。获得MapController对象的代码如下: mMapController=mMapView.getController(); 当需要定位地点时,则需要构造一个GeoPoint表示地点的经纬度,然后使用animateTo 方法将地图定位到指定的GeoPoint上,以上海南站为例的代码如下: mGeoPoint = new GeoPoint ((int) (121.427658 *1000000),(int) (31.156707*1000000)); mMapController.animateTo(mGeoPoint); 整个功能模块实现完成后,运行程序。我们以上海南站来举例说明,选取几个功能画面,运行结果充分表明程序运行良好,整体设计满足要求。 如图4所示,主界面是一张上海地铁交通图,用户可以用手指多点触控对画面进行操作。当用户希望查询地铁出口的情况时,将两只手指放到屏幕上,然后进行手指的移动,就能够完成对主界面的放大或缩小,再通过移动主界面,找到的地铁站所在的区域,按住该区域一秒(以上),系统会根据用户的选择进行准确的判断,会自动进入显示有上海南站全部出口及地图信息的界面。 图4 从主界面操作选取站点Fig.4 Operation that choose station from main menu 如图5所示,选择需要查询的出口后,会进入提供关于该出口基本信息的界面,包括出口在线地图、可到达街道、可换乘公交。出口在线地图为地图类信息,为用户提供通该出口周边的地图信息,包括在线地图和离线地图;可到达街道和可换乘公交选项提供的是文字信息,包括从该出口可到达的街道、附近地标和附近的公交站点及可供换乘的公交。用户根据需求,点击相应按钮即可获得所需信息。 图5 出口详细信息显示Fig.5 Information of subway exit 文中首先阐述了Android体系的层次架构,通过分析地铁出行的实际需求,设计开发了并基于Android平台的地铁出口导航系统,并应用于上海南站的出口导航中。系统解决了屏幕坐标转换算法,SQLite数据库编程技术,以及Google Map的地图展示。今后,在该软件基础上,还将增加利用GPS(全球定位导航系统)实现出口附近公交站点自动导航等功能。 [1]Hashimi S Y,KomatineniS,MacLeanD. 精通 Android 2[M].人民邮电出版社,2010. [2]杨丰盛.Android应用开发揭秘[M].机械工业出版社,2007. [3]余志龙,陈昱勋,郑名杰,等.Android SDK开发范例大全[M].北京:人民邮电出版社,2009. [4]公磊,周聪.基于Android的移动终端应用程序开发与研究[J].计算机与现代化,2008(8):85-89.GONG Lei,ZHOU Cong.Development and research of mobile termination application based on android[J].Computer and Modernization,2008(8):85-89 [5]张仕成.基于Google Android平台的应用程序开发与研究[J].电脑知识与技术,2009(28):7959-7962.ZHANG Shi-cheng.Development and research of application based on google android[J].ComputerKnowledge and Technology,2009(28):7959-7962. [6]刘磊,仇菊香,吴国洋.基于Google地图服务的城市地理信息公共服务平台的设计与实现[J].测绘标准化,2011(1):10-13.LIULei,QIUJu-xiang,WUGuo-yang.DesignandImplementation of public service platform for urban geographic information based on google map services[J].Standardization and Surveying and Mapping,2011(1):10-13. [7]李华明.Android游戏编程之从零开始[M].北京:清华大学出版社,2011. [8]韩善锋,曹凤海,易昌华.SQLite数据库在嵌入式程序开发中的应用[J].物探装备,2011(3):170-173.HAN Shan-feng,CAO Feng-hai,YI Chang-hua.Application of SQLite database in the embedded program development[J].Equipment for Geophysical Prospecting,2011(3):170-173. [9]Open source.开放源码嵌入式数据库SQLite简介[EB/OL].[2005-08-22].http://www.ibm.com/developerworks/cn/opensour ce/os-sqlite/. [10]刘正,陈强.基于Android的GPS应用中的研究与开发[J].中国西部科技,2010(32):15-16.LIU Zheng,CHEN Qiang.Development and research based on android operating system and GPS technology[J].Science and Technology of West China,2010(32):15-16.4 系统应用实例
4.1 选择站点
4.2 出口信息查询
5 结束语