摘 要: 目前大多數(shù)導(dǎo)航軟件都采用指南針指向的單目標(biāo)導(dǎo)航模式進(jìn)行定位和導(dǎo)航,,此模式無法進(jìn)行一對(duì)一定位且導(dǎo)航指示不夠簡(jiǎn)明,為了滿足更多定位情境和提供更簡(jiǎn)明的導(dǎo)航指示,,設(shè)計(jì)了一款基于Android的多人定位系統(tǒng),,該系統(tǒng)提供準(zhǔn)確快捷的好友定位以及更多導(dǎo)航生活服務(wù),具有多人定位,、導(dǎo)航找人,、定點(diǎn)集合等功能。在實(shí)際應(yīng)用中,,該系統(tǒng)取得較好的效果,。
關(guān)鍵詞: Android系統(tǒng);定位,;導(dǎo)航,;一對(duì)一定位;定點(diǎn)集合,;百度地圖
0 引言
近年來,,隨著3G和4G[1]網(wǎng)絡(luò)的日益完善,智能手機(jī)在國內(nèi)的普及率越來越高,,國內(nèi)手機(jī)市場(chǎng)主要以Android手機(jī)和蘋果手機(jī)為主流,,而Android系統(tǒng)的開源性和免費(fèi)性使其在國內(nèi)手機(jī)市場(chǎng)占有更高的份額。目前,,集定位與導(dǎo)航功能于一身的Android主流APP有百度地圖,、高德地圖和Google地圖[2],這些應(yīng)用已實(shí)現(xiàn)汽車導(dǎo)航,、公交換乘和步行導(dǎo)航等功能,,都采用指南針指向的單目標(biāo)導(dǎo)航模式進(jìn)行定位和導(dǎo)航。雖然這些主流的導(dǎo)航軟件都能很好地解決用戶的定位和導(dǎo)航問題,,但在某些應(yīng)用場(chǎng)景卻表現(xiàn)得無能為力,,例如逛街找人、學(xué)生考勤,、定點(diǎn)集合、老人或小孩跟蹤定位,、戶外隊(duì)員管理等,。
為使地圖資源能得到充分利用,能適應(yīng)更多的應(yīng)用場(chǎng)景,本文開發(fā)了一款基于Android的多人定位系統(tǒng),。該系統(tǒng)使用百度地圖API,,突破了以往導(dǎo)航定位的單目標(biāo)模式,實(shí)現(xiàn)了一對(duì)一定位,、多人定位,、導(dǎo)航找人、定點(diǎn)集合,、動(dòng)態(tài)好友位置追蹤與指向和手機(jī)防盜等功能,,能更好地為便捷生活提供服務(wù)。
1 相關(guān)技術(shù)
1.1 Android平臺(tái)
Android是Google開發(fā)的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)[3],。Android平臺(tái)主要在操作系統(tǒng)和中間件支撐下,能夠用于用戶界面設(shè)計(jì)和應(yīng)用軟件開發(fā)[4],。Android自身集成豐富的API,,且大部分代碼開源。Android的應(yīng)用框架層采用結(jié)構(gòu)化設(shè)計(jì),,從而簡(jiǎn)化了Android應(yīng)用程序的開發(fā)[4],。Android四大組件包括Activity、Service,、BroadCastReceiver和ContentProvider[5],,Android應(yīng)用程序的開發(fā)環(huán)境只需Eclipse和插件ADT即可[6]。
1.2百度地圖API
百度地圖API是一套由JavaScript語言編寫的應(yīng)用程序接口,,它提供了網(wǎng)絡(luò)地圖服務(wù)的全部功能,,包括地圖數(shù)據(jù)、地圖顯示,、地圖操作,、地圖標(biāo)注、地圖編輯,、地圖查詢等[7],。百度通過地圖服務(wù)應(yīng)用接口將應(yīng)用開發(fā)平臺(tái)和地理信息數(shù)據(jù)捆綁,將復(fù)雜的地理信息系統(tǒng)底層進(jìn)行封裝,。用戶可不必了解它的技術(shù)細(xì)節(jié)就能在應(yīng)用中快速構(gòu)建基礎(chǔ)地理底圖[8],。
2 需求分析
2.1 功能描述
本系統(tǒng)為用戶提供準(zhǔn)確快捷的好友定位與導(dǎo)航生活服務(wù),典型應(yīng)用場(chǎng)景有逛街找人,、學(xué)生考勤,、定點(diǎn)集合、老人或小孩跟蹤定位,、戶外隊(duì)員管理等,,因此,需具備以下7個(gè)功能:用戶登錄,、用戶注冊(cè),、好友添加,、防盜、多人定位,、導(dǎo)航,、一對(duì)一定位。具體功能詳細(xì)描述如表1所示,。
2.2 用例分析
根據(jù)以上的功能描述,,得出圖1所示的用戶用例圖。
3 系統(tǒng)設(shè)計(jì)
3.1多人定位系統(tǒng)架構(gòu)設(shè)計(jì)
為使本系統(tǒng)開發(fā)和維護(hù)更方便,,并提高系統(tǒng)數(shù)據(jù)的安全性,,本系統(tǒng)采用分層模型的設(shè)計(jì)思想,,系統(tǒng)架構(gòu)如圖2所示,。
3.2 多人定位系統(tǒng)時(shí)序圖
在用戶使用本系統(tǒng)時(shí),首先進(jìn)行身份驗(yàn)證,,如果是新用戶則必須先注冊(cè),,然后再登錄,登錄成功后可以選擇相應(yīng)的功能,,包括防盜,、添加好友和多人定位,在多人定位功能中可以實(shí)時(shí)顯示好友所在位置以及集合點(diǎn)位置,,并能實(shí)現(xiàn)3種方式的導(dǎo)航,,還可進(jìn)行一對(duì)一定位來實(shí)現(xiàn)好友互找。系統(tǒng)詳細(xì)時(shí)序圖如圖3所示,。
3.3 定位功能設(shè)計(jì)
Android手機(jī)可通過GPS+GPRS,、只有GPS和只有WiFi這3種情況下進(jìn)行實(shí)時(shí)定位,利用百度地圖API實(shí)現(xiàn)地圖顯示,。終端的實(shí)時(shí)位置信息保存在定位服務(wù)器(定位服務(wù)器使用PHP開發(fā))中,,定位服務(wù)器收到各終端的定位請(qǐng)求后,將位置信息發(fā)回給終端,,為終端提供必要的路線信息和導(dǎo)航信息。
4 多人定位系統(tǒng)主要功能的實(shí)現(xiàn)
4.1 一對(duì)一定位的實(shí)現(xiàn)
當(dāng)兩個(gè)用戶互相加為好友后,,便可使用一對(duì)一定位功能,本功能以指針實(shí)時(shí)指向加距離的方式來實(shí)現(xiàn)定位,,從而能更直觀地反映好友相對(duì)于自己所在的位置和方向。
根據(jù)當(dāng)前用戶和目標(biāo)用戶的方向來進(jìn)行實(shí)時(shí)更新指南針旋轉(zhuǎn),,更新指南針旋轉(zhuǎn)的線程代碼如下:
//這是更新指南針旋轉(zhuǎn)的線程,靈活使用handler,,每20 ms檢測(cè)方向變化值,對(duì)應(yīng)更新指南針旋轉(zhuǎn)
protected Runnable mCompassViewUpdater=new Runnable(){
@Override
public void run(){
if(mPointer!=null&&!mStopDrawing)
{
if(mDirection!=mTargetDirection)
{
//計(jì)算耗時(shí)最短的動(dòng)畫
float to=mTargetDirection,;
if(to-mDirection>180)
{to-=360,;}
else if(to-mDirection<-180)
{to+=360,;}
//限制MAX_ROTATE_DEGREE的最大速度
float distance=to-mDirection,;
if(Math.abs(distance)>MAX_ROATE_DEGREE)
{distance = distance > 0 MAX_ROATE_DEGREE:(-1.0f*
MAX_ROATE_DEGREE),;}
//如果距離短的話需要減慢速度
mDirection=normalizeDegree(mDirection+((to-mDirection)*
mInterpolator.getInterpolation(Math.abs(distance)>
MAX_ROATE_DEGREE 0.4f: 0.3f))),;
//用了一個(gè)加速動(dòng)畫去旋轉(zhuǎn)圖片
Log.e("test", ""+mDirection),;
float t=mDirection+target;
mPointer.updateDirection(t),;// 更新指南針旋轉(zhuǎn)
}
mHandler.postDelayed(mCompassViewUpdater,, 20),;
// 20 ms后重新執(zhí)行自己,,比定時(shí)器好
}
}
};
當(dāng)兩個(gè)用戶不斷移動(dòng)位置時(shí),,通過兩者的經(jīng)、緯度實(shí)時(shí)更新兩者的距離,更新距離的代碼如下:
private void setjuli(int la,, int lo){
GeoPoint p1=new GeoPoint((int)(Omylocation.getMyLocation().latitude*1e6),, (int)(Omylocation.getMyLocation().longitude*1e6)),;
GeoPoint p2=new GeoPoint(la,, lo),;
int jl=(int)(DistanceUtil.getDistance(p1,, p2)),;
juli.setText(jl+"米"),;
target=get(p1.getLatitudeE6(),,p1.getLongitudeE6(),,p2.getLatitudeE6(),p2.getLongitudeE6()),;
}
4.2 添加集合點(diǎn)的實(shí)現(xiàn)
當(dāng)要向好友添加集合點(diǎn)時(shí),,客戶端向定位服務(wù)器發(fā)送添加集合點(diǎn)請(qǐng)求,,添加請(qǐng)求代碼如下:
public void AddCollection(ArrayList<String> array, int la,, int lo)
throws Exception {
// 添加集合點(diǎn)
String url=BASE_URL+"/addCollection.php",;
int len=array.size(),;
String str="[",;
for (int i=0,; i < len;i++){
str=str+"\""+array.get(i)+"\"",;
if((i+1)<len) {
str=str +",",;
}
}
str=str+"]",;
Map<String,, String>map=new HashMap<String,, String>();
map.put("la",, "" + la);
map.put("lo",, "" + lo);
map.put("arr",, str),;
Log.e("info", "addCollection la:"+la+"lo:"+lo),;
Log.e("info",, this.postRequest(url,, map)),;
}
5多人定位系統(tǒng)的應(yīng)用
多人定位系統(tǒng)采用Android 4.2.2+PHP開發(fā),使用多層架構(gòu)設(shè)計(jì)。系統(tǒng)的登錄,、注冊(cè)和功能選擇界面如圖4所示,。
添加好友、刷新好友位置和導(dǎo)航選擇界面如圖5所示,。
一對(duì)一定位、添加集合點(diǎn)以及查看好友最近登錄時(shí)間如圖6所示,。
6 結(jié)論
本文詳細(xì)介紹了一款基于Android平臺(tái),利用百度地圖API設(shè)計(jì)和實(shí)現(xiàn)的多人定位系統(tǒng),,實(shí)現(xiàn)了一對(duì)一定位,、多人定位,、導(dǎo)航找人,、定點(diǎn)集合,、動(dòng)態(tài)好友位置追蹤與指向和手機(jī)防盜等功能,該系統(tǒng)達(dá)到了預(yù)期的效果并成功上線使用,。
參考文獻(xiàn)
[1] 丁革媛,,高寶芹,,孫強(qiáng).無線通信技術(shù)的發(fā)展研究[J].微型機(jī)與應(yīng)用,,2014,,33(10):1-3,,6.
[2] 王秋穎,,陸宇含,王成龍.電子地圖在水利工程管理中的應(yīng)用[J].電子技術(shù)與軟件工程,,2014,14(7):107.
[3] 陳浩,,張敏.基于ARM的車載導(dǎo)航接收機(jī)應(yīng)用軟件設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,,2013,21(3):813-815.
[4] 農(nóng)麗萍,,王力虎,,黃一平.Android在嵌入式車載導(dǎo)航系統(tǒng)的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,,31(11):2473-2476.
[5] 趙亮,,張維.基于Android技術(shù)的界面設(shè)計(jì)與研究[J].電腦知識(shí)與技術(shù),,2009,5(29):8183-8185.
[6] 韓揚(yáng).Android應(yīng)用軟件安全評(píng)測(cè)工具的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),,2012.
[7] 王紅崧,,周海晏.基于百度地圖API的旅游地理信息系統(tǒng)開發(fā)[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2012,,23(8):57-59.
[8] 李艷.基于地圖API的Web地圖服務(wù)及應(yīng)用研究[J].地理信息世界,,2010(2):54-57.