APP下载

基于Google Android平台手机局域地图的实现

2014-04-18杨武年

地理空间信息 2014年5期
关键词:电子地图控件定位

郭 瑾,杨武年,易 鹏

(1.成都理工大学 地学空间信息技术国土资源部重点实验室,四川 成都 610059;2.成都理工大学 遥感与GIS研究所,四川 成都 610059)

基于Google Android平台手机局域地图的实现

郭 瑾1,2,杨武年1,2,易 鹏1,2

(1.成都理工大学 地学空间信息技术国土资源部重点实验室,四川 成都 610059;2.成都理工大学 遥感与GIS研究所,四川 成都 610059)

分析局域环境下的个人生活需求,在Google网络数据库和本地数据库上进行功能设计,提出加密本地数据和制作以个体应用为中心的局域专题地图的方法,实现手机地图的一般功能,并提供关键代码。系统对用户的机动性要求不高,适合个人应用,能让新进用户快速融入环境。

Google;Android;KML;电子地图;查询;定位

目前,各种载体的电子地图已十分普及,但市面上的绝大多数电子地图都运用于车载电子或者行车线路查询,相较于车辆来说,人的机动性不够快捷,能动范围不够广阔,人类活动方向往往不能够及时反映在电子地图之上,同时也由于地图标注的不详尽和地理环境的不熟悉,人们使用电子地图时仍有不明方向的感觉。基于Google Android平台手机局域电子地图就是针对这一点进行设计,使之适合人类个体非机动的相关活动。本系统的制作理念就是在现有卫星影像和矢量地图的基础之上,以熟悉某区域的导游视线为出发点,制作详细的区域电子地图,然后将其与该区域的卫星影像图进行完全覆盖,在这样的数据基础上进行以人类个体行动需求为指导的功能设计,让个体在使用本系统时有如向导在侧的体验。

1 基于Google Android平台手机地图的系统架构

1.1 Google Android平台

Android是一种基于Linux的开放源代码的操作系统[1],主要分为3部分:①底层以Linux核心为基础,由C语言开发,提供基本功能;②中间层包括函数库Library和虚拟机Virtual Machine,由C++开发;③最上层是各种应用软件,由各公司自行开发,以JAVA编写[2]。

本实验开发基于Google Android平台结合Android SDK和Eclipse插件,通过安装JDK→Eclipse→Eclipse插件ADT→Android SDK搭建 Google Android开发平台,应用JAVA语言进行开发[3]。

1.2 手机电子地图架构

手机电子地图一般通过三层架构工作,分别是数据层、中间层和表示层。由数据层提供地图、路径、标注等基础数据;中间层负责连接数据层与表示层并提供功能设计和数据调用、处理方式;表示层是软件与用户的交流平台,是显示数据处理结果的窗口[4]。本实验利用Android系统手机为表示层,Google Map和Android操作系统为中间层,Google网络数据库、GPS信息、通信信息以及添加数据为数据层进行框架的构建(如图1)。

图1 手机电子地图结构框架

Google Map网络服务器提供开放式接口Google Map API供用户调用其网络数据,通过GPRS/Internet建立于Google Map间的通行,调用它的GIS数据库[5]。对于本地数据系统采用实地采集、网络绘制的方式进行添加,同时利用GPS卫星信号进行定位获取本地地理信息。

2 系统设计

2.1 数据库建立

实验数据主要由3部分组成:Google Map网络数据、GPS定位数据和本地加密数据。数据主要包括点、线、面等图形数据以及地名、坐标等物理数据。基本地图影像来自Google网络GIS,保留其部分点位信息,对于偏移较大和不详细的信息采用KML文件进行扩充,通过文件储存方式加载到手机存储设备,将文件唯一命名,方便调用。

2.1.1 Google Map网络数据

通过获取Google Maps API来调用Google Map网络数据,首先需要申请Google Maps API Key,生成Google Maps API Key要使用2种工具:JDK的Keytool和Android debug模式下的Keystore密钥库[6],本系统采用第一种方式。

在Eclipse→file→new下新建的工程Google_Map下,将获取的Google Maps API Key添加在布局文件main.xml:

Android:apiKey="0G7MFkkJ9COpfKvsJ0N7w7A Rc_9-zsekXgB0PxQ"

在activity里编写一段简单代码,要求能调用和控制Google Map[7]:

public class Google_MapActivity extends MapActivity

{linearLayout = (LinearLayout) findViewById(R.id.zoomview);

mapView = (MapView) findViewById(R.id.mapview);

m Z o o m = (Z o o m C o n t r o l s) m a p V i e w.getZoomControls();

linearLayout.addView(mZoom);}

2.1.2 GPS定位数据

Android设备既提供传统的 GPS 定位系统,又提供A-GPS定位方式。A-GPS 是一种结合了网络基站信息和 GPS 信息对移动台进行定位的技术,可以在 GSM/ GPRS、WCDMA 和CDMA2000 网络中使用。在该设计中,使用嵌入式关系型数据库 SQLite3 来存储和更新采集点信息,大小只有几KB,但功能十分完善,拥有大部分关系型数据库共有的特征,可移植性强,数据导出方便[8]。

2.1.3 本地数据

本地数据主要由Google Earth生成的KML图形文件组成,将文件唯一命名方便调用。本实验的KML文件由笔者实地调查后在Google Earth上添加,包括实验区地物点点位选取,各种办公、生活区域面状覆盖,以及道路、区域分化等线状信息,同时也对部分建筑或场所进行文字描述。将所有信息进行分类方便提取和查看,形成运动场所、办公区域、教学区域、生活区域各为一体的模块(如图2)。

图2 Google Earth上绘制的KML文件

工程文件下的res文件夹提供了一个缓存文件row文件夹,如果没有自己创建一个。这里可以储存自己的数据文件,程序不会把它编译成二进制代码。把经纬度以及名称按键值对存取该文件的数据进行提取,并在地图上进行操作。

加载KML图形文件时对每一个地物分配合适的字段长度,要足够包含该区域内编辑相应的属性和介绍,但也不能过长,那会导致空间冗余,为手机存储设备带来不必要的负担,也会延缓调用和显示速度。编辑调用时只需写入提取一定的字段长度,在这个字段内包含了地名、位置等相关信息,查询到该部分内容时将内部信息以文字和图形形式显示于屏幕[9]。

2.2 界面设计

在Activity中使用View和ViewGroup控件配XML样式来进行界面设计,使用事件处理进行人机交互,主要的事件处理为按钮事件、触屏事件以及一些高级控件的事件监听。通过设置控件与事件处理就形成了UI界面,手机地图的用户界面一般由一个或多个UI控件组成,用户界面及UI控件以XML的形式描述[10]。

系统界面主要内容包括:地图显示区、图层控制区、选择列表查询区。地图显示区是网络地图界面中最主要的区域,是对实验区最直观的展示,各种操作的大量结果都显示在此区域中,包括地图缩放、平移等各种控件,为用户提供基本操作与查看;另外在地图的上方还添加了搜索条,便于用户进行地点查询。选择列表查询区是通过提供给用户一些可选择的地点,进而方便用户在未知某些地点信息的时候可以通过选择已有选项进行查看。图层控制区用于对专题图层进行控制,卫星视图、矢量视图以及加密图层的显示可在这里控制。图3是卫星视图情况下对地名为“六教”的选择结果和定位。

图3 应用示例

2.2.1 按键设置

根据用户需求和地图功能,添加一些按钮,并编写JAVA文件,设置事件监听,通过按钮实现放大缩小功能。通过togglebutton实现卫星视图与地图的切换,按钮控制用setonclicklistenner()方法添加。

2.2.2 GPS定位信息的显示

通过TextView控件显示定位信息,在程序打开时显示目前用户的具体位置。利用手机GPS进行定位,并在地图上方显示经纬度等定位信息,若GPS定位不成功或者出错,则显示“无法获取目前地址”。

2.2.3 编辑框功能的实现

1)获取编辑框内容:editText.getText().toString();

2)通过main.xml布局文件,在编辑框内添加一个按钮,并在JAVA文件编写相应代码,设置事件监听,当点击按钮时,获取该单击事件,获取编辑框内容,以执行相应操作。

2.3 功能设计

2.3.1 设置主界面

首先进行界面布局,在显示界面设计添加一些功能按钮,并编写java文件,设置事件监听,以布置按钮实现放大缩小、视图切换、查询等功能。

实现缩放主要代码[11]:case R.id.in: /*缩小*/

ctrlMap.zoomIn();

case R.id.out: /*放大*/

ctrlMap.zoomOut();

2.3.2 导入本地数据

前文已经提到将加密数据添加到工程文件下的res文件夹,现在要做的就是将这个文件夹里的内容读取并显示到界面。主要代码如下:

public static HashMap<String,GeoPoint> addMyData(InputStream inputStream) {

InputStreamReader inputStreamReader = null;

String line; //判断是否到文件末尾

String name; //位置点名称

int longitude,latitude;

GeoPoint point;

HashMap<String,GeoPoint> map=new HashMap<String, GeoPoint>();

try {inputStreamReader = new InputStreamReader(in putStream,"gbk"); }

catch (UnsupportedEncodingException e1) {e1.printStackTrace(); }

BufferedReader reader = new BufferedReader(inputSt reamReader);

try {while ((line=reader.readLine()) != null)

{ latitude=(int)(Double.parseDouble(line.substring(9, 18))*1E6);

longitude=(int)(Double.parseDouble(line.substring(21, 31))*1E6);

point=new GeoPoint(latitude,longitude);

name=line.substring(42, 44);

map.put(name, point); }

} catch (IOException e) {e.printStackTrace();}

2.3.3 查 询

当用户输入某一地名时,图上会显示该地名所在位置,查询功能具体通过网络通信来实现,Google Map提供了该数据库的接口。接口地址:http:// Map.Google.com/Map/api/geocode/json?address= ka&sensor=false。具体实现代码如下:

通过HTTP协议获取Google Map网络数据

HttpGet httpGet = new HttpGet("http://Map.Google."

+"com/Map/api/geocode/json?address="+address+ "ka&sensor=false");

根据客户端的查询语句从网络数据库获取回答

response = client.execute(httpGet);

HttpEntity entity = response.getEntity();

InputStream stream = entity.getContent();

2.3.4 添加图标图层

显示位置需要地图图标。将图标添加到想要添加的位置,例如当查询到一个位置时,在该位置添加图标,并将它显示在当前位置,如图3中标注查询结果的蓝色气球,具体情况通过编写代码实现。首先得通过mapview.getController()方法控制整张地图,才能对其进行操作。主要代码如下[12]:

Private void addMyMarker(GeoPoint point,String query) {

mapview.setBuiltInZoomControls(true);

List mapOverlays = mapview.getOverlays();

Drawable drawable=this.getResources().getDrawable(R.drawable.ic);

M a k e r O v e r l a y i t e m i z e d O v e r l a y =n e w MakerOverlay(drawable, this);

OverlayItem overlayitem =new OverlayItem(point, "纬 度 "+point.getLatitudeE6()+",经 度 "+point.getLongitudeE6(), query);

2.3.5 定位服务

通过GPS获取当前所在经纬度,并实时更新。主要代码如下[13]:

String provider = locationManager.GPS_PROVIDER;

Location location = locationManager.getLastKnownLocation(provider);

updateWithNewLocation(location);

locationManager.requestLocationUpdates(provider200 0,10,locationListener);

在空旷地带,获取卫星信号,会显示当前位置。

2.3.6 导入真机测试

安装usb驱动,使电脑与手机相连并控制手机;获取手机的root权限,才能对系统文件进行编辑;执行chmod 777/system 取得系统文件编辑的权限;导入手机没有的jar包,如com.google.android.maps.jar等,并在/system/etc/permissons文件夹下的platform.xml里面编辑相应的权限;运行Android工程文件,测试效果。图4为测试的定位结果,与真实点偏差1 m左右。

图4 定 位

3 结 语

本文所设计系统的优点为:通过多个查询标识和GPS定位,在加密地图上用户可以通过多点定位确定位置和方向,不会出现因为机动性不够,导航标识不能及时指示方向的情况;加密后的地图可以让用户对区域进行详细查看,能够很好地满足居住、购物、生活等应用目的;区域地图的数据量较小,对手机储存不会造成较大的负担;地图和程序均可以封装打包,比较适合园区、景点应用。不足之处有:数据过密导致节点增多,给路径运算造成负担,计算难度增加;定位数据依赖手机GPS定位信息,定位误差会直接反应在电子地图上,在小范围内1~2 m的定位误差也会带来较大的影响。

[1] 鄢军霞,周焰.基于Google Android平台的移动开发初探[J].硅谷,2012(15):31-58

[2] 吴雁鸣.基于Android手机的人员定位与管理系统[J].电子制作,2013(5): 110-111

[3] 陈昱,江兰帆.基于Google Android平台的移动开发研究[J].福建电脑,2008(11):156-157

[4] 覃婕,韦波,黄俊华.Java手机地图服务系统研究与实现[J].地理空间信息,2008,6(6):73-75

[5] 李沛鸿,白东强,李营营.基于 Android 的 WebGIS 地理定位服务[J].地理空间信息,2012,10(6):59-61

[6] 中华文本库.申请android google map API key[EB/OL].http://www.chinadmd.com/file/eia3zrtrwwriotcxezpaaiu3_1.html, 2013-11-25

[7] 孙成,何光禹,蔡海峰.基于J2ME技术的电子地图的设计[C].第六届全国高等学校物理实验教学研讨会,2010

[8] 侯春良,张义文.基于Android平台的地理信息系统工具设计与开发[J].地理空间信息,2012,10(5):14-16

[9] 杜英俊,于重重,刘杰.基于KML开发的GIS系统研究与应用[J].计算机应用与软件,2010,10(27):49-51

[10] 孙晓宇.Android手机界面管理系统的设计与实现[D].北京:北京邮电大学,2009

[11] 王锐君.县域地理空间信息平台电子地图发布与共享的方法[J].遥感技术与应用,2011,10(5):598-603

[12] 庞国明.网站开发之 Google 地图的应用[J].电脑编程技巧与维护,2013(1):67-70

[13] 周颖颖.基于Android平台的手机地图系统的实现[J].现代计算机,2013,22(8):74-76

P208

B

1672-4623(2014)05-0158-04

10.3969/j.issn.1672-4623.2014.05.058

郭瑾,硕士,研究方向为测绘工程。

2013-12-02。

项目来源:国家自然科学基金资助项目(41071265); 高等学校博士学科点专项科研基金资助项目(20105122110006)。

猜你喜欢

电子地图控件定位
基于.net的用户定义验证控件的应用分析
《导航定位与授时》征稿简则
基于灵活编组的互联互通车载电子地图设计及动态加载
Smartrail4.0定位和控制
关于.net控件数组的探讨
找准定位 砥砺前行
青年择业要有准确定位
电子地图在初中地理教学中的应用实践
天地图·驻马店公众版电子地图配图方案
电子地图多尺度显示模型研究