潘志宏,萬智萍,謝海明
1.中山大學 新華學院,廣州 510520
2.廣東移動通信有限責任公司 茂名分公司,廣東 茂名 525000
近年來,隨著物聯網與移動互聯網技術快速發展,國家不斷推進智慧城市建設,其中城市交通是智慧城市重點解決的問題之一。伴隨車聯網、智慧公交、共享單車不斷的深入應用,如何利用現有的物聯網、移動互聯網、大數據等技術來提升城市交通效率,實現智慧交通是目前國內外研究的熱點[1-5]。公交系統作為城市交通的重要組成部分,出現了針對智慧公交APP,比如車來了、掌上公交等,它們通過與政府交通部門合作,授權獲取城市公交車的實時位置信息,從而給用戶提供上車前查詢的服務,和上車后的智能提醒服務。這種方案通過安裝在公交車的特定傳感器進行實時數據收集,并將數據存儲于政府交通部門的云服務器,這部分數據非常精確,但是出于城市安全問題考慮,這部分數據并不會對外開放,必須是有資質的公司通過與政府合作才能獲取數據,另外它也具有一定的局限性,比如當部分公交車實時數據采集和回傳出現異常時,APP會因為數據的異常導致相應服務中斷,產生不好的用戶體驗,例如會因為用戶所乘坐的公交車實時數據產生異常,使用戶無法得到實時的報站信息,甚至因此錯過下車站點。為了解決數據缺失問題,近年來很多學者利用智能終端的移動感知能力來解決城市交通問題,比如Farkas等人[4]提出基于移動群智感知的城市公交信息服務平臺,通過乘客移動終端感知數據與公交站點事件檢測器監控相融合的方法來獲得公交車的實時信息。Manali等人[5]提出基于參與式感知技術利用乘客智能終端收集公交車的實時軌跡,最終給用戶提供公交車到站信息。Srinivasan等人[7]通過收集手機GPS軌跡數據從而獲得城市公交車站點信息。
為了解決上述城市公交實時數據缺失問題,本文提出了利用開源的公交線路信息與移動終端的感知數據相互融合的解決方案[5-9],方案實現在沒有獲得交通部門實時數據的情況下,給用戶提供上車后智能提醒服務,包含實時報站與到站提醒功能。本文的貢獻在于,首先提出基于Haversine[10-11]的最近站點自動生成算法和基于心跳包機制的站點實時監測與到站提醒算法;其次通過優化距離計算公式方法來降低空間距離計算時間復雜度,從而提升算法的性能;最后利用移動跨平臺框架[12-15]APPCan實現智慧公交APP,它很好地兼容Android、iOS等多種移動操作系統,并具有實時報站、到站提醒、公交線路查詢、最近上車站點自動生成等功能。
公交系統作為目前城市出行的重要組成部分,如何給市民乘坐公交系統出行提供智慧服務,是目前實現智慧出行重要的一步。本文主要針對智慧公交中的實時報站與到站提醒功能設計一款APP,解決用戶在公共汽車上因為專注于其他事情而引起誤站的問題,又或者到陌生地方乘坐公交系統因為對站點不熟悉而錯站的問題。主要包括查詢站點、實時報站、到站提醒等功能。圖1給出了系統的功能流程圖。
功能描述如下:(1)查詢路線站點,用戶輸入路線并點擊確認后會在下方呈現該路線的所有站點的列表,并提示用戶點擊選擇目的地;(2)自動生成最近的站點,用戶在點擊選擇目的地站點后,系統會根據Haversine最近站點自動生成算法生成用戶上車的最佳站點;(3)手動選擇上車站點,如果系統自動生成的站點不準確,用戶可手動更改上車站點;(4)實時報站,用戶在確認了基本乘車信息,包括公交路線、目標站點和上車站點之后開始實時報站,系統會根據心跳包機制的站點實時監測算法檢測公交車是否到站,并自動刷新頁面對用戶反饋;(5)到站提醒,當用戶距離目標站點還剩3個站的時候,每到一個站,手機會震動進行提醒。在用戶到達最后一站時會響鈴提醒。

圖1 系統功能流程圖
獲取用戶輸入的公交路線,將其作為參數添加至API請求鏈接中,然后向第三方數據平臺聚合數據的路線信息API進行請求。數據平臺將公交路線的數據返回給移動終端,移動終端將公交路線的站點信息進行存放,同時將所有站點以列表的形式進行顯示。
當用戶選擇公交路線后,移動終端能夠根據算法自動生成搭車的最佳站點。首先通過移動終端GPS獲取用戶所在位置,然后將其與整個路線的所有站點進行對比距離,最后輸出距離用戶最近的站點。根據Haversine公式[10-11]可得到如下公式:

其中hav函數滿足如下條件:

最終根據公式(1)跟(2)求得兩點的距離為:

公式(1)跟(3)中的lat表示緯度,lng表示經度,也即是(lat2,lng2)和(lat1,lng1)表示兩個坐標點 L2和 L1的經緯度,r為地球半徑。這里需要注意的是在編程實現的時候,必須把三角函數的參數轉換為弧度,也即是參數需要乘上PI/180。
算法1基于Haversine的最近站點自動生成算法
1.Initialize:獲取用戶的位置,緯度為latu,經度為lngu,獲取整條路線所有站點的經緯度,構成站點列表L={L1(lat1,lng1]),L2(lat2,lng2),…,Ln(latn,lngn)},創建數組ArrayD用來存放用戶與所有站點之間的距離。
2.for each Liin L
3. 利用公式(3)計算用戶當前位置與列表L中每個節點的距離di。
4. 將di存入數組ArrayD
5.end for
6.對數組ArrayD進行升序排列
7.獲取ArrayD最小值dimin,并將最小值對應的Li站點進行返回。
因為考慮到城市實際的道路復雜情況,有時候地理位置最近的站點不一定是步行最佳的站點,所以在智慧公交APP中增加手動選擇上車站點功能。該功能在確認乘車信息的界面中增加“手動選擇上車站點”選擇列表,把該路線的所有站點作為列表選項,用戶可以選擇站點來替換系統自動生成的最近站點。
目前市面上智慧公交APP基本都是通過獲取政府交通部門的授權,獲取公交車的實時位置信息來提供實時報站和到站提醒服務,本文研究的是通過用戶移動終端感知數據與免費開源交通數據的融合,從而獲取用戶所在公交車的位置與站點之間的關系,來給用戶提供實時報站與到站提醒服務[5-9]。該功能使用“心跳包”機制來實現即時監測,即在時間間隔內反復執行心跳包函數,心跳包函數主要完成當前公交車所到站點的檢測和是否到達目的站點的判斷。其中所到站點實時監測主要是通過計算當前公交車與下一站之間的實時距離,當距離小于閥值是判定車輛到站,然后自動刷新一次頁面反饋信息。而到站提醒功能是在站點實時監測的基本上,通過當前所到站點與目的站點之間的距離和站點數來進行判定是否到站或者是否需要啟動提醒,當心跳包檢測所剩站點數目小于等于3時,每到一站就震動受,到達最后一站時改為響鈴。
因為心跳包每隔2 s就會發出請求一次,假設一次車程需要1 h,需要經過20個站點,根據算法2可知至少需要執行1 820次距離計算。在算法1中,只需要調用幾十次(線路所有站點個數)距離計算就實現功能,所以距離計算公式(3)完全能滿足算法1的性能需求。但是由于執行公式(3)中的三角函數會消耗很多移動終端的計算資源,特別是距離計算次數達到幾千次級別時,APP性能會下降非常多,所以必須對距離計算公式(3)進行優化,讓它滿足算法2背景下的距離計算。
APP應用場景一般是限定在一個城市的范圍內進行,也即是兩個站點間的距離不會超過200 km。由于范圍小,可以近似認為經線和所緯線是垂直的,假設如圖2示,要求計算 X(113.4,23.10)和Y(113.5,23.20)兩點的距離,可以先求出南北方向距離LY,然后求出東西方向距離LX,最后求矩形對角線距離,即

圖2 經緯度近似垂直情況下兩點間距離的計算

其中 toRadians(θ)=θ×PI/180 (7)
根據公式(4)、(5)、(6)、(7)最終得出:

下面主要從兩個方面來驗證本文優化方案:第一是可靠性,主要驗證優化后的公式是否能滿足實際的需求;第二是高效性,主要是驗證是否能減少手機的計算資源,提升性能。
因為在算法2中,有兩處需要用到距離計算:一個是計算當前位置與下一個站點的距離,一般兩個相鄰的公交車站的距離在2 km以內;另外一個是計算當前位置與目的站點的距離,兩個站點是在一個城市內,所以一般距離不會超過200 km。在這兩種情況下,因為距離較小,可以近似認為經線跟緯線是垂直的,所以采用優化后的距離計算公式(8)來計算距離。通過前面分析可知Haversine距離計算公式(3)算出來的距離是最準確的,在表1中通過設置幾對不同數量級別距離的測試點來驗證通過優化后的距離計算公式(8)與Haversine距離計算公式(3)兩種方法計算出來的誤差。從表1的測試結果分析得出,公式(8)在幾千米的距離內誤差為0;在幾萬米的范圍內,誤差為10 cm左右;在290 km左右的距離,誤差僅為10 m左右,完全滿足APP精度的需求。因此,可以得出優化后的公式(8)可靠性是滿足算法2的需求。
前面驗證公式的可靠性,它能很好地滿足對距離計算的要求。下面驗證優化后公式的高效性。三角函數的計算是一種運算量比較大,占用時間比較長的運算,所以通過采用減少三角函數計算次數的方式來降低運算時間。通過比較公式(8)與公式(3),可以清楚看到公式(3)要進行5次三角函數的計算,而公式(8)只需要進行1次的三角函數計算。假設在算法2中,要進行2 000次的距離計算。通過優化,從原來需要進行10 000次三角函數運算降低到2 000次,減少了80%的計算資源,大大降低了手機的計算時間,對于實時性要求高的手機應用來說是至關重要的。為了驗證優化后的效果,在處理器為8核,運行內存為3 GB,操作系統為Android4.4.2的華為榮耀6手機測試,在單線程環境下執行1千次、5千次、1萬次、5萬次、10萬次距離計算公式,計算出每種狀態下的耗時情況,如圖3所示。通過耗時曲線圖可以得到,在執行同樣次數的距離公式,優化后的距離計算公式耗時大概是Haversine距離計算公式的1/7,大大提升了計算效率,因此提高了算法的性能。

表1 優化后距離計算公式(8)與Haversine距離計算公式(3)可靠性驗證

圖3 Haversine公式與優化后公式耗時對比情況
通過上面數據驗證,優化后的距離計算公式一方面既滿足距離計算機精確度,也因為減少了大量反三角函數的計算量從而提高了計算效率,提升了算法的性能,滿足APP的實際需求。接下來是利用優化后的距離計算公式(8)設計基于心跳包機制的站點實時監測與到站提醒算法。算法具體步驟如下:
算法2基于心跳包機制的站點實時監測與到站提醒算法
1.初始化:將算法1生成的最近站點與所選目的站點之間的站點數量設定為變量n,設置常量dconstant用來判定是否到站。Tlast_health為上次收到心跳包時間,Tcurrent為當前時間,Ttimeout為設定的超時時間。
2.if((Tcurrent-Tlast_health<=Ttimeout)
//判斷心跳包是否超時,如果不超時執行如下操作
3.通過GPS獲取當前用戶的位置Lu(latnow,lngnow)
4.從位置列表獲取當前時刻下一個站點位置Lnext
5. 通過公式(8)計算當前位置Lu與下一站點Lnext之間的距離dnext
6.if(dnext<=dconstant)
7.n-- //距離目的地站點個數減1
8.更新下一個站點位置,重置Lnext
9.通過公式(8)計算當前站點與目的地的距離并在界面顯示。
10.if(n<=3)
11.啟動到站提醒
12.end if
13.end if
14.end if
通過聚合數據API[16]中的全國公交及路徑規劃查詢接口獲取指定公交路線的所有站點的信息,包括對應線路所有途徑站點名字、站點序號、站點經緯度等信息。全國公交及路徑規劃查詢接口的地址為:http://op.juhe.cn/189/bus/busline,支持的格式為json/xml,當需要獲取對應公交線路的所以站點信息時,只需要傳入key、city、bus三個參數值,分別對應授權密鑰、城市、公交路線。請求格式如:http://op.juhe.cn/189/bus/busline?key=xx&city=yy&bus=zz(其中xx、yy、zz代表對應參數值)。將獲取到的線路站點信息進行存儲,提供給線路查詢、最近站點生成、站點監測、到站提醒使用。如圖4就是在線路查詢中得到的線路的所有站點。

圖4 搜索路線以及站點
為了提升開發效率,能同時開發Android與iOS平臺的應用,考慮采用移動跨平臺開發技術,目前主流的跨平臺開發技術有React Native、ionic、APPCan[12-15]。其中APPCan是國內知名的跨平臺移動應用開發工具,利用HTML5技術快速開發出Android、iOS平臺上的移動應用,它分為5個層次。最底層是移動操作平臺,目前支持iOS和Android。第4層是封裝好的各種通用組件庫,主要有統計分析、消息推送、網絡管理等。第3層是管理層,主要包括應用管理、插件的統一管理注冊以及相關的插件組件模塊。第2層是Window manager,它負責網頁面界面渲染和實現原生插件的調用。第1層是開發者使用HTML5來實現應用開發[12]。
首先利用APPCan的uexLocation來進行定位[12],它能同時使用GPS、GPRS、WIFI三種方式聯合定位,取最先返回值。首先利用uexLocation的openLocation()方法打開定位功能,返回當前移動設備所在地經緯度信息,同時可以利用onChange()方法來監聽移動設備位置變化。前面已經實現通過第三方數據平臺獲取公交線路所有站點信息。在自動站點生成功能的實現中,可以將剛剛獲取的當前移動設備的經緯度信息與公交線路的站點信息作為輸入,利用基于Haversine的最近站點自動生成算法自動計算出最優的上車站點,并反饋到頁面進行顯示,如圖5所示。

圖5 自動生成最近站點
站點實時監測與報站,主要是通過前面所設計算法2來實現,通過不斷監測當前位置與下一站點之間的距離,從而給用戶呈現與下一站點的距離、與目的地的距離、距離目的地站數等信息,實現效果如圖6所示。

圖6 實時報站
到站提醒功能是當算法2檢測所剩站點數目小于等于3時,每到一站就震動受,到達最后一站時改為響鈴。震動和響鈴可通過AppCan內置框架對手機硬件設備調用[12]。其中震動功能可以通過uexDevice的vibrate(milliseconds)方法來啟動移動設備的震動,cancelVibrate()方法來關閉設備震動。響鈴功能通過調用uex-Audio來進行音頻文件的播放與停止,首先通過uexAudio.open(url)打開鈴聲或者歌曲鏈接,通過uexAudio.play(repeats)啟動播放,通過uexAudio.stop()停止播放。
為了解決在沒有城市實時公交車數據的情況下實現智慧公交提醒服務,本文提出利用開源的公交線路信息與移動終端的感知數據融合的解決方案,并在這個方案基礎上設計最近站點自動生成算法、實時監測與到站提醒算法;接著通過優化距離計算公式提升計算時間復雜度,從而提升算法的性能;最后利用移動跨平臺框架APPCan實現智慧公交APP,通過測試驗證表明其能很好地滿足用戶智慧公交提醒的需求。