張意中++游彬++閆偉
摘 要:文中設(shè)計(jì)并實(shí)現(xiàn)了一款基于Android平臺和移動GIS系統(tǒng)的校園應(yīng)用。利用Android百度地圖SDK,對現(xiàn)在LBS軟件不提供小區(qū)域范圍內(nèi)位置服務(wù)的缺陷進(jìn)行分析,結(jié)合校園內(nèi)位置信息和Android平臺技術(shù)實(shí)現(xiàn)了包括校園POI(Point of Interest)信息查詢、基于校園位置的信息服務(wù)、校園POI要素顯示控制、校園內(nèi)部熱點(diǎn)間的步行路線規(guī)劃等多種應(yīng)用功能。重點(diǎn)分析了基于百度地圖Android SDK的移動GIS開發(fā)的關(guān)鍵技術(shù),如移動空間定位、百度地圖和服務(wù)器數(shù)據(jù)庫的管理等。
關(guān)鍵詞:Android平臺;移動GIS技術(shù);百度地圖SDK ;LBS服務(wù)
中圖分類號:TP333 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2015)11-00-04
0 引 言
地理信息系統(tǒng)(GIS)是依賴計(jì)算機(jī)軟硬件對地球空間中的地理位置及其屬性信息數(shù)據(jù)獲取、存儲、處理、檢索訪問和描述的管理系統(tǒng)[1]。隨著無線通信和嵌入式軟硬件等前沿科技的發(fā)展,移動智能設(shè)備獲得了很大的進(jìn)步。目前,在諸多移動操作系統(tǒng)中占主流地位的是三大操作系統(tǒng),分別為IOS、Android、Windows Phone,這些操作系統(tǒng)均支持Mobile GIS應(yīng)用程序的開發(fā)。Mobile GIS應(yīng)用服務(wù)已經(jīng)滲透到了各行各業(yè),凡是人能到達(dá)或者活動的地方,比如航空航天、地面、地表、地下等都是Mobile GIS研究的領(lǐng)域。當(dāng)前4G網(wǎng)絡(luò)的數(shù)據(jù)下載速率達(dá)到了100 Mb/s,上傳速率也有20 Mb/s[2],新型移動終端設(shè)備的軟件系統(tǒng)和硬件系統(tǒng)具有更高的網(wǎng)絡(luò)訪問能力,這讓移動應(yīng)用可以直接接入互聯(lián)網(wǎng)。并讓Mobile GIS系統(tǒng)的LBS應(yīng)用搬到智能終端上成為了現(xiàn)實(shí)。目前,許多公司、組織或者個人開發(fā)了各種Mobile GIS應(yīng)用,如美國麻省理工學(xué)院的校園系統(tǒng)MIT Mobile、俄勒岡大學(xué)開發(fā)的數(shù)字校園系統(tǒng)等。這些系統(tǒng)的熱點(diǎn)只能手動輸入關(guān)鍵字查詢,搜索方式單一,而且沒有添加校園熱點(diǎn)間的路線規(guī)劃導(dǎo)航功能。
本文在Android操作系統(tǒng)和百度地圖API的基礎(chǔ)上,根據(jù)學(xué)校大眾對位置服務(wù)的要求,結(jié)合Mobile GIS服務(wù)設(shè)計(jì)杭州電子科技大學(xué)智能校園系統(tǒng),進(jìn)一步拓展了Mobile GIS的應(yīng)用范圍。本系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)研究方法也可以移植到智慧小區(qū)等類似系統(tǒng)。此系統(tǒng)總體包括Mobile GIS客戶端、服務(wù)器端與無線通信網(wǎng)絡(luò)三部分,采用C/S(客戶端/服務(wù)器端)架構(gòu),Mobile GIS客戶端通過無線網(wǎng)絡(luò)與遠(yuǎn)端服務(wù)器通信[3,4]。
1 系統(tǒng)構(gòu)架設(shè)計(jì)
杭州電子科技大學(xué)高教園校區(qū)現(xiàn)有教學(xué)區(qū)、生活區(qū)(本科)、生活區(qū)G區(qū)(研究生公寓)。整個校區(qū)面積廣闊,多達(dá)1 200畝,校園內(nèi)的建筑物、院系、辦事機(jī)構(gòu)等很多,一般分布較散,本校師生都難以準(zhǔn)確尋找,校園的新生和外來人員更加難以分辨、找到自己感興趣或者需要的地方,也給他們參加各項(xiàng)活動帶來了諸多不便。根據(jù)校園學(xué)生學(xué)習(xí)和生活需求,設(shè)計(jì)出如下功能:
(1)熱點(diǎn)搜索:標(biāo)注出有關(guān)你輸入關(guān)鍵字的所有地點(diǎn),點(diǎn)擊標(biāo)注,彈出這個標(biāo)注點(diǎn)的詳情。
(2)路線規(guī)劃:在杭州市內(nèi),輸入你的起點(diǎn)和終點(diǎn),根據(jù)交通工具會提供三種想要的路線規(guī)劃。分別為駕車路線,公交路線和步行路線。
(3)公交查詢:輸入杭州市內(nèi)的公交號,可以查到此公交路線上所有的公交站臺。
(4)室外定位:顯示當(dāng)前所在的位置。
(5)杭電校園:點(diǎn)擊會出現(xiàn)杭州電子科技大學(xué)的校園全景圖。
(6)校園路線規(guī)劃:在校園內(nèi)輸入起點(diǎn)、終點(diǎn),會給出一個規(guī)劃步行路線圖。
(7)生活區(qū)域:杭電本科生生活區(qū)的生活要素搜索和周邊定位功能。
(8)研究生公寓:研究生生活區(qū)的生活要素搜索周邊定位功能。
系統(tǒng)功能構(gòu)架如圖1所示。
2 功能的設(shè)計(jì)和實(shí)現(xiàn)
2.1 基礎(chǔ)地圖模塊
LBS是當(dāng)前流行的POI模式:位置信息點(diǎn)服務(wù)。其核心就是將線下的資源結(jié)合地理位置信息整合并發(fā)布到線上,為人們的生活提供服務(wù)[5]?;A(chǔ)地圖功能模塊顧名思義就是可以實(shí)現(xiàn)地圖最基本的功能:
(1)熱點(diǎn)搜索:用poi Search activity實(shí)現(xiàn)OnGetPoiSearchResultListener接口監(jiān)聽,獲得搜索數(shù)據(jù),而且會把數(shù)據(jù)顯示在地圖上。以搜索高沙為例,如圖2所示。
(2)公交路線查詢:當(dāng)我們坐上公交車后不知道離目的地有幾站路,可以將OnGetBusLineSearchResultListener接口在Bus Search activity中實(shí)現(xiàn)。把從接口OnGetBusLineSearchResultListener中得到的數(shù)據(jù)以BusLineOverlay形式覆蓋到Map view中。以搜索8路公交車為例,如圖3所示。
(3)路線規(guī)劃:路線規(guī)劃功能提供三種路線參考:自駕路線,公交路線和步行路線。具體是實(shí)現(xiàn)OnGetRoutePlanResultListener接口,并從中獲得規(guī)劃的結(jié)果。文澤路到西湖景區(qū)公交查詢路線規(guī)劃結(jié)果如圖4所示。
(4) 定位功能:如圖4所示的定位功能調(diào)用GPS設(shè)備對當(dāng)前位置定位,在程序上通過實(shí)現(xiàn) PoiSearch.newInstance(),并設(shè)置OnGetPoiSearchResultListener監(jiān)聽,開啟定位服務(wù)向百度定位服務(wù)器發(fā)送請求獲得用戶所在的位置信息,此時用戶可以清晰地看到自己在哪兒,如圖5所示。
圖1 系統(tǒng)應(yīng)用的框架圖
圖2 搜索杭州高沙的結(jié)果 圖3 8路公交查詢結(jié)果
2.2 智能校園
智能校園是本GIS應(yīng)用設(shè)計(jì)的主要功能。主要分為杭電全景圖、校內(nèi)路線規(guī)劃、校園熱點(diǎn)搜索、本科生活區(qū)服務(wù)和研究生生活區(qū)服務(wù)等內(nèi)容。提供的小區(qū)域范圍內(nèi)LBS服務(wù),是現(xiàn)在地圖軟件所達(dá)不到的效果。此功能模塊首先由一個list view來顯示功能列表,點(diǎn)擊相應(yīng)的功能列表選項(xiàng),會跳轉(zhuǎn)到相應(yīng)的activity中去。并響應(yīng)想要的功能。
圖4 路線規(guī)劃結(jié)果 圖5 定位結(jié)果
2.2.1 杭電校園和校園路線規(guī)劃
杭電校園此功能是顯示杭州電子科技大學(xué)的全景圖,分為衛(wèi)星地圖和普通地圖兩種,如圖6所示。當(dāng)學(xué)校里的老師、學(xué)生或者外來人員在校園某處卻想去校園里的其它地點(diǎn),而兩地間的距離較近時,可以選擇步行到達(dá)目的地[6]。校園步行路線規(guī)劃在實(shí)現(xiàn)時,過程主要分為兩步:一是輸入框加載內(nèi)容的實(shí)現(xiàn):采用AutoCompleteTextView這個自動補(bǔ)全控件。此控件通過setAdapter(sugAdapter)語句,把AutoCompleteTextView提示內(nèi)容和已經(jīng)設(shè)計(jì)好的sugAdapter適配器相結(jié)合。當(dāng)用戶輸入一個字時,AutoCompleteTextView會掃描sugAdapter適配器的內(nèi)容,并把得到的相關(guān)內(nèi)容以listview的形式顯示出來供用戶選擇。二是獲取輸入的關(guān)鍵字之間的路線圖:這里用到步行規(guī)劃監(jiān)聽,并從onGetWalkingRouteResult接口中得到結(jié)果。以杭電體育館到杭電電子信息學(xué)院為例,如圖7所示。圖8所示為校園路線規(guī)劃搜索邏輯圖。
圖6 校園全景圖 圖7 校內(nèi)路線規(guī)劃結(jié)果
2.2.2 校園熱點(diǎn)搜索
杭州電子科技大學(xué)校園內(nèi)的建筑物、學(xué)院、辦事行政機(jī)構(gòu)、體育場所等POI繁多,不同的地點(diǎn)有各自相關(guān)的位置信息,通過訪問服務(wù)器或者應(yīng)用本地?cái)?shù)據(jù)獲得這些信息。
圖8 路線規(guī)劃邏輯圖
利用語句String string = keyWorldsView.getText ().toString()獲得輸入的熱點(diǎn)名關(guān)鍵字,從數(shù)據(jù)庫中獲得此關(guān)鍵字的經(jīng)緯度。得到的經(jīng)緯度坐標(biāo)保存在變量latlng中,用此經(jīng)緯度坐標(biāo)再進(jìn)行標(biāo)注操作。校園POI查詢功能在輸入熱點(diǎn)關(guān)鍵字時有兩種方式,分別是列表視圖加載校園POI選擇輸入和搜索欄模糊查詢輸入。用戶輸入興趣點(diǎn)關(guān)鍵字或者關(guān)鍵字首字,結(jié)果將顯示在列表視圖上,選擇對應(yīng)興趣點(diǎn)名稱,完成搜索任務(wù),POI的具體位置以地圖標(biāo)注的形式顯示,點(diǎn)擊標(biāo)注彈出的氣泡視圖呈現(xiàn)POI的基本位置信息。查詢操作流程如圖9所示。
圖9 查詢操作流程圖
此熱點(diǎn)以搜索電子信息學(xué)院為例,圖10所示為列表選中方式,圖11所示為模糊搜索匹配輸入。
2.2.3 本科生活區(qū)
本科生活區(qū)功能是針對學(xué)生在本科生活區(qū)和附近的服務(wù),此功能模塊提供了學(xué)生生活區(qū)宿舍樓,ATM機(jī),學(xué)生食堂,后勤部等服務(wù)點(diǎn)的查詢與定位。單獨(dú)用一個activity顯示生活要素列表。并設(shè)置點(diǎn)擊事件,當(dāng)用戶點(diǎn)擊“生活區(qū)要素”時會調(diào)用語句:
Intent intent =new Intent(Dormitory.this,LifeKEY.class);
startActivityForResult(intent, 0);
圖10 列表選中方式圖 圖11 模糊搜索匹配輸入
跳轉(zhuǎn)到生活區(qū)要素的列表,列表是用可展開列表組件ExpandableList實(shí)現(xiàn)。在列表中設(shè)置點(diǎn)擊列表項(xiàng)事件監(jiān)聽。當(dāng)選中想要的要素,會把熱點(diǎn)的名字傳回原來的Activity中,利用此點(diǎn)擊的內(nèi)容,把想要的要素以標(biāo)注的形式添加到地圖上。同時也提供以生活區(qū)為中心的周邊搜索功能,點(diǎn)擊“生活區(qū)周邊”按鈕,會調(diào)用一個LinearLayout布局,用來顯示輸入窗口。根據(jù)提示用戶輸入搜索半徑,接著興趣點(diǎn)的名稱,點(diǎn)擊“搜索”會調(diào)回一個button監(jiān)聽事件,響應(yīng) mPoiSearch.searchNearby方法,得到想要的周邊結(jié)果。圖12為搜索生活區(qū)3幢宿舍樓顯示圖,圖13為在周邊搜索生活區(qū)附近1 000米的肯德基頁面顯示圖。
圖12 搜索生活區(qū)3幢 圖13 在周邊搜索生活區(qū)附近
宿舍樓顯示圖 1 000米的肯德基頁面顯示圖
2.2.4 研究生公寓
此功能模塊是針對研究生提供的服務(wù),杭電研究生宿舍離教學(xué)區(qū)比較遠(yuǎn),所以單獨(dú)為一個功能,此模塊功能包括兩個方面:一是研究生公寓內(nèi)的宿舍樓,食堂的查詢。二是宿舍樓周邊搜索。由于研究生公寓要素不是很多,再此用Spinner控件顯示要素列表。而且給每個列表項(xiàng)添加監(jiān)聽事件,具體代碼如下:
mySpinner.setOnItemSelectedListener{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
}
}
當(dāng)我們點(diǎn)擊Spinner控件中的要素時,會從數(shù)據(jù)庫中獲得相應(yīng)的經(jīng)緯度坐標(biāo)。此功能的界面與本科生活區(qū)類似。應(yīng)用結(jié)果如圖14、15所示。圖14為研究生宿舍33幢界面顯示圖,圖15為搜索研究生1 000米內(nèi)的建設(shè)銀行界面顯示圖。
圖14 搜索研究生宿舍33幢樓 圖15 搜索研究生宿舍
1 000米內(nèi)的建設(shè)銀行
2.2.5 SQLite數(shù)據(jù)庫
SQLite是輕量級的數(shù)據(jù)庫,專門用于手機(jī),Pad等存儲資源有限的設(shè)備上。此應(yīng)用中建立了一個擁有熱點(diǎn)名稱、熱點(diǎn)經(jīng)度和熱點(diǎn)緯度等字段的數(shù)據(jù)庫,具體程序如下:
public void onCreate(SQLiteDatabase arg0) {
arg0.execSQL(“CREATE TABLE IF NOT EXISTS db_position (positionId TEXT PRIMARY KEY NOT NULL ,”+ “positionName TEXT,longitude double,latitude double)”);
與此同時建立Position類來存取相應(yīng)的位置坐標(biāo)。在Position類中設(shè)置三個屬性:positionName,longitude ,latitude。此類用于存放位置點(diǎn)信息。Position類的對象用來存儲生活區(qū)宿舍樓。部分代碼如下:
Position position16=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)3棟”,120.349265,30.322314);
Position position17=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)4棟”,120.348613,30.322275);
Position position18=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)5棟”,120.350141,30.322719);
Position position19=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)6棟”,120.34939,30.322692);
Position position20=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)7棟”,120.348474,30.323031);
Position position21=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)10棟”,120.350141,30.323756);
Position position22=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)11棟”,120.349377,30.323733);
Position position23=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)12棟”,120.348636,30.323709);
Position position24=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)22棟”,120.34785,30.323709);
Position position25=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)27棟”,120.351834,30.322376);
Position position26=new Position(UUID.randomUUID().toString(),”電子科技大學(xué)生活區(qū)28棟”,120.351793,30.322782);
通過數(shù)據(jù)庫操作語句execSQL,把已經(jīng)存好的position點(diǎn)加入到數(shù)據(jù)庫中,具體程序如下:
dbWriterDatabase.execSQL(“INSERT INTO db_position (positionId,positionName,longitude,
latitude) values (?,?,?,?)”, New Object[]{position.getPositionId(),position.getPositionName(),
position.getLongitude(),position.getLatitude()});
System.out.println(“數(shù)據(jù)已寫入”);
數(shù)據(jù)庫建立成功,并且每個熱點(diǎn)的信息加入數(shù)據(jù)庫后,就可以用queryDbPosition方法根據(jù)熱點(diǎn)名稱取得相應(yīng)的經(jīng)緯度。queryDbPosition方法的具體代碼如下:
public LatLng queryDbPosition(String positionName ){
LatLng latLng=null;
try {
Cursor cursor= dbWriterDatabase.rawQuery(“select * from db_position where positionName=? “, new String[]{positionName});
if (cursor.moveToNext()) {
String PositionIdString=cursor.getString(0);
System.out.println(“PositionIdString”+ PositionIdString);
double longitude=cursor.getDouble(2);
System.out.println(“l(fā)ongitude”+longitude);
double latitude=cursor.getDouble(3);
System.out.println(“l(fā)atitude”+latitude);
latLng=new LatLng(latitude, longitude);
}
cursor.close();
} catch (Exception e) {
}
return latLng;
}
3 結(jié) 語
為了解決百度地圖在小區(qū)域內(nèi)不能提供有針對性的服務(wù)的問題,通過對Android 系統(tǒng)中的定位技術(shù)和方法進(jìn)行研究,對Baidu Map進(jìn)行了二次開發(fā),設(shè)計(jì)并實(shí)現(xiàn)了一個校園LBS 系統(tǒng)。測試結(jié)果表明,該系統(tǒng)的各個功能模塊能夠滿足校園學(xué)生對LBS 的基本要求,但仍需要在以下幾個方面進(jìn)行研究:
(1)可以添加杭電官方微博到應(yīng)用中去;
(2)定時發(fā)布學(xué)校的講座信息和校園新聞;
(3) 擴(kuò)展使用WiFi 的定位方式,在校園內(nèi)部使用無線定位將會更受歡迎;
(4)完善周邊好友查詢功能,要使系統(tǒng)能夠查看周邊好友位置和移動軌跡,這樣就會根據(jù)好友的位置來與身邊的好友聯(lián)系,教師也可以利用該項(xiàng)功能查看學(xué)生的出勤情況和興趣場所。
參考文獻(xiàn)
[1] Kang-tsung Chang .地理信息系統(tǒng)導(dǎo)論(第七版)[M].陳健飛,連蓮,譯.北京:電子工業(yè)出版社,2014:3-4.
[2] 張克平.LTE/LTE-Advanced—B3G/4G/B4G移動通信系統(tǒng)無線技術(shù)[M].北京:電子工業(yè)出版社,2013:28-30.
[3] 王崇倡,蘇存英.基于移動GIS的公共設(shè)施巡查系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].測繪科學(xué),2011,36(6):88-90.
[4] 陳曉軍,劉春,裴洪雨.基于移動GIS的數(shù)字城管數(shù)據(jù)采集系統(tǒng)架構(gòu)與實(shí)現(xiàn)[J].鐵道勘察,2009(4):62-66.
[5] 趙江玲.基于手機(jī)的位置服務(wù)研究與應(yīng)用[D].成都:電子科技大學(xué),2010:45-50.
[6] Li Fang, Li Xialei, Bian Fuling.A Framework for Autonomous LBS in Wireless Pervasive Computing Environments[J]. Proceedings of the 9th International Conference on Advanced Communication Technology,2007(3):1715-1720.