APP下载

基于Android的移动GIS系统的应用与实现

2015-11-26张意中游彬闫伟

物联网技术 2015年11期
关键词:Android平台

张意中++游彬++闫伟

摘 要:文中设计并实现了一款基于Android平台和移动GIS系统的校园应用。利用Android百度地图SDK,对现在LBS软件不提供小区域范围内位置服务的缺陷进行分析,结合校园内位置信息和Android平台技术实现了包括校园POI(Point of Interest)信息查询、基于校园位置的信息服务、校园POI要素显示控制、校园内部热点间的步行路线规划等多种应用功能。重点分析了基于百度地图Android SDK的移动GIS开发的关键技术,如移动空间定位、百度地图和服务器数据库的管理等。

关键词:Android平台;移动GIS技术;百度地图SDK ;LBS服务

中图分类号:TP333 文献标识码:A 文章编号:2095-1302(2015)11-00-04

0 引 言

地理信息系统(GIS)是依赖计算机软硬件对地球空间中的地理位置及其属性信息数据获取、存储、处理、检索访问和描述的管理系统[1]。随着无线通信和嵌入式软硬件等前沿科技的发展,移动智能设备获得了很大的进步。目前,在诸多移动操作系统中占主流地位的是三大操作系统,分别为IOS、Android、Windows Phone,这些操作系统均支持Mobile GIS应用程序的开发。Mobile GIS应用服务已经渗透到了各行各业,凡是人能到达或者活动的地方,比如航空航天、地面、地表、地下等都是Mobile GIS研究的领域。当前4G网络的数据下载速率达到了100 Mb/s,上传速率也有20 Mb/s[2],新型移动终端设备的软件系统和硬件系统具有更高的网络访问能力,这让移动应用可以直接接入互联网。并让Mobile GIS系统的LBS应用搬到智能终端上成为了现实。目前,许多公司、组织或者个人开发了各种Mobile GIS应用,如美国麻省理工学院的校园系统MIT Mobile、俄勒冈大学开发的数字校园系统等。这些系统的热点只能手动输入关键字查询,搜索方式单一,而且没有添加校园热点间的路线规划导航功能。

本文在Android操作系统和百度地图API的基础上,根据学校大众对位置服务的要求,结合Mobile GIS服务设计杭州电子科技大学智能校园系统,进一步拓展了Mobile GIS的应用范围。本系统的设计与实现研究方法也可以移植到智慧小区等类似系统。此系统总体包括Mobile GIS客户端、服务器端与无线通信网络三部分,采用C/S(客户端/服务器端)架构,Mobile GIS客户端通过无线网络与远端服务器通信[3,4]。

1 系统构架设计

杭州电子科技大学高教园校区现有教学区、生活区(本科)、生活区G区(研究生公寓)。整个校区面积广阔,多达1 200亩,校园内的建筑物、院系、办事机构等很多,一般分布较散,本校师生都难以准确寻找,校园的新生和外来人员更加难以分辨、找到自己感兴趣或者需要的地方,也给他们参加各项活动带来了诸多不便。根据校园学生学习和生活需求,设计出如下功能:

(1)热点搜索:标注出有关你输入关键字的所有地点,点击标注,弹出这个标注点的详情。

(2)路线规划:在杭州市内,输入你的起点和终点,根据交通工具会提供三种想要的路线规划。分别为驾车路线,公交路线和步行路线。

(3)公交查询:输入杭州市内的公交号,可以查到此公交路线上所有的公交站台。

(4)室外定位:显示当前所在的位置。

(5)杭电校园:点击会出现杭州电子科技大学的校园全景图。

(6)校园路线规划:在校园内输入起点、终点,会给出一个规划步行路线图。

(7)生活区域:杭电本科生生活区的生活要素搜索和周边定位功能。

(8)研究生公寓:研究生生活区的生活要素搜索周边定位功能。

系统功能构架如图1所示。

2 功能的设计和实现

2.1 基础地图模块

LBS是当前流行的POI模式:位置信息点服务。其核心就是将线下的资源结合地理位置信息整合并发布到线上,为人们的生活提供服务[5]。基础地图功能模块顾名思义就是可以实现地图最基本的功能:

(1)热点搜索:用poi Search activity实现OnGetPoiSearchResultListener接口监听,获得搜索数据,而且会把数据显示在地图上。以搜索高沙为例,如图2所示。

(2)公交路线查询:当我们坐上公交车后不知道离目的地有几站路,可以将OnGetBusLineSearchResultListener接口在Bus Search activity中实现。把从接口OnGetBusLineSearchResultListener中得到的数据以BusLineOverlay形式覆盖到Map view中。以搜索8路公交车为例,如图3所示。

(3)路线规划:路线规划功能提供三种路线参考:自驾路线,公交路线和步行路线。具体是实现OnGetRoutePlanResultListener接口,并从中获得规划的结果。文泽路到西湖景区公交查询路线规划结果如图4所示。

(4) 定位功能:如图4所示的定位功能调用GPS设备对当前位置定位,在程序上通过实现 PoiSearch.newInstance(),并设置OnGetPoiSearchResultListener监听,开启定位服务向百度定位服务器发送请求获得用户所在的位置信息,此时用户可以清晰地看到自己在哪儿,如图5所示。

图1 系统应用的框架图

图2 搜索杭州高沙的结果 图3 8路公交查询结果

2.2 智能校园

智能校园是本GIS应用设计的主要功能。主要分为杭电全景图、校内路线规划、校园热点搜索、本科生活区服务和研究生生活区服务等内容。提供的小区域范围内LBS服务,是现在地图软件所达不到的效果。此功能模块首先由一个list view来显示功能列表,点击相应的功能列表选项,会跳转到相应的activity中去。并响应想要的功能。

图4 路线规划结果 图5 定位结果

2.2.1 杭电校园和校园路线规划

杭电校园此功能是显示杭州电子科技大学的全景图,分为卫星地图和普通地图两种,如图6所示。当学校里的老师、学生或者外来人员在校园某处却想去校园里的其它地点,而两地间的距离较近时,可以选择步行到达目的地[6]。校园步行路线规划在实现时,过程主要分为两步:一是输入框加载内容的实现:采用AutoCompleteTextView这个自动补全控件。此控件通过setAdapter(sugAdapter)语句,把AutoCompleteTextView提示内容和已经设计好的sugAdapter适配器相结合。当用户输入一个字时,AutoCompleteTextView会扫描sugAdapter适配器的内容,并把得到的相关内容以listview的形式显示出来供用户选择。二是获取输入的关键字之间的路线图:这里用到步行规划监听,并从onGetWalkingRouteResult接口中得到结果。以杭电体育馆到杭电电子信息学院为例,如图7所示。图8所示为校园路线规划搜索逻辑图。

图6 校园全景图 图7 校内路线规划结果

2.2.2 校园热点搜索

杭州电子科技大学校园内的建筑物、学院、办事行政机构、体育场所等POI繁多,不同的地点有各自相关的位置信息,通过访问服务器或者应用本地数据获得这些信息。

图8 路线规划逻辑图

利用语句String string = keyWorldsView.getText ().toString()获得输入的热点名关键字,从数据库中获得此关键字的经纬度。得到的经纬度坐标保存在变量latlng中,用此经纬度坐标再进行标注操作。校园POI查询功能在输入热点关键字时有两种方式,分别是列表视图加载校园POI选择输入和搜索栏模糊查询输入。用户输入兴趣点关键字或者关键字首字,结果将显示在列表视图上,选择对应兴趣点名称,完成搜索任务,POI的具体位置以地图标注的形式显示,点击标注弹出的气泡视图呈现POI的基本位置信息。查询操作流程如图9所示。

图9 查询操作流程图

此热点以搜索电子信息学院为例,图10所示为列表选中方式,图11所示为模糊搜索匹配输入。

2.2.3 本科生活区

本科生活区功能是针对学生在本科生活区和附近的服务,此功能模块提供了学生生活区宿舍楼,ATM机,学生食堂,后勤部等服务点的查询与定位。单独用一个activity显示生活要素列表。并设置点击事件,当用户点击“生活区要素”时会调用语句:

Intent intent =new Intent(Dormitory.this,LifeKEY.class);

startActivityForResult(intent, 0);

图10 列表选中方式图 图11 模糊搜索匹配输入

跳转到生活区要素的列表,列表是用可展开列表组件ExpandableList实现。在列表中设置点击列表项事件监听。当选中想要的要素,会把热点的名字传回原来的Activity中,利用此点击的内容,把想要的要素以标注的形式添加到地图上。同时也提供以生活区为中心的周边搜索功能,点击“生活区周边”按钮,会调用一个LinearLayout布局,用来显示输入窗口。根据提示用户输入搜索半径,接着兴趣点的名称,点击“搜索”会调回一个button监听事件,响应 mPoiSearch.searchNearby方法,得到想要的周边结果。图12为搜索生活区3幢宿舍楼显示图,图13为在周边搜索生活区附近1 000米的肯德基页面显示图。

图12 搜索生活区3幢 图13 在周边搜索生活区附近

宿舍楼显示图 1 000米的肯德基页面显示图

2.2.4 研究生公寓

此功能模块是针对研究生提供的服务,杭电研究生宿舍离教学区比较远,所以单独为一个功能,此模块功能包括两个方面:一是研究生公寓内的宿舍楼,食堂的查询。二是宿舍楼周边搜索。由于研究生公寓要素不是很多,再此用Spinner控件显示要素列表。而且给每个列表项添加监听事件,具体代码如下:

mySpinner.setOnItemSelectedListener{

@Override

public void onItemSelected(AdapterView<?> arg0, View arg1,

int arg2, long arg3) {

}

}

当我们点击Spinner控件中的要素时,会从数据库中获得相应的经纬度坐标。此功能的界面与本科生活区类似。应用结果如图14、15所示。图14为研究生宿舍33幢界面显示图,图15为搜索研究生1 000米内的建设银行界面显示图。

图14 搜索研究生宿舍33幢楼 图15 搜索研究生宿舍

1 000米内的建设银行

2.2.5 SQLite数据库

SQLite是轻量级的数据库,专门用于手机,Pad等存储资源有限的设备上。此应用中建立了一个拥有热点名称、热点经度和热点纬度等字段的数据库,具体程序如下:

public void onCreate(SQLiteDatabase arg0) {

arg0.execSQL(“CREATE TABLE IF NOT EXISTS db_position (positionId TEXT PRIMARY KEY NOT NULL ,”+ “positionName TEXT,longitude double,latitude double)”);

与此同时建立Position类来存取相应的位置坐标。在Position类中设置三个属性:positionName,longitude ,latitude。此类用于存放位置点信息。Position类的对象用来存储生活区宿舍楼。部分代码如下:

Position position16=new Position(UUID.randomUUID().toString(),”电子科技大学生活区3栋”,120.349265,30.322314);

Position position17=new Position(UUID.randomUUID().toString(),”电子科技大学生活区4栋”,120.348613,30.322275);

Position position18=new Position(UUID.randomUUID().toString(),”电子科技大学生活区5栋”,120.350141,30.322719);

Position position19=new Position(UUID.randomUUID().toString(),”电子科技大学生活区6栋”,120.34939,30.322692);

Position position20=new Position(UUID.randomUUID().toString(),”电子科技大学生活区7栋”,120.348474,30.323031);

Position position21=new Position(UUID.randomUUID().toString(),”电子科技大学生活区10栋”,120.350141,30.323756);

Position position22=new Position(UUID.randomUUID().toString(),”电子科技大学生活区11栋”,120.349377,30.323733);

Position position23=new Position(UUID.randomUUID().toString(),”电子科技大学生活区12栋”,120.348636,30.323709);

Position position24=new Position(UUID.randomUUID().toString(),”电子科技大学生活区22栋”,120.34785,30.323709);

Position position25=new Position(UUID.randomUUID().toString(),”电子科技大学生活区27栋”,120.351834,30.322376);

Position position26=new Position(UUID.randomUUID().toString(),”电子科技大学生活区28栋”,120.351793,30.322782);

通过数据库操作语句execSQL,把已经存好的position点加入到数据库中,具体程序如下:

dbWriterDatabase.execSQL(“INSERT INTO db_position (positionId,positionName,longitude,

latitude) values (?,?,?,?)”, New Object[]{position.getPositionId(),position.getPositionName(),

position.getLongitude(),position.getLatitude()});

System.out.println(“数据已写入”);

数据库建立成功,并且每个热点的信息加入数据库后,就可以用queryDbPosition方法根据热点名称取得相应的经纬度。queryDbPosition方法的具体代码如下:

public LatLng queryDbPosition(String positionName ){

LatLng latLng=null;

try {

Cursor cursor= dbWriterDatabase.rawQuery(“select * from db_position where positionName=? “, new String[]{positionName});

if (cursor.moveToNext()) {

String PositionIdString=cursor.getString(0);

System.out.println(“PositionIdString”+ PositionIdString);

double longitude=cursor.getDouble(2);

System.out.println(“longitude”+longitude);

double latitude=cursor.getDouble(3);

System.out.println(“latitude”+latitude);

latLng=new LatLng(latitude, longitude);

}

cursor.close();

} catch (Exception e) {

}

return latLng;

}

3 结 语

为了解决百度地图在小区域内不能提供有针对性的服务的问题,通过对Android 系统中的定位技术和方法进行研究,对Baidu Map进行了二次开发,设计并实现了一个校园LBS 系统。测试结果表明,该系统的各个功能模块能够满足校园学生对LBS 的基本要求,但仍需要在以下几个方面进行研究:

(1)可以添加杭电官方微博到应用中去;

(2)定时发布学校的讲座信息和校园新闻;

(3) 扩展使用WiFi 的定位方式,在校园内部使用无线定位将会更受欢迎;

(4)完善周边好友查询功能,要使系统能够查看周边好友位置和移动轨迹,这样就会根据好友的位置来与身边的好友联系,教师也可以利用该项功能查看学生的出勤情况和兴趣场所。

参考文献

[1] Kang-tsung Chang .地理信息系统导论(第七版)[M].陈健飞,连莲,译.北京:电子工业出版社,2014:3-4.

[2] 张克平.LTE/LTE-Advanced—B3G/4G/B4G移动通信系统无线技术[M].北京:电子工业出版社,2013:28-30.

[3] 王崇倡,苏存英.基于移动GIS的公共设施巡查系统的设计与实现[J].测绘科学,2011,36(6):88-90.

[4] 陈晓军,刘春,裴洪雨.基于移动GIS的数字城管数据采集系统架构与实现[J].铁道勘察,2009(4):62-66.

[5] 赵江玲.基于手机的位置服务研究与应用[D].成都:电子科技大学,2010:45-50.

[6] Li Fang, Li Xialei, Bian Fuling.A Framework for Autonomous LBS in Wireless Pervasive Computing Environments[J]. Proceedings of the 9th International Conference on Advanced Communication Technology,2007(3):1715-1720.

猜你喜欢

Android平台
基于Android平台软件开发技术研究
基于Android平台的家用无线防盗报警系统研究