孫 健 李少彬
(南京公共交通(集團(tuán))有限公司,南京 210037)
合理科學(xué)的公交調(diào)度和線網(wǎng)規(guī)劃,可以緩解城市快速發(fā)展、人口激增、出行需求大幅度上升引起的交通擁擠、交通安全事故等普遍問(wèn)題。而公交調(diào)度和線網(wǎng)規(guī)劃也依賴于對(duì)海量客流的全面、精準(zhǔn)分析和統(tǒng)計(jì)。國(guó)內(nèi)外研究學(xué)者通過(guò)運(yùn)用海量IC卡數(shù)據(jù),結(jié)合車輛GPS數(shù)據(jù),對(duì)客流建立多維度數(shù)學(xué)模型,從客流OD、候車時(shí)長(zhǎng)、客流擁堵等方面分析客流特征和規(guī)律。本文通過(guò)原始刷卡數(shù)據(jù)中已經(jīng)提供的線路編碼、車輛編碼、刷卡經(jīng)緯度、刷卡時(shí)間,結(jié)合車輛調(diào)度信息以及地理信息系統(tǒng)提供的線路下各站點(diǎn)經(jīng)緯度信息,通過(guò)經(jīng)緯度坐標(biāo)投影算法以及車輛實(shí)時(shí)調(diào)度信息的查詢計(jì)算,得出精確的刷卡站點(diǎn)信息。同時(shí)利用redis數(shù)據(jù)庫(kù)內(nèi)存高吞吐的特性,實(shí)時(shí)過(guò)濾清洗刷卡設(shè)備記錄到的重復(fù)刷卡數(shù)據(jù)。刷卡站點(diǎn)信息反映了各線路各站點(diǎn)客流量的高低,對(duì)整個(gè)公交線路的運(yùn)營(yíng)具有指導(dǎo)意義,對(duì)客流量擁擠地區(qū)的治安管理也具有一定的參考價(jià)值。
原始刷卡數(shù)據(jù)只包含了部分信息:
(1)車輛注冊(cè)線路編碼。線路編碼是市民卡中心對(duì)線路名稱的一種規(guī)范。同時(shí),在本地?cái)?shù)據(jù)庫(kù)維護(hù)一張線路編碼和線路名稱一一對(duì)應(yīng)的映射關(guān)系表。
這樣做的好處在于:存儲(chǔ)線路編碼比存儲(chǔ)線路名稱更節(jié)約數(shù)據(jù)庫(kù)空間,而且查詢線路編碼比查詢線路名稱更快。
(2)車輛編碼。車輛編碼也是市民卡中心對(duì)車輛名稱的一種規(guī)范。
(3)刷卡經(jīng)緯度、刷卡時(shí)間。這兩者分別記錄了刷卡所在的空間和時(shí)間上的信息??臻g的信息可以用于計(jì)算線路上各個(gè)站點(diǎn)的距離,時(shí)間的信息可以用于查詢當(dāng)前車輛所在的實(shí)時(shí)調(diào)度信息。
調(diào)度信息指的是車輛的進(jìn)出站信息,包括:
(1)車輛實(shí)際運(yùn)營(yíng)線路編碼。車輛所在的運(yùn)行線路編碼區(qū)別于原始刷卡數(shù)據(jù)中的注冊(cè)線路編碼,實(shí)際運(yùn)營(yíng)中,車輛可能會(huì)被臨時(shí)調(diào)度至其他線路運(yùn)營(yíng)。
本文計(jì)算中,刷卡數(shù)據(jù)屬于哪個(gè)線路、哪個(gè)站點(diǎn)以實(shí)際調(diào)度信息為準(zhǔn),可以精確反映公交車輛的實(shí)時(shí)運(yùn)營(yíng)情況。
(2)線路上下行。車輛在某條線路上運(yùn)行,根據(jù)運(yùn)行方向的不同,可以規(guī)定為上行和下行。
(3)站點(diǎn)信息。站點(diǎn)信息指的是該時(shí)刻車輛“進(jìn)”或“出”的站點(diǎn)。
車輛實(shí)時(shí)調(diào)度信息緩存在redis數(shù)據(jù)庫(kù),利用其內(nèi)存高吞吐的特性,為原始刷卡數(shù)據(jù)實(shí)時(shí)計(jì)算刷卡站點(diǎn)提供了高性能的數(shù)據(jù)庫(kù)查詢條件。
地理信息系統(tǒng)為我們提供了精確的位置信息,為了計(jì)算方便,在mysql數(shù)據(jù)庫(kù)中維護(hù)了一張線路與站點(diǎn)的靜態(tài)信息表。包含了各線路下所有站點(diǎn)的經(jīng)緯度信息、上下行信息、各站點(diǎn)上一個(gè)站點(diǎn)和下一個(gè)站點(diǎn)的信息,見(jiàn)表1樣例。
表1 線路經(jīng)過(guò)的站點(diǎn)數(shù)據(jù)樣例
計(jì)算刷卡站點(diǎn)主要考慮兩種算法,分別為:
(1)坐標(biāo)投影算法,基于刷卡經(jīng)緯度和站點(diǎn)經(jīng)緯度計(jì)算刷卡站點(diǎn)。
(2)調(diào)度信息計(jì)算刷卡站點(diǎn),基于刷卡時(shí)間和車輛的進(jìn)出站時(shí)間計(jì)算刷卡站點(diǎn)。
兩種算法各有優(yōu)缺點(diǎn),本文結(jié)合兩種算法,得到較為精準(zhǔn)的刷卡站點(diǎn)。
原始刷卡數(shù)據(jù)記錄的是車輛注冊(cè)線路,因此需要通過(guò)車輛自編碼去redis或者mysql數(shù)據(jù)庫(kù)查詢車輛的進(jìn)出站數(shù)據(jù),進(jìn)出站數(shù)據(jù)中記錄的才是車輛真正的運(yùn)行線路。同時(shí)明確了上下行可以為第2步減少需要比對(duì)的站點(diǎn),提高計(jì)算效率。
計(jì)算刷卡經(jīng)緯度與所在線路上各站點(diǎn)經(jīng)緯度的距離。距離最小的站點(diǎn)記為minStopCode。最小距離記為minDistance。計(jì)算距離涉及到兩個(gè)部分。
(1)經(jīng)緯度轉(zhuǎn)換。地球表面是一個(gè)不規(guī)則的球面,為了便于說(shuō)明,以下用一個(gè)橢圓繞軸旋轉(zhuǎn)形成的球面來(lái)表示:
式中,R為赤道半徑,r為極軸半徑。由于推算資料的不同,R和r的值會(huì)有些許差異,本文采用的是WGS-84橢球體[1,6],即R=6378137米,r=6356752.314米??紤]到計(jì)算距離時(shí)需要使用同一套坐標(biāo)系,對(duì)線路下各站點(diǎn)的經(jīng)緯度進(jìn)行坐標(biāo)系轉(zhuǎn)換。舉例說(shuō)明:(118.484871, 32.043482)經(jīng)緯度轉(zhuǎn)換后為(118.808118, 32.07247)。
(2)經(jīng)緯度計(jì)算距離。影響兩點(diǎn)之間距離計(jì)算的兩個(gè)因素:
a.經(jīng)度每度的距離,即弧長(zhǎng)。緯度越小,弧長(zhǎng)越大,反之,則越小。
b.緯度每度的距離大概是相等的,約為111000米。
計(jì)算某個(gè)緯度下經(jīng)度平均每一度距離S[2-3]的公式如下:
式中,B為所在區(qū)域的緯度。
考慮到我們計(jì)算所在的目標(biāo)區(qū)域緯度范圍為:北緯31°14′至32°37′。因此分別將這兩個(gè)緯度值代入公式(2),對(duì)兩個(gè)計(jì)算的結(jié)果取平均值,為97850.268米。用這個(gè)值進(jìn)行兩個(gè)點(diǎn)之間距離的計(jì)算[4-5]。舉例說(shuō)明:刷卡經(jīng)緯度(118.778736,32.051028)和轉(zhuǎn)換后的站點(diǎn)經(jīng)緯度(118.778835,32.051083)計(jì)算距離為11.2米。
如果minDistance≤50米,則取對(duì)應(yīng)的站點(diǎn)作為刷卡站點(diǎn)。
如果minDistanc>50米,則說(shuō)明刷卡點(diǎn)距離最近的站點(diǎn)都比較遠(yuǎn),不好判別刷卡站點(diǎn)。進(jìn)行第3步。
存在以下兩種異常情況:
(1)原始刷卡數(shù)據(jù)無(wú)刷卡經(jīng)緯度,這是由刷卡設(shè)備或者車輛GPS設(shè)備異常導(dǎo)致的。
(2)經(jīng)緯度坐標(biāo)投影算法計(jì)算的最近站點(diǎn)距離都大于50米,這可能是人為原因?qū)е碌摹?/p>
上述兩種情況都會(huì)導(dǎo)致原始刷卡數(shù)據(jù)計(jì)算不到刷卡站點(diǎn)。因此需要通過(guò)刷卡時(shí)間和車輛的進(jìn)出站信息去進(jìn)一步尋找刷卡站點(diǎn)。通過(guò)調(diào)度信息尋找刷卡站點(diǎn)的依據(jù)可以概括為以下公式:
式中,adTime為車輛的進(jìn)出站時(shí)間,swipeTime為刷卡時(shí)間。整個(gè)公式的含義是:取調(diào)度信息中該車輛的進(jìn)出站時(shí)間小于刷卡時(shí)間,且是最大的一個(gè)進(jìn)出站時(shí)間,所對(duì)應(yīng)的站點(diǎn)作為刷卡站點(diǎn)。
圖1 刷卡站點(diǎn)計(jì)算流程圖
原始刷卡數(shù)據(jù)是通過(guò)activemq點(diǎn)對(duì)點(diǎn)的方式主動(dòng)推送過(guò)來(lái)的,在進(jìn)行站點(diǎn)計(jì)算之前我們首先借助redis數(shù)據(jù)庫(kù)內(nèi)存高吞吐的特性,對(duì)實(shí)時(shí)過(guò)來(lái)的刷卡數(shù)據(jù)進(jìn)行去重,清洗掉重復(fù)數(shù)據(jù)。如果刷卡時(shí)間早于當(dāng)前系統(tǒng)時(shí)間20分鐘以上,則暫時(shí)放置在緩沖隊(duì)列,記為隊(duì)列3,新開(kāi)一個(gè)線程基于歷史的進(jìn)出站數(shù)據(jù),采用車輛調(diào)度算法計(jì)算刷卡站點(diǎn),否則刷卡數(shù)據(jù)暫時(shí)放置在另一個(gè)緩沖隊(duì)列,記為隊(duì)列1。新開(kāi)一個(gè)線程,基于車輛實(shí)時(shí)進(jìn)出站信息尋找運(yùn)行線路和線路方向,同時(shí)采用坐標(biāo)投影算法,計(jì)算刷卡站點(diǎn),記為線程1。這樣設(shè)計(jì)的好處在于提高程序的計(jì)算性能,線程1中對(duì)于無(wú)經(jīng)緯度和最小距離misDistance大于50米的刷卡數(shù)據(jù),由于算法不一樣,暫時(shí)放置在一個(gè)新的緩沖隊(duì)列,記為隊(duì)列2。新開(kāi)一個(gè)線程2處理隊(duì)列2中的刷卡數(shù)據(jù),線程2只處理無(wú)經(jīng)緯度和最小距離misDistance大于50米的刷卡數(shù)據(jù),而這些數(shù)據(jù)依賴于車輛的調(diào)度信息,由于車輛調(diào)度信息是2分鐘從接口獲取一次,因此進(jìn)出站數(shù)據(jù)可能存在延遲,此時(shí)隊(duì)列2就發(fā)揮它的作用了,對(duì)于這些不具備處理?xiàng)l件的刷卡數(shù)據(jù)(刷卡時(shí)間大于調(diào)度信息里面最大的進(jìn)出站時(shí)間,代表進(jìn)出站數(shù)據(jù)延遲),隊(duì)列2會(huì)暫時(shí)“保管”,直到延遲的進(jìn)出站數(shù)據(jù)過(guò)來(lái)。這里需要考慮一個(gè)異常情況,比如說(shuō):進(jìn)出站數(shù)據(jù)接口出問(wèn)題了,就會(huì)出現(xiàn)進(jìn)出站數(shù)據(jù)永遠(yuǎn)延遲的情況。
此時(shí)隊(duì)列2的數(shù)據(jù)就會(huì)越積越多,嚴(yán)重消耗內(nèi)存,最終影響程序的正常運(yùn)行。因此,這里還有一個(gè)機(jī)制,就是每次對(duì)隊(duì)列2中刷卡時(shí)間距離當(dāng)前系統(tǒng)時(shí)間超過(guò)20分鐘的刷卡數(shù)據(jù)進(jìn)行批量處理,保證隊(duì)列2的數(shù)據(jù)大小不會(huì)無(wú)窮地增大。
表3 站點(diǎn)刷卡分析統(tǒng)計(jì)
表2 不同推送時(shí)間的站點(diǎn)刷卡分析
以2020-07-15一整天的刷卡數(shù)據(jù)進(jìn)行分析,得出數(shù)據(jù)表2、表3。
通過(guò)表2可以看出,原始刷卡數(shù)據(jù)存在發(fā)送延遲的情況,但是數(shù)據(jù)量不大,僅占0.51%。后期也通過(guò)算法找到了部分刷卡數(shù)據(jù)對(duì)應(yīng)的刷卡站點(diǎn)。但是原始刷卡數(shù)據(jù)的延遲對(duì)刷卡站點(diǎn)計(jì)算的準(zhǔn)確性會(huì)一定的影響,尤其跟大屏展示站點(diǎn)實(shí)時(shí)刷卡數(shù)據(jù)量的理念是不符的。
圖2 線路分時(shí)段客流統(tǒng)計(jì)和各站點(diǎn)客流統(tǒng)計(jì)
通過(guò)表3可以看出,通過(guò)坐標(biāo)投影算法無(wú)法判斷刷卡站點(diǎn)的數(shù)據(jù)(包括:無(wú)經(jīng)緯度和misDistance>50米)大部分依然可以通過(guò)新的算法(根據(jù)刷卡時(shí)間和車輛調(diào)度信息判斷刷卡站點(diǎn))找到對(duì)應(yīng)的站點(diǎn)。
由于車輛進(jìn)出站數(shù)據(jù)中站點(diǎn)和上下行的對(duì)應(yīng)關(guān)系與各線路下各站點(diǎn)信息這個(gè)基礎(chǔ)表的對(duì)應(yīng)關(guān)系不符。例如:在進(jìn)出站數(shù)據(jù)中A站對(duì)應(yīng)的方向是:上行,但是在基礎(chǔ)表中A站對(duì)應(yīng)的方向是:下行。這種信息不符的情況導(dǎo)致了143條刷卡數(shù)據(jù)找不到刷卡站點(diǎn)。
總體匹配效果還是可以實(shí)際應(yīng)用的,正常發(fā)送的刷卡數(shù)據(jù)中找不到站點(diǎn)的數(shù)據(jù),僅占一天的3.63%。
圖2給出了6路兩個(gè)方向不同時(shí)段的客流數(shù)量,以及各站點(diǎn)所屬不同峰段的客流數(shù)量。不同時(shí)段的客流數(shù)量對(duì)于公交運(yùn)營(yíng)在不同時(shí)間段投入的人員部署具有參考意義,各站點(diǎn)所屬不同峰段的客流數(shù)量反映了客流分布的主要區(qū)域,對(duì)多熱點(diǎn)區(qū)域的治安和交通管理具有參考價(jià)值。本文基于時(shí)間和站點(diǎn)兩個(gè)維度的客流統(tǒng)計(jì)可以更精確更全面地反映公交乘客出行偏好規(guī)律。
本文利用GIS技術(shù)將線路站點(diǎn)客流量熱力圖層和地圖圖層疊加,通過(guò)熱力圖的方式展現(xiàn)了線路上各站點(diǎn)的客流分布情況。熱力圖支持分時(shí)段查詢,便于分析不同峰段的客流分布情況。圖3分別展示了南京市早晚高峰的客流分布特點(diǎn),對(duì)于公交分時(shí)段運(yùn)營(yíng)部署的調(diào)整具有指導(dǎo)意義,更能滿足乘客的出行需求。
圖3 南京市高峰期客流熱力分布
(1)本文針對(duì)南京地區(qū)的公交刷卡數(shù)據(jù),選取一組可以唯一標(biāo)識(shí)一條刷卡數(shù)據(jù)的特征值,借助redis數(shù)據(jù)庫(kù),利用其內(nèi)存的高吞吐特性,在實(shí)時(shí)接收數(shù)據(jù)的同時(shí),對(duì)重復(fù)的刷卡數(shù)據(jù)進(jìn)行清洗。避免了由于刷卡設(shè)備故障而導(dǎo)致的重復(fù)統(tǒng)計(jì)問(wèn)題。
(2)本文根據(jù)南京地區(qū)的實(shí)際地域特征和經(jīng)緯度分布情況,基于GIS進(jìn)行經(jīng)緯度轉(zhuǎn)換和距離計(jì)算,找到了部分較為準(zhǔn)確的刷卡站點(diǎn)。
(3)針對(duì)坐標(biāo)投影算法中不可避免出現(xiàn)的問(wèn)題:原始刷卡數(shù)據(jù)沒(méi)有經(jīng)緯度。所謂“巧婦難為無(wú)米之炊”,缺少了經(jīng)緯度這個(gè)必要條件,坐標(biāo)投影算法失效。此時(shí),車輛的調(diào)度信息就發(fā)揮作用了,結(jié)合刷卡數(shù)據(jù)本身包含的刷卡時(shí)間信息,依然可以判斷出刷卡站點(diǎn)。
(4)通過(guò)一天的刷卡數(shù)據(jù)分析,最終找不到刷卡站點(diǎn)的數(shù)據(jù)僅占3.63%。
(1)原始刷卡數(shù)據(jù)延遲對(duì)刷卡站點(diǎn)計(jì)算有一定的影響。本文的算法在實(shí)時(shí)計(jì)算方面準(zhǔn)確性更高些,但對(duì)于延遲過(guò)來(lái)的數(shù)據(jù),雖然絕大部分都能找到站點(diǎn),但是準(zhǔn)確性會(huì)受影響。
(2)進(jìn)出站數(shù)據(jù)和各線路下各站點(diǎn)基礎(chǔ)信息的不一致性導(dǎo)致了少量數(shù)據(jù)算不到刷卡站點(diǎn),這一點(diǎn)其實(shí)是可以避免的。