張意中++游彬++閆偉



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