安志宏,高宇飛
(衡水學院 數(shù)學與計算機科學學院,河北 衡水 053000)
隨著移動終端技術及手機硬件的發(fā)展,智能手機已成為人們生活的重要組成部分.目前,市場占有率最大的當屬Android及IOS平臺.從2002到2007幾年內(nèi),可以說是塞班的天下.而自Android1.1發(fā)布以來,Android以其開源性,迅速占領了手機市場的半壁江山.Android平臺無論從接口,還是功能上,都有很強的優(yōu)勢.而在價格上,Android手機卻比IOS的蘋果手機低廉得多,使得蘋果手機似乎成為了一種高消費的奢侈品.在國內(nèi),Android手機更是占到了智能機市場 90 %的份額.傳統(tǒng)的以紙質(zhì)地圖來人工導航的方式就顯得格格不入.紙質(zhì)地圖不能更新,容易磨損,攜帶不便,在使用時有很大的不便.地圖科技化、自動化已成為相關產(chǎn)品發(fā)展的必然趨勢,將地圖融入Android,不僅使用簡單,而且還實現(xiàn)了智能導航,省去了人工,提高了導航的精確度.
當前已有的地圖導航應用存在一定缺陷性.谷歌是最早提供地圖導航服務的商家之一,但國內(nèi)使用谷歌導航存在一定的依賴性,如果谷歌不給提供服務,那么用戶是不可能使用相關服務的.就在2010年2月23日,谷歌公司總部決定正式退出中國,并最終關閉中國的搜索服務,轉用香港服務器來提供簡體服務.同時,谷歌在中國相繼關閉了一系列的服務.這使得谷歌導航的使用存在很大的風險性.
另外,現(xiàn)有產(chǎn)品的側重點往往在導航上,忽視了用戶在使用時遇到的問題,那就是方向的識別.地圖給出的路徑是在地圖上標注到達目的地的路線.而用戶通常在獲得了路徑以后,由于不確定方向,使得自己越走越遠,當發(fā)現(xiàn)方向不對而原路返回時卻浪費了不少的時間和精力.
因此,本文提出了在開發(fā)系統(tǒng)時采用國內(nèi)數(shù)據(jù),基于 Android平臺,并在導航前讓用戶通過指南針功能明確方向的觀點.
系統(tǒng)的物理架構主要是這樣的:基于Android API設計編碼,通過Android系統(tǒng)加載到Android移動平臺,而硬件平臺通過鍵盤及觸摸屏輸入請求及參數(shù)來調(diào)用GPS等模塊獲得相關數(shù)據(jù),再由顯示器返回給用戶[1].如圖1所示.
圖1 系統(tǒng)物理結構
軟件在打開時首先顯示主界面,列出各項功能供用戶進行選擇,包括:地圖瀏覽、位置定位、公交路線查詢、路徑規(guī)劃、離線地圖管理、指南針等功能,點擊相對應的圖片即可進入各個功能模塊.
為了方便用戶對地圖的查看,首先設計一個地圖瀏覽的功能,通過該功能,用戶可以查看全國各地的交通圖.并且提供給用戶對地圖的平移和縮放功能,通過放大功能使用戶能夠查看更為詳細的情況,通過縮小功能則可以從全局查看.如圖2所示.
圖2 地圖瀏覽
位置定位功能主要通過將用戶位置在地圖中作標記來實現(xiàn).當用戶位置發(fā)生改變時,通過設置監(jiān)聽器可以重新定位[2],實現(xiàn)動態(tài)定位.該功能的實現(xiàn)主要分為兩種方式,即 GPS定位與網(wǎng)絡定位[3].從精確度上分析,GPS定位的方法定位精確[4-5],無需網(wǎng)絡連接,但受周邊環(huán)境影響較大,有高層建筑物或是在室內(nèi)時,都無法定位.而網(wǎng)絡定位雖然在精度上不及 GPS定位,但網(wǎng)絡定位的方法速度較快,不受周邊環(huán)境影響,在一定程度上彌補了GPS的不足.定位時,用戶可以手動設定定位方式,打開GPRS,關閉GPS,則系統(tǒng)使用網(wǎng)絡定位;打開GPS,關閉GPRS,則使用GPS定位.定位成功,則返回用戶在地圖中的定位標記.
公交路線查詢功能可以設置兩個參數(shù),分別為城市與線路,例如:查詢衡水市的 12路公交車,即輸入“衡水”,再輸入“12”.如圖3所示.
圖3 公交路線
路徑規(guī)劃通過用戶設置起點與終點,為用戶展示路徑,該功能主要使用網(wǎng)絡資源,通過向百度地圖的 API服務發(fā)送請求,來獲取路徑相關點,然后通過解析網(wǎng)絡或本地地圖數(shù)據(jù),在地圖上標記這些點,繪成路線,通過界面返回給用戶.
離線地圖管理功能主要用來管理離線地圖,用戶可以輸入城市名稱,通過搜索來查看該城市的離線地圖,若存在則展示給用戶,不存在可以點開始按鈕進行下載,同時可以停止及刪除.再加入掃描離線包的功能,若導入了離線地圖,通過該功能可以自動識別并加載.
指南針功能為用戶指明方向,使用時只需將手機放平,與水平面平行,箭頭所指方向為北方,該功能主要通過手機的傳感器實現(xiàn),具體運用到了手機的電子羅盤功能.通過Android的sensor類來管理.
該功能主要用到幾個基礎類:
MapActivity:該類用來顯示 AndroidMap的 Activity類,如果沒有本地地圖資源,則需要連接底層網(wǎng)絡來獲取地圖數(shù)據(jù).所有要顯示 MapView的 Activity都要繼承 MapActivity類,由于該類屬于抽象類,所以在onCreate()中,都必須創(chuàng)建一個MapView的實例.
MapView:主要用來顯示地圖的 View組件,繼承自 android.view.ViewGroup.同時,該組件只能被MapActivity來創(chuàng)建,并配合使用.由MapActivity來管理MapView連接網(wǎng)絡或本地資源的線程.
MapController:用來控制地圖的移動和縮放等.使用 MapController來控制地圖,可以通過下面的代碼來實現(xiàn):
MapController mapController= mapView.getController(); //獲取控制對象
mapView.displayZoomControls(true); //實現(xiàn)縮放顯示并可控
GeoPoint point = new GeoPoint((int) (37.715 * 1E6), (int) (115.704 * 1E6));//設置要顯示的地圖中心點,此處設為衡水市區(qū)
mapController.setCenter(point);//加載到地圖組件中
mapView.getController().setZoom(12); //設置默認顯示大小級別
mapView.setDoubleClickZooming(true)//設置雙擊實現(xiàn)放大
該功能主要在地圖組件的基礎上標記當前手機所處的位置,通過GPS或網(wǎng)絡方式向定位SDK發(fā)出請求,SDK根據(jù)定位依據(jù)通過LocationClientOption方法返回定位結果.再設置LocationListener監(jiān)聽器來監(jiān)聽位置的改變,重新標記當前位置.
該功能需要實現(xiàn)MKSearchListener接口中的onGetWalkingRouteResult方法,該方法首先設置起點與終點,返回兩點之間在地圖中標記的路徑.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("MainActivity.onCreate()");
setContentView(R.layout.activity_main);
// 獲取界面中顯示指南針的圖片
znzImage = (ImageView) findViewById(R.id.znzImage);
// 獲取真機的傳感器管理服務
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity.onResume()");
// 為系統(tǒng)的方向傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}
public void onSensorChanged(SensorEvent event) {
System.out.println("MainActivity.onSensorChanged()");
// 真機上獲取觸發(fā)event的傳感器類型
int sensorType = event.sensor.getType();
// 模擬器上獲取觸發(fā)event的傳感器類型
switch (sensorType) {
case Sensor.TYPE_ORIENTATION:
// 獲取繞Z軸轉過的角度.
float degree = event.values[0];
// 創(chuàng)建旋轉動畫(反向轉過degree度)
RotateAnimation ra = new RotateAnimation(currentDegree, -degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
// 設置動畫的持續(xù)時間
ra.setDuration(200);
// 運行動畫
znzImage.startAnimation(ra);
currentDegree = -degree;
break;
}}
指南針功能的實現(xiàn)使用戶成功避免了導航方向的錯誤,定位以及導航功能為用戶出行帶來了極大的方便.同時,百度地圖API的使用擺脫了對國外數(shù)據(jù)的依賴.相信導航類的產(chǎn)品在今后會逐漸解決并完善方向問題,并且逐漸減小對國外地圖數(shù)據(jù)的依賴性.
[1] 隆志堅.Android平臺基于Google Map Api的導航應用技術研究和實現(xiàn)[J].辦公自動化,2011(16):46-48.
[2] 曾薪夷.基于Android平臺的GPS導航系統(tǒng)的設計與實現(xiàn)[J].計算機與現(xiàn)代化,2012(9):255-258.
[3] 劉洋.GPS+無線網(wǎng)絡:混合定位助力LBS[J].電子設計技術,2009(4):82.
[4] 李明,陳曉,何鋒鋒.GSM網(wǎng)絡在GPS/GSM衛(wèi)星定位公眾服務系統(tǒng)的應用[J].移動通信,2008(13):60-64.
[5] 鄔群勇,張愛國,許其鳳,等.GPS移動定位與移動網(wǎng)絡定位精度的分析[J].全球定位系統(tǒng),2010(5):33-37.