潘志宏,萬智萍,謝海明
1.中山大學(xué) 新華學(xué)院,廣州 510520
2.廣東移動(dòng)通信有限責(zé)任公司 茂名分公司,廣東 茂名 525000
近年來,隨著物聯(lián)網(wǎng)與移動(dòng)互聯(lián)網(wǎng)技術(shù)快速發(fā)展,國家不斷推進(jìn)智慧城市建設(shè),其中城市交通是智慧城市重點(diǎn)解決的問題之一。伴隨車聯(lián)網(wǎng)、智慧公交、共享單車不斷的深入應(yīng)用,如何利用現(xiàn)有的物聯(lián)網(wǎng)、移動(dòng)互聯(lián)網(wǎng)、大數(shù)據(jù)等技術(shù)來提升城市交通效率,實(shí)現(xiàn)智慧交通是目前國內(nèi)外研究的熱點(diǎn)[1-5]。公交系統(tǒng)作為城市交通的重要組成部分,出現(xiàn)了針對智慧公交APP,比如車來了、掌上公交等,它們通過與政府交通部門合作,授權(quán)獲取城市公交車的實(shí)時(shí)位置信息,從而給用戶提供上車前查詢的服務(wù),和上車后的智能提醒服務(wù)。這種方案通過安裝在公交車的特定傳感器進(jìn)行實(shí)時(shí)數(shù)據(jù)收集,并將數(shù)據(jù)存儲(chǔ)于政府交通部門的云服務(wù)器,這部分?jǐn)?shù)據(jù)非常精確,但是出于城市安全問題考慮,這部分?jǐn)?shù)據(jù)并不會(huì)對外開放,必須是有資質(zhì)的公司通過與政府合作才能獲取數(shù)據(jù),另外它也具有一定的局限性,比如當(dāng)部分公交車實(shí)時(shí)數(shù)據(jù)采集和回傳出現(xiàn)異常時(shí),APP會(huì)因?yàn)閿?shù)據(jù)的異常導(dǎo)致相應(yīng)服務(wù)中斷,產(chǎn)生不好的用戶體驗(yàn),例如會(huì)因?yàn)橛脩羲俗墓卉噷?shí)時(shí)數(shù)據(jù)產(chǎn)生異常,使用戶無法得到實(shí)時(shí)的報(bào)站信息,甚至因此錯(cuò)過下車站點(diǎn)。為了解決數(shù)據(jù)缺失問題,近年來很多學(xué)者利用智能終端的移動(dòng)感知能力來解決城市交通問題,比如Farkas等人[4]提出基于移動(dòng)群智感知的城市公交信息服務(wù)平臺(tái),通過乘客移動(dòng)終端感知數(shù)據(jù)與公交站點(diǎn)事件檢測器監(jiān)控相融合的方法來獲得公交車的實(shí)時(shí)信息。Manali等人[5]提出基于參與式感知技術(shù)利用乘客智能終端收集公交車的實(shí)時(shí)軌跡,最終給用戶提供公交車到站信息。Srinivasan等人[7]通過收集手機(jī)GPS軌跡數(shù)據(jù)從而獲得城市公交車站點(diǎn)信息。
為了解決上述城市公交實(shí)時(shí)數(shù)據(jù)缺失問題,本文提出了利用開源的公交線路信息與移動(dòng)終端的感知數(shù)據(jù)相互融合的解決方案[5-9],方案實(shí)現(xiàn)在沒有獲得交通部門實(shí)時(shí)數(shù)據(jù)的情況下,給用戶提供上車后智能提醒服務(wù),包含實(shí)時(shí)報(bào)站與到站提醒功能。本文的貢獻(xiàn)在于,首先提出基于Haversine[10-11]的最近站點(diǎn)自動(dòng)生成算法和基于心跳包機(jī)制的站點(diǎn)實(shí)時(shí)監(jiān)測與到站提醒算法;其次通過優(yōu)化距離計(jì)算公式方法來降低空間距離計(jì)算時(shí)間復(fù)雜度,從而提升算法的性能;最后利用移動(dòng)跨平臺(tái)框架[12-15]APPCan實(shí)現(xiàn)智慧公交APP,它很好地兼容Android、iOS等多種移動(dòng)操作系統(tǒng),并具有實(shí)時(shí)報(bào)站、到站提醒、公交線路查詢、最近上車站點(diǎn)自動(dòng)生成等功能。
公交系統(tǒng)作為目前城市出行的重要組成部分,如何給市民乘坐公交系統(tǒng)出行提供智慧服務(wù),是目前實(shí)現(xiàn)智慧出行重要的一步。本文主要針對智慧公交中的實(shí)時(shí)報(bào)站與到站提醒功能設(shè)計(jì)一款A(yù)PP,解決用戶在公共汽車上因?yàn)閷W⒂谄渌虑槎鹫`站的問題,又或者到陌生地方乘坐公交系統(tǒng)因?yàn)閷φ军c(diǎn)不熟悉而錯(cuò)站的問題。主要包括查詢站點(diǎn)、實(shí)時(shí)報(bào)站、到站提醒等功能。圖1給出了系統(tǒng)的功能流程圖。
功能描述如下:(1)查詢路線站點(diǎn),用戶輸入路線并點(diǎn)擊確認(rèn)后會(huì)在下方呈現(xiàn)該路線的所有站點(diǎn)的列表,并提示用戶點(diǎn)擊選擇目的地;(2)自動(dòng)生成最近的站點(diǎn),用戶在點(diǎn)擊選擇目的地站點(diǎn)后,系統(tǒng)會(huì)根據(jù)Haversine最近站點(diǎn)自動(dòng)生成算法生成用戶上車的最佳站點(diǎn);(3)手動(dòng)選擇上車站點(diǎn),如果系統(tǒng)自動(dòng)生成的站點(diǎn)不準(zhǔn)確,用戶可手動(dòng)更改上車站點(diǎn);(4)實(shí)時(shí)報(bào)站,用戶在確認(rèn)了基本乘車信息,包括公交路線、目標(biāo)站點(diǎn)和上車站點(diǎn)之后開始實(shí)時(shí)報(bào)站,系統(tǒng)會(huì)根據(jù)心跳包機(jī)制的站點(diǎn)實(shí)時(shí)監(jiān)測算法檢測公交車是否到站,并自動(dòng)刷新頁面對用戶反饋;(5)到站提醒,當(dāng)用戶距離目標(biāo)站點(diǎn)還剩3個(gè)站的時(shí)候,每到一個(gè)站,手機(jī)會(huì)震動(dòng)進(jìn)行提醒。在用戶到達(dá)最后一站時(shí)會(huì)響鈴提醒。
圖1 系統(tǒng)功能流程圖
獲取用戶輸入的公交路線,將其作為參數(shù)添加至API請求鏈接中,然后向第三方數(shù)據(jù)平臺(tái)聚合數(shù)據(jù)的路線信息API進(jìn)行請求。數(shù)據(jù)平臺(tái)將公交路線的數(shù)據(jù)返回給移動(dòng)終端,移動(dòng)終端將公交路線的站點(diǎn)信息進(jìn)行存放,同時(shí)將所有站點(diǎn)以列表的形式進(jìn)行顯示。
當(dāng)用戶選擇公交路線后,移動(dòng)終端能夠根據(jù)算法自動(dòng)生成搭車的最佳站點(diǎn)。首先通過移動(dòng)終端GPS獲取用戶所在位置,然后將其與整個(gè)路線的所有站點(diǎn)進(jìn)行對比距離,最后輸出距離用戶最近的站點(diǎn)。根據(jù)Haversine公式[10-11]可得到如下公式:
其中hav函數(shù)滿足如下條件:
最終根據(jù)公式(1)跟(2)求得兩點(diǎn)的距離為:
公式(1)跟(3)中的lat表示緯度,lng表示經(jīng)度,也即是(lat2,lng2)和(lat1,lng1)表示兩個(gè)坐標(biāo)點(diǎn) L2和 L1的經(jīng)緯度,r為地球半徑。這里需要注意的是在編程實(shí)現(xiàn)的時(shí)候,必須把三角函數(shù)的參數(shù)轉(zhuǎn)換為弧度,也即是參數(shù)需要乘上PI/180。
算法1基于Haversine的最近站點(diǎn)自動(dòng)生成算法
1.Initialize:獲取用戶的位置,緯度為latu,經(jīng)度為lngu,獲取整條路線所有站點(diǎn)的經(jīng)緯度,構(gòu)成站點(diǎn)列表L={L1(lat1,lng1]),L2(lat2,lng2),…,Ln(latn,lngn)},創(chuàng)建數(shù)組ArrayD用來存放用戶與所有站點(diǎn)之間的距離。
2.for each Liin L
3. 利用公式(3)計(jì)算用戶當(dāng)前位置與列表L中每個(gè)節(jié)點(diǎn)的距離di。
4. 將di存入數(shù)組ArrayD
5.end for
6.對數(shù)組ArrayD進(jìn)行升序排列
7.獲取ArrayD最小值dimin,并將最小值對應(yīng)的Li站點(diǎn)進(jìn)行返回。
因?yàn)榭紤]到城市實(shí)際的道路復(fù)雜情況,有時(shí)候地理位置最近的站點(diǎn)不一定是步行最佳的站點(diǎn),所以在智慧公交APP中增加手動(dòng)選擇上車站點(diǎn)功能。該功能在確認(rèn)乘車信息的界面中增加“手動(dòng)選擇上車站點(diǎn)”選擇列表,把該路線的所有站點(diǎn)作為列表選項(xiàng),用戶可以選擇站點(diǎn)來替換系統(tǒng)自動(dòng)生成的最近站點(diǎn)。
目前市面上智慧公交APP基本都是通過獲取政府交通部門的授權(quán),獲取公交車的實(shí)時(shí)位置信息來提供實(shí)時(shí)報(bào)站和到站提醒服務(wù),本文研究的是通過用戶移動(dòng)終端感知數(shù)據(jù)與免費(fèi)開源交通數(shù)據(jù)的融合,從而獲取用戶所在公交車的位置與站點(diǎn)之間的關(guān)系,來給用戶提供實(shí)時(shí)報(bào)站與到站提醒服務(wù)[5-9]。該功能使用“心跳包”機(jī)制來實(shí)現(xiàn)即時(shí)監(jiān)測,即在時(shí)間間隔內(nèi)反復(fù)執(zhí)行心跳包函數(shù),心跳包函數(shù)主要完成當(dāng)前公交車所到站點(diǎn)的檢測和是否到達(dá)目的站點(diǎn)的判斷。其中所到站點(diǎn)實(shí)時(shí)監(jiān)測主要是通過計(jì)算當(dāng)前公交車與下一站之間的實(shí)時(shí)距離,當(dāng)距離小于閥值是判定車輛到站,然后自動(dòng)刷新一次頁面反饋信息。而到站提醒功能是在站點(diǎn)實(shí)時(shí)監(jiān)測的基本上,通過當(dāng)前所到站點(diǎn)與目的站點(diǎn)之間的距離和站點(diǎn)數(shù)來進(jìn)行判定是否到站或者是否需要啟動(dòng)提醒,當(dāng)心跳包檢測所剩站點(diǎn)數(shù)目小于等于3時(shí),每到一站就震動(dòng)受,到達(dá)最后一站時(shí)改為響鈴。
因?yàn)樾奶扛? s就會(huì)發(fā)出請求一次,假設(shè)一次車程需要1 h,需要經(jīng)過20個(gè)站點(diǎn),根據(jù)算法2可知至少需要執(zhí)行1 820次距離計(jì)算。在算法1中,只需要調(diào)用幾十次(線路所有站點(diǎn)個(gè)數(shù))距離計(jì)算就實(shí)現(xiàn)功能,所以距離計(jì)算公式(3)完全能滿足算法1的性能需求。但是由于執(zhí)行公式(3)中的三角函數(shù)會(huì)消耗很多移動(dòng)終端的計(jì)算資源,特別是距離計(jì)算次數(shù)達(dá)到幾千次級別時(shí),APP性能會(huì)下降非常多,所以必須對距離計(jì)算公式(3)進(jìn)行優(yōu)化,讓它滿足算法2背景下的距離計(jì)算。
APP應(yīng)用場景一般是限定在一個(gè)城市的范圍內(nèi)進(jìn)行,也即是兩個(gè)站點(diǎn)間的距離不會(huì)超過200 km。由于范圍小,可以近似認(rèn)為經(jīng)線和所緯線是垂直的,假設(shè)如圖2示,要求計(jì)算 X(113.4,23.10)和Y(113.5,23.20)兩點(diǎn)的距離,可以先求出南北方向距離LY,然后求出東西方向距離LX,最后求矩形對角線距離,即
圖2 經(jīng)緯度近似垂直情況下兩點(diǎn)間距離的計(jì)算
其中 toRadians(θ)=θ×PI/180 (7)
根據(jù)公式(4)、(5)、(6)、(7)最終得出:
下面主要從兩個(gè)方面來驗(yàn)證本文優(yōu)化方案:第一是可靠性,主要驗(yàn)證優(yōu)化后的公式是否能滿足實(shí)際的需求;第二是高效性,主要是驗(yàn)證是否能減少手機(jī)的計(jì)算資源,提升性能。
因?yàn)樵谒惴?中,有兩處需要用到距離計(jì)算:一個(gè)是計(jì)算當(dāng)前位置與下一個(gè)站點(diǎn)的距離,一般兩個(gè)相鄰的公交車站的距離在2 km以內(nèi);另外一個(gè)是計(jì)算當(dāng)前位置與目的站點(diǎn)的距離,兩個(gè)站點(diǎn)是在一個(gè)城市內(nèi),所以一般距離不會(huì)超過200 km。在這兩種情況下,因?yàn)榫嚯x較小,可以近似認(rèn)為經(jīng)線跟緯線是垂直的,所以采用優(yōu)化后的距離計(jì)算公式(8)來計(jì)算距離。通過前面分析可知Haversine距離計(jì)算公式(3)算出來的距離是最準(zhǔn)確的,在表1中通過設(shè)置幾對不同數(shù)量級別距離的測試點(diǎn)來驗(yàn)證通過優(yōu)化后的距離計(jì)算公式(8)與Haversine距離計(jì)算公式(3)兩種方法計(jì)算出來的誤差。從表1的測試結(jié)果分析得出,公式(8)在幾千米的距離內(nèi)誤差為0;在幾萬米的范圍內(nèi),誤差為10 cm左右;在290 km左右的距離,誤差僅為10 m左右,完全滿足APP精度的需求。因此,可以得出優(yōu)化后的公式(8)可靠性是滿足算法2的需求。
前面驗(yàn)證公式的可靠性,它能很好地滿足對距離計(jì)算的要求。下面驗(yàn)證優(yōu)化后公式的高效性。三角函數(shù)的計(jì)算是一種運(yùn)算量比較大,占用時(shí)間比較長的運(yùn)算,所以通過采用減少三角函數(shù)計(jì)算次數(shù)的方式來降低運(yùn)算時(shí)間。通過比較公式(8)與公式(3),可以清楚看到公式(3)要進(jìn)行5次三角函數(shù)的計(jì)算,而公式(8)只需要進(jìn)行1次的三角函數(shù)計(jì)算。假設(shè)在算法2中,要進(jìn)行2 000次的距離計(jì)算。通過優(yōu)化,從原來需要進(jìn)行10 000次三角函數(shù)運(yùn)算降低到2 000次,減少了80%的計(jì)算資源,大大降低了手機(jī)的計(jì)算時(shí)間,對于實(shí)時(shí)性要求高的手機(jī)應(yīng)用來說是至關(guān)重要的。為了驗(yàn)證優(yōu)化后的效果,在處理器為8核,運(yùn)行內(nèi)存為3 GB,操作系統(tǒng)為Android4.4.2的華為榮耀6手機(jī)測試,在單線程環(huán)境下執(zhí)行1千次、5千次、1萬次、5萬次、10萬次距離計(jì)算公式,計(jì)算出每種狀態(tài)下的耗時(shí)情況,如圖3所示。通過耗時(shí)曲線圖可以得到,在執(zhí)行同樣次數(shù)的距離公式,優(yōu)化后的距離計(jì)算公式耗時(shí)大概是Haversine距離計(jì)算公式的1/7,大大提升了計(jì)算效率,因此提高了算法的性能。
表1 優(yōu)化后距離計(jì)算公式(8)與Haversine距離計(jì)算公式(3)可靠性驗(yàn)證
圖3 Haversine公式與優(yōu)化后公式耗時(shí)對比情況
通過上面數(shù)據(jù)驗(yàn)證,優(yōu)化后的距離計(jì)算公式一方面既滿足距離計(jì)算機(jī)精確度,也因?yàn)闇p少了大量反三角函數(shù)的計(jì)算量從而提高了計(jì)算效率,提升了算法的性能,滿足APP的實(shí)際需求。接下來是利用優(yōu)化后的距離計(jì)算公式(8)設(shè)計(jì)基于心跳包機(jī)制的站點(diǎn)實(shí)時(shí)監(jiān)測與到站提醒算法。算法具體步驟如下:
算法2基于心跳包機(jī)制的站點(diǎn)實(shí)時(shí)監(jiān)測與到站提醒算法
1.初始化:將算法1生成的最近站點(diǎn)與所選目的站點(diǎn)之間的站點(diǎn)數(shù)量設(shè)定為變量n,設(shè)置常量dconstant用來判定是否到站。Tlast_health為上次收到心跳包時(shí)間,Tcurrent為當(dāng)前時(shí)間,Ttimeout為設(shè)定的超時(shí)時(shí)間。
2.if((Tcurrent-Tlast_health<=Ttimeout)
//判斷心跳包是否超時(shí),如果不超時(shí)執(zhí)行如下操作
3.通過GPS獲取當(dāng)前用戶的位置Lu(latnow,lngnow)
4.從位置列表獲取當(dāng)前時(shí)刻下一個(gè)站點(diǎn)位置Lnext
5. 通過公式(8)計(jì)算當(dāng)前位置Lu與下一站點(diǎn)Lnext之間的距離dnext
6.if(dnext<=dconstant)
7.n-- //距離目的地站點(diǎn)個(gè)數(shù)減1
8.更新下一個(gè)站點(diǎn)位置,重置Lnext
9.通過公式(8)計(jì)算當(dāng)前站點(diǎn)與目的地的距離并在界面顯示。
10.if(n<=3)
11.啟動(dòng)到站提醒
12.end if
13.end if
14.end if
通過聚合數(shù)據(jù)API[16]中的全國公交及路徑規(guī)劃查詢接口獲取指定公交路線的所有站點(diǎn)的信息,包括對應(yīng)線路所有途徑站點(diǎn)名字、站點(diǎn)序號(hào)、站點(diǎn)經(jīng)緯度等信息。全國公交及路徑規(guī)劃查詢接口的地址為:http://op.juhe.cn/189/bus/busline,支持的格式為json/xml,當(dāng)需要獲取對應(yīng)公交線路的所以站點(diǎn)信息時(shí),只需要傳入key、city、bus三個(gè)參數(shù)值,分別對應(yīng)授權(quán)密鑰、城市、公交路線。請求格式如:http://op.juhe.cn/189/bus/busline?key=xx&city=yy&bus=zz(其中xx、yy、zz代表對應(yīng)參數(shù)值)。將獲取到的線路站點(diǎn)信息進(jìn)行存儲(chǔ),提供給線路查詢、最近站點(diǎn)生成、站點(diǎn)監(jiān)測、到站提醒使用。如圖4就是在線路查詢中得到的線路的所有站點(diǎn)。
圖4 搜索路線以及站點(diǎn)
為了提升開發(fā)效率,能同時(shí)開發(fā)Android與iOS平臺(tái)的應(yīng)用,考慮采用移動(dòng)跨平臺(tái)開發(fā)技術(shù),目前主流的跨平臺(tái)開發(fā)技術(shù)有React Native、ionic、APPCan[12-15]。其中APPCan是國內(nèi)知名的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)工具,利用HTML5技術(shù)快速開發(fā)出Android、iOS平臺(tái)上的移動(dòng)應(yīng)用,它分為5個(gè)層次。最底層是移動(dòng)操作平臺(tái),目前支持iOS和Android。第4層是封裝好的各種通用組件庫,主要有統(tǒng)計(jì)分析、消息推送、網(wǎng)絡(luò)管理等。第3層是管理層,主要包括應(yīng)用管理、插件的統(tǒng)一管理注冊以及相關(guān)的插件組件模塊。第2層是Window manager,它負(fù)責(zé)網(wǎng)頁面界面渲染和實(shí)現(xiàn)原生插件的調(diào)用。第1層是開發(fā)者使用HTML5來實(shí)現(xiàn)應(yīng)用開發(fā)[12]。
首先利用APPCan的uexLocation來進(jìn)行定位[12],它能同時(shí)使用GPS、GPRS、WIFI三種方式聯(lián)合定位,取最先返回值。首先利用uexLocation的openLocation()方法打開定位功能,返回當(dāng)前移動(dòng)設(shè)備所在地經(jīng)緯度信息,同時(shí)可以利用onChange()方法來監(jiān)聽移動(dòng)設(shè)備位置變化。前面已經(jīng)實(shí)現(xiàn)通過第三方數(shù)據(jù)平臺(tái)獲取公交線路所有站點(diǎn)信息。在自動(dòng)站點(diǎn)生成功能的實(shí)現(xiàn)中,可以將剛剛獲取的當(dāng)前移動(dòng)設(shè)備的經(jīng)緯度信息與公交線路的站點(diǎn)信息作為輸入,利用基于Haversine的最近站點(diǎn)自動(dòng)生成算法自動(dòng)計(jì)算出最優(yōu)的上車站點(diǎn),并反饋到頁面進(jìn)行顯示,如圖5所示。
圖5 自動(dòng)生成最近站點(diǎn)
站點(diǎn)實(shí)時(shí)監(jiān)測與報(bào)站,主要是通過前面所設(shè)計(jì)算法2來實(shí)現(xiàn),通過不斷監(jiān)測當(dāng)前位置與下一站點(diǎn)之間的距離,從而給用戶呈現(xiàn)與下一站點(diǎn)的距離、與目的地的距離、距離目的地站數(shù)等信息,實(shí)現(xiàn)效果如圖6所示。
圖6 實(shí)時(shí)報(bào)站
到站提醒功能是當(dāng)算法2檢測所剩站點(diǎn)數(shù)目小于等于3時(shí),每到一站就震動(dòng)受,到達(dá)最后一站時(shí)改為響鈴。震動(dòng)和響鈴可通過AppCan內(nèi)置框架對手機(jī)硬件設(shè)備調(diào)用[12]。其中震動(dòng)功能可以通過uexDevice的vibrate(milliseconds)方法來啟動(dòng)移動(dòng)設(shè)備的震動(dòng),cancelVibrate()方法來關(guān)閉設(shè)備震動(dòng)。響鈴功能通過調(diào)用uex-Audio來進(jìn)行音頻文件的播放與停止,首先通過uexAudio.open(url)打開鈴聲或者歌曲鏈接,通過uexAudio.play(repeats)啟動(dòng)播放,通過uexAudio.stop()停止播放。
為了解決在沒有城市實(shí)時(shí)公交車數(shù)據(jù)的情況下實(shí)現(xiàn)智慧公交提醒服務(wù),本文提出利用開源的公交線路信息與移動(dòng)終端的感知數(shù)據(jù)融合的解決方案,并在這個(gè)方案基礎(chǔ)上設(shè)計(jì)最近站點(diǎn)自動(dòng)生成算法、實(shí)時(shí)監(jiān)測與到站提醒算法;接著通過優(yōu)化距離計(jì)算公式提升計(jì)算時(shí)間復(fù)雜度,從而提升算法的性能;最后利用移動(dòng)跨平臺(tái)框架APPCan實(shí)現(xiàn)智慧公交APP,通過測試驗(yàn)證表明其能很好地滿足用戶智慧公交提醒的需求。