郭 瑾,楊武年,易 鵬
(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.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.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 定 位
本文所設計系統的優點為:通過多個查詢標識和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)。