郭 瑾,楊武年,易 鵬
(1.成都理工大學(xué) 地學(xué)空間信息技術(shù)國(guó)土資源部重點(diǎn)實(shí)驗(yàn)室,四川 成都 610059;2.成都理工大學(xué) 遙感與GIS研究所,四川 成都 610059)
基于Google Android平臺(tái)手機(jī)局域地圖的實(shí)現(xiàn)
郭 瑾1,2,楊武年1,2,易 鵬1,2
(1.成都理工大學(xué) 地學(xué)空間信息技術(shù)國(guó)土資源部重點(diǎn)實(shí)驗(yàn)室,四川 成都 610059;2.成都理工大學(xué) 遙感與GIS研究所,四川 成都 610059)
分析局域環(huán)境下的個(gè)人生活需求,在Google網(wǎng)絡(luò)數(shù)據(jù)庫(kù)和本地?cái)?shù)據(jù)庫(kù)上進(jìn)行功能設(shè)計(jì),提出加密本地?cái)?shù)據(jù)和制作以個(gè)體應(yīng)用為中心的局域?qū)n}地圖的方法,實(shí)現(xiàn)手機(jī)地圖的一般功能,并提供關(guān)鍵代碼。系統(tǒng)對(duì)用戶的機(jī)動(dòng)性要求不高,適合個(gè)人應(yīng)用,能讓新進(jìn)用戶快速融入環(huán)境。
Google;Android;KML;電子地圖;查詢;定位
目前,各種載體的電子地圖已十分普及,但市面上的絕大多數(shù)電子地圖都運(yùn)用于車(chē)載電子或者行車(chē)線路查詢,相較于車(chē)輛來(lái)說(shuō),人的機(jī)動(dòng)性不夠快捷,能動(dòng)范圍不夠廣闊,人類(lèi)活動(dòng)方向往往不能夠及時(shí)反映在電子地圖之上,同時(shí)也由于地圖標(biāo)注的不詳盡和地理環(huán)境的不熟悉,人們使用電子地圖時(shí)仍有不明方向的感覺(jué)?;贕oogle Android平臺(tái)手機(jī)局域電子地圖就是針對(duì)這一點(diǎn)進(jìn)行設(shè)計(jì),使之適合人類(lèi)個(gè)體非機(jī)動(dòng)的相關(guān)活動(dòng)。本系統(tǒng)的制作理念就是在現(xiàn)有衛(wèi)星影像和矢量地圖的基礎(chǔ)之上,以熟悉某區(qū)域的導(dǎo)游視線為出發(fā)點(diǎn),制作詳細(xì)的區(qū)域電子地圖,然后將其與該區(qū)域的衛(wèi)星影像圖進(jìn)行完全覆蓋,在這樣的數(shù)據(jù)基礎(chǔ)上進(jìn)行以人類(lèi)個(gè)體行動(dòng)需求為指導(dǎo)的功能設(shè)計(jì),讓個(gè)體在使用本系統(tǒng)時(shí)有如向?qū)г趥?cè)的體驗(yàn)。
1.1 Google Android平臺(tái)
Android是一種基于Linux的開(kāi)放源代碼的操作系統(tǒng)[1],主要分為3部分:①底層以Linux核心為基礎(chǔ),由C語(yǔ)言開(kāi)發(fā),提供基本功能;②中間層包括函數(shù)庫(kù)Library和虛擬機(jī)Virtual Machine,由C++開(kāi)發(fā);③最上層是各種應(yīng)用軟件,由各公司自行開(kāi)發(fā),以JAVA編寫(xiě)[2]。
本實(shí)驗(yàn)開(kāi)發(fā)基于Google Android平臺(tái)結(jié)合Android SDK和Eclipse插件,通過(guò)安裝JDK→Eclipse→Eclipse插件ADT→Android SDK搭建 Google Android開(kāi)發(fā)平臺(tái),應(yīng)用JAVA語(yǔ)言進(jìn)行開(kāi)發(fā)[3]。
1.2 手機(jī)電子地圖架構(gòu)
手機(jī)電子地圖一般通過(guò)三層架構(gòu)工作,分別是數(shù)據(jù)層、中間層和表示層。由數(shù)據(jù)層提供地圖、路徑、標(biāo)注等基礎(chǔ)數(shù)據(jù);中間層負(fù)責(zé)連接數(shù)據(jù)層與表示層并提供功能設(shè)計(jì)和數(shù)據(jù)調(diào)用、處理方式;表示層是軟件與用戶的交流平臺(tái),是顯示數(shù)據(jù)處理結(jié)果的窗口[4]。本實(shí)驗(yàn)利用Android系統(tǒng)手機(jī)為表示層,Google Map和Android操作系統(tǒng)為中間層,Google網(wǎng)絡(luò)數(shù)據(jù)庫(kù)、GPS信息、通信信息以及添加數(shù)據(jù)為數(shù)據(jù)層進(jìn)行框架的構(gòu)建(如圖1)。
圖1 手機(jī)電子地圖結(jié)構(gòu)框架
Google Map網(wǎng)絡(luò)服務(wù)器提供開(kāi)放式接口Google Map API供用戶調(diào)用其網(wǎng)絡(luò)數(shù)據(jù),通過(guò)GPRS/Internet建立于Google Map間的通行,調(diào)用它的GIS數(shù)據(jù)庫(kù)[5]。對(duì)于本地?cái)?shù)據(jù)系統(tǒng)采用實(shí)地采集、網(wǎng)絡(luò)繪制的方式進(jìn)行添加,同時(shí)利用GPS衛(wèi)星信號(hào)進(jìn)行定位獲取本地地理信息。
2.1 數(shù)據(jù)庫(kù)建立
實(shí)驗(yàn)數(shù)據(jù)主要由3部分組成:Google Map網(wǎng)絡(luò)數(shù)據(jù)、GPS定位數(shù)據(jù)和本地加密數(shù)據(jù)。數(shù)據(jù)主要包括點(diǎn)、線、面等圖形數(shù)據(jù)以及地名、坐標(biāo)等物理數(shù)據(jù)?;镜貓D影像來(lái)自Google網(wǎng)絡(luò)GIS,保留其部分點(diǎn)位信息,對(duì)于偏移較大和不詳細(xì)的信息采用KML文件進(jìn)行擴(kuò)充,通過(guò)文件儲(chǔ)存方式加載到手機(jī)存儲(chǔ)設(shè)備,將文件唯一命名,方便調(diào)用。
2.1.1 Google Map網(wǎng)絡(luò)數(shù)據(jù)
通過(guò)獲取Google Maps API來(lái)調(diào)用Google Map網(wǎng)絡(luò)數(shù)據(jù),首先需要申請(qǐng)Google Maps API Key,生成Google Maps API Key要使用2種工具:JDK的Keytool和Android debug模式下的Keystore密鑰庫(kù)[6],本系統(tǒng)采用第一種方式。
在Eclipse→file→new下新建的工程Google_Map下,將獲取的Google Maps API Key添加在布局文件main.xml:
Android:apiKey="0G7MFkkJ9COpfKvsJ0N7w7A Rc_9-zsekXgB0PxQ"
在activity里編寫(xiě)一段簡(jiǎn)單代碼,要求能調(diào)用和控制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.a(chǎn)ddView(mZoom);}
2.1.2 GPS定位數(shù)據(jù)
Android設(shè)備既提供傳統(tǒng)的 GPS 定位系統(tǒng),又提供A-GPS定位方式。A-GPS 是一種結(jié)合了網(wǎng)絡(luò)基站信息和 GPS 信息對(duì)移動(dòng)臺(tái)進(jìn)行定位的技術(shù),可以在 GSM/ GPRS、WCDMA 和CDMA2000 網(wǎng)絡(luò)中使用。在該設(shè)計(jì)中,使用嵌入式關(guān)系型數(shù)據(jù)庫(kù) SQLite3 來(lái)存儲(chǔ)和更新采集點(diǎn)信息,大小只有幾KB,但功能十分完善,擁有大部分關(guān)系型數(shù)據(jù)庫(kù)共有的特征,可移植性強(qiáng),數(shù)據(jù)導(dǎo)出方便[8]。
2.1.3 本地?cái)?shù)據(jù)
本地?cái)?shù)據(jù)主要由Google Earth生成的KML圖形文件組成,將文件唯一命名方便調(diào)用。本實(shí)驗(yàn)的KML文件由筆者實(shí)地調(diào)查后在Google Earth上添加,包括實(shí)驗(yàn)區(qū)地物點(diǎn)點(diǎn)位選取,各種辦公、生活區(qū)域面狀覆蓋,以及道路、區(qū)域分化等線狀信息,同時(shí)也對(duì)部分建筑或場(chǎng)所進(jìn)行文字描述。將所有信息進(jìn)行分類(lèi)方便提取和查看,形成運(yùn)動(dòng)場(chǎng)所、辦公區(qū)域、教學(xué)區(qū)域、生活區(qū)域各為一體的模塊(如圖2)。
圖2 Google Earth上繪制的KML文件
工程文件下的res文件夾提供了一個(gè)緩存文件row文件夾,如果沒(méi)有自己創(chuàng)建一個(gè)。這里可以儲(chǔ)存自己的數(shù)據(jù)文件,程序不會(huì)把它編譯成二進(jìn)制代碼。把經(jīng)緯度以及名稱按鍵值對(duì)存取該文件的數(shù)據(jù)進(jìn)行提取,并在地圖上進(jìn)行操作。
加載KML圖形文件時(shí)對(duì)每一個(gè)地物分配合適的字段長(zhǎng)度,要足夠包含該區(qū)域內(nèi)編輯相應(yīng)的屬性和介紹,但也不能過(guò)長(zhǎng),那會(huì)導(dǎo)致空間冗余,為手機(jī)存儲(chǔ)設(shè)備帶來(lái)不必要的負(fù)擔(dān),也會(huì)延緩調(diào)用和顯示速度。編輯調(diào)用時(shí)只需寫(xiě)入提取一定的字段長(zhǎng)度,在這個(gè)字段內(nèi)包含了地名、位置等相關(guān)信息,查詢到該部分內(nèi)容時(shí)將內(nèi)部信息以文字和圖形形式顯示于屏幕[9]。
2.2 界面設(shè)計(jì)
在Activity中使用View和ViewGroup控件配XML樣式來(lái)進(jìn)行界面設(shè)計(jì),使用事件處理進(jìn)行人機(jī)交互,主要的事件處理為按鈕事件、觸屏事件以及一些高級(jí)控件的事件監(jiān)聽(tīng)。通過(guò)設(shè)置控件與事件處理就形成了UI界面,手機(jī)地圖的用戶界面一般由一個(gè)或多個(gè)UI控件組成,用戶界面及UI控件以XML的形式描述[10]。
系統(tǒng)界面主要內(nèi)容包括:地圖顯示區(qū)、圖層控制區(qū)、選擇列表查詢區(qū)。地圖顯示區(qū)是網(wǎng)絡(luò)地圖界面中最主要的區(qū)域,是對(duì)實(shí)驗(yàn)區(qū)最直觀的展示,各種操作的大量結(jié)果都顯示在此區(qū)域中,包括地圖縮放、平移等各種控件,為用戶提供基本操作與查看;另外在地圖的上方還添加了搜索條,便于用戶進(jìn)行地點(diǎn)查詢。選擇列表查詢區(qū)是通過(guò)提供給用戶一些可選擇的地點(diǎn),進(jìn)而方便用戶在未知某些地點(diǎn)信息的時(shí)候可以通過(guò)選擇已有選項(xiàng)進(jìn)行查看。圖層控制區(qū)用于對(duì)專(zhuān)題圖層進(jìn)行控制,衛(wèi)星視圖、矢量視圖以及加密圖層的顯示可在這里控制。圖3是衛(wèi)星視圖情況下對(duì)地名為“六教”的選擇結(jié)果和定位。
圖3 應(yīng)用示例
2.2.1 按鍵設(shè)置
根據(jù)用戶需求和地圖功能,添加一些按鈕,并編寫(xiě)JAVA文件,設(shè)置事件監(jiān)聽(tīng),通過(guò)按鈕實(shí)現(xiàn)放大縮小功能。通過(guò)togglebutton實(shí)現(xiàn)衛(wèi)星視圖與地圖的切換,按鈕控制用setonclicklistenner()方法添加。
2.2.2 GPS定位信息的顯示
通過(guò)TextView控件顯示定位信息,在程序打開(kāi)時(shí)顯示目前用戶的具體位置。利用手機(jī)GPS進(jìn)行定位,并在地圖上方顯示經(jīng)緯度等定位信息,若GPS定位不成功或者出錯(cuò),則顯示“無(wú)法獲取目前地址”。
2.2.3 編輯框功能的實(shí)現(xiàn)
1)獲取編輯框內(nèi)容:editText.getText().toString();
2)通過(guò)main.xml布局文件,在編輯框內(nèi)添加一個(gè)按鈕,并在JAVA文件編寫(xiě)相應(yīng)代碼,設(shè)置事件監(jiān)聽(tīng),當(dāng)點(diǎn)擊按鈕時(shí),獲取該單擊事件,獲取編輯框內(nèi)容,以執(zhí)行相應(yīng)操作。
2.3 功能設(shè)計(jì)
2.3.1 設(shè)置主界面
首先進(jìn)行界面布局,在顯示界面設(shè)計(jì)添加一些功能按鈕,并編寫(xiě)java文件,設(shè)置事件監(jiān)聽(tīng),以布置按鈕實(shí)現(xiàn)放大縮小、視圖切換、查詢等功能。
實(shí)現(xiàn)縮放主要代碼[11]:case R.id.in: /*縮小*/
ctrlMap.zoomIn();
…
case R.id.out: /*放大*/
ctrlMap.zoomOut();
2.3.2 導(dǎo)入本地?cái)?shù)據(jù)
前文已經(jīng)提到將加密數(shù)據(jù)添加到工程文件下的res文件夾,現(xiàn)在要做的就是將這個(gè)文件夾里的內(nèi)容讀取并顯示到界面。主要代碼如下:
public static HashMap<String,GeoPoint> addMyData(InputStream inputStream) {
InputStreamReader inputStreamReader = null;
String line; //判斷是否到文件末尾
String name; //位置點(diǎn)名稱
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 查 詢
當(dāng)用戶輸入某一地名時(shí),圖上會(huì)顯示該地名所在位置,查詢功能具體通過(guò)網(wǎng)絡(luò)通信來(lái)實(shí)現(xiàn),Google Map提供了該數(shù)據(jù)庫(kù)的接口。接口地址:http:// Map.Google.com/Map/api/geocode/json?address= ka&sensor=false。具體實(shí)現(xiàn)代碼如下:
通過(guò)HTTP協(xié)議獲取Google Map網(wǎng)絡(luò)數(shù)據(jù)
HttpGet httpGet = new HttpGet("http://Map.Google."
+"com/Map/api/geocode/json?address="+address+ "ka&sensor=false");
根據(jù)客戶端的查詢語(yǔ)句從網(wǎng)絡(luò)數(shù)據(jù)庫(kù)獲取回答
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
2.3.4 添加圖標(biāo)圖層
顯示位置需要地圖圖標(biāo)。將圖標(biāo)添加到想要添加的位置,例如當(dāng)查詢到一個(gè)位置時(shí),在該位置添加圖標(biāo),并將它顯示在當(dāng)前位置,如圖3中標(biāo)注查詢結(jié)果的藍(lán)色氣球,具體情況通過(guò)編寫(xiě)代碼實(shí)現(xiàn)。首先得通過(guò)mapview.getController()方法控制整張地圖,才能對(duì)其進(jìn)行操作。主要代碼如下[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()+",經(jīng) 度 "+point.getLongitudeE6(), query);
2.3.5 定位服務(wù)
通過(guò)GPS獲取當(dāng)前所在經(jīng)緯度,并實(shí)時(shí)更新。主要代碼如下[13]:
String provider = locationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider200 0,10,locationListener);
在空曠地帶,獲取衛(wèi)星信號(hào),會(huì)顯示當(dāng)前位置。
2.3.6 導(dǎo)入真機(jī)測(cè)試
安裝usb驅(qū)動(dòng),使電腦與手機(jī)相連并控制手機(jī);獲取手機(jī)的root權(quán)限,才能對(duì)系統(tǒng)文件進(jìn)行編輯;執(zhí)行chmod 777/system 取得系統(tǒng)文件編輯的權(quán)限;導(dǎo)入手機(jī)沒(méi)有的jar包,如com.google.a(chǎn)ndroid.maps.jar等,并在/system/etc/permissons文件夾下的platform.xml里面編輯相應(yīng)的權(quán)限;運(yùn)行Android工程文件,測(cè)試效果。圖4為測(cè)試的定位結(jié)果,與真實(shí)點(diǎn)偏差1 m左右。
圖4 定 位
本文所設(shè)計(jì)系統(tǒng)的優(yōu)點(diǎn)為:通過(guò)多個(gè)查詢標(biāo)識(shí)和GPS定位,在加密地圖上用戶可以通過(guò)多點(diǎn)定位確定位置和方向,不會(huì)出現(xiàn)因?yàn)闄C(jī)動(dòng)性不夠,導(dǎo)航標(biāo)識(shí)不能及時(shí)指示方向的情況;加密后的地圖可以讓用戶對(duì)區(qū)域進(jìn)行詳細(xì)查看,能夠很好地滿足居住、購(gòu)物、生活等應(yīng)用目的;區(qū)域地圖的數(shù)據(jù)量較小,對(duì)手機(jī)儲(chǔ)存不會(huì)造成較大的負(fù)擔(dān);地圖和程序均可以封裝打包,比較適合園區(qū)、景點(diǎn)應(yīng)用。不足之處有:數(shù)據(jù)過(guò)密導(dǎo)致節(jié)點(diǎn)增多,給路徑運(yùn)算造成負(fù)擔(dān),計(jì)算難度增加;定位數(shù)據(jù)依賴手機(jī)GPS定位信息,定位誤差會(huì)直接反應(yīng)在電子地圖上,在小范圍內(nèi)1~2 m的定位誤差也會(huì)帶來(lái)較大的影響。
[1] 鄢軍霞,周焰.基于Google Android平臺(tái)的移動(dòng)開(kāi)發(fā)初探[J].硅谷,2012(15):31-58
[2] 吳雁鳴.基于Android手機(jī)的人員定位與管理系統(tǒng)[J].電子制作,2013(5): 110-111
[3] 陳昱,江蘭帆.基于Google Android平臺(tái)的移動(dòng)開(kāi)發(fā)研究[J].福建電腦,2008(11):156-157
[4] 覃婕,韋波,黃俊華.Java手機(jī)地圖服務(wù)系統(tǒng)研究與實(shí)現(xiàn)[J].地理空間信息,2008,6(6):73-75
[5] 李沛鴻,白東強(qiáng),李營(yíng)營(yíng).基于 Android 的 WebGIS 地理定位服務(wù)[J].地理空間信息,2012,10(6):59-61
[6] 中華文本庫(kù).申請(qǐng)android google map API key[EB/OL].http://www.chinadmd.com/file/eia3zrtrwwriotcxezpaaiu3_1.html, 2013-11-25
[7] 孫成,何光禹,蔡海峰.基于J2ME技術(shù)的電子地圖的設(shè)計(jì)[C].第六屆全國(guó)高等學(xué)校物理實(shí)驗(yàn)教學(xué)研討會(huì),2010
[8] 侯春良,張義文.基于Android平臺(tái)的地理信息系統(tǒng)工具設(shè)計(jì)與開(kāi)發(fā)[J].地理空間信息,2012,10(5):14-16
[9] 杜英俊,于重重,劉杰.基于KML開(kāi)發(fā)的GIS系統(tǒng)研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2010,10(27):49-51
[10] 孫曉宇.Android手機(jī)界面管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2009
[11] 王銳君.縣域地理空間信息平臺(tái)電子地圖發(fā)布與共享的方法[J].遙感技術(shù)與應(yīng)用,2011,10(5):598-603
[12] 龐國(guó)明.網(wǎng)站開(kāi)發(fā)之 Google 地圖的應(yīng)用[J].電腦編程技巧與維護(hù),2013(1):67-70
[13] 周穎穎.基于Android平臺(tái)的手機(jī)地圖系統(tǒng)的實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2013,22(8):74-76
P208
B
1672-4623(2014)05-0158-04
10.3969/j.issn.1672-4623.2014.05.058
郭瑾,碩士,研究方向?yàn)闇y(cè)繪工程。
2013-12-02。
項(xiàng)目來(lái)源:國(guó)家自然科學(xué)基金資助項(xiàng)目(41071265); 高等學(xué)校博士學(xué)科點(diǎn)專(zhuān)項(xiàng)科研基金資助項(xiàng)目(20105122110006)。