2017-12-18 207 views
4

我試圖實施某種個人實時總線跟蹤器,並且我被這個問題困住了:讓我們說A點是我的起源,E點是我的目的地。點B,C和D是定義公交車具體路線的航點。每隔15秒鐘我就會獲取公交車的最新位置,然後我需要向用戶顯示剩餘的預計時間,以便根據其路線到達目的地。Google maps API:根據預定義的路線計算剩餘時間

在Google Directions API中,每個停靠點都會被考慮進去,忽略公交車在指定路線內的當前位置。實際上,例如,如果我通過C點,那麼A,B和C點應該不在計算範圍內,因爲公交車已經停靠在這些點上。

如何使用GMaps API實現類似的功能?可能嗎?

編輯:如果有任何幫助,我在Node.js服務器上這樣做,我無法控制位置的更新間隔。這是因爲我對一個API進行外部調用,該API返回指定總線的位置。當然,我可以撥打多少次電話,但返回的位置只會每15秒更新一次。還有一個調用返回所有緯度/經度座標,構成路線,將它們用作Google Directions的路徑參數。

我明白,知道路線的起點和終點,並且知道路線上的公交車當前位置,我可以確定下一次撥打Google Directions API時必須考慮哪些路點。但是,我怎麼能確定巴士是否在路線內呢?我怎樣才能確定路線內的「進展」?我找不到一個明顯的方法來做到這一點。

UPDATE:

所以我跟着Loreda L的答案,並檢查是否我可以利用谷歌距離矩陣API,而不是谷歌的方向。但我仍然無法解決問題。例如,讓我們用這個調用示例:

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=-23.307339,-51.171461&destinations=-23.306628,-51.165768|-23.312134,-51.167751|-23.320006,-51.166655|-23.324167,-51.160821 

在這裏,我有lat = -23.307339lon = -51.171461原點,但是我們要說的是,公交車的線路,使得它的位置現在是取得了進展:lat = -23.315229; lon = -51.170670,這是成功的一半這條路線上兩點之間的路。然後讓我們再次撥打電話:

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=-23.315229,-51.170670&destinations=-23.306628,-51.165768|-23.312134,-51.167751|-23.320006,-51.166655|-23.324167,-51.160821 

您可以在瀏覽器上進行這些調用以查看結果。正如我所看到的,這些數據並沒有告訴我關於給定路線內的旅行時間的任何信息。它只是返回目的地和原點之間的個人旅行距離和時間,但是這些距離的計算並未考慮我選擇的路線。您可以檢查它在谷歌地圖:

https://www.google.com.br/maps/dir/'-23.307339,-51.171461'/Condom%C3%ADnio+Comercial+Paula+Center,+Rua+Borba+Gato,+1170+-+Jd+Am%C3%A9rica,+Londrina+-+PR,+86010-630/@-23.3191734,-51.1753824,14.75z/data=!4m22!4m21!1m13!2m2!1d-51.171461!2d-23.307339!3m4!1m2!1d-51.1655654!2d-23.3066109!3s0x94eb44a453d12405:0x4fe6589ceb2a7640!3m4!1m2!1d-51.1679874!2d-23.3121241!3s0x94eb44a7b0b222bd:0xebae4eed90aa817!1m5!1m1!1s0x94eb436e990ab02f:0xbea600ba72575bee!2m2!1d-51.1606428!2d-23.324045!3e0 

您也可以使用谷歌地圖查看相同的電話,這一次:

https://maps.googleapis.com/maps/api/directions/json?origin=-23.307339,-51.171461&destination=-23.324167,-51.160821&waypoints=-23.306628,-51.165768|-23.312134,-51.167751|-23.320006,-51.166655 

我仍然沒有把握如何利用這些數據來達到我想要的。

+1

您可以顯示您迄今爲止嘗試使用的代碼嗎? –

+0

@ S.P.H.I.N.X我的系統仍然不處理任何數據。它只是打電話並返回結果。我仍在研究如何使用Google的API進行此操作。 – Pedro

回答

2

如文檔提到的供應。其中,distrance矩陣通話consists of rows containing duration and distance values for each pair.的結果,這意味着你在打電話之前必須先形成你的雙人。所以,讓我們說你的路線包括以下幾點:

你的整個路線:

Point 1: Lat_1,Lon_1 
Point 2: Lat_2,Lon_2 
Point 3: Lat_3,Lon_3 
Point 4: Lat_4,Lon_4 
Point 5: Lat_5,Lon_5 

這意味着你需要做一個距離矩陣通話以下參數:

距離矩陣API調用的起源:

Lat_1,Lon_1 
Lat_2,Lon_2 
Lat_3,Lon_3 
Lat_4,Lon_4 

您的距離矩陣API調用目的地:

Lat_2,Lon_2 
Lat_3,Lon_3 
Lat_4,Lon_4 
Lat_5,Lon_5 

當您發送這距離矩陣API調用(https://maps.googleapis.com/maps/api/distancematrix),它將返回以下路線的距離和時間:

Point 1 --> Point 2 
Point 2 --> Point 3 
Point 3 --> Point 4 
Point 4 --> Point 5 

您可以看到,要獲取行程的總持續時間,您需要添加使用此方法時返回的所有持續時間。另外,在你的問題中,你提到你能夠忽略已經遍歷的點。因此,如果您想要在路徑中移動時更新行程的持續時間,則只需從陣列中移除已經遍歷的點,並將最新的位置用作第一對的起點仍然有待遍歷。假設公交車司機沒有跳過任何一點。

  • 注:對於您的問題,要想在你的路線,disconsider點(已經經過後),您可以檢查當前 位置和所涉及的點的位置之間的距離越低比 某個閾值(比如說10米)。一旦發生這種情況,您可以只需 假定該點已遍歷,並且您可以將其從 數組中移除。
+0

首先,感謝您的回答。現在我明白了,也許我在說胡話。我已經說過,如果我知道我在旅途中取得的進展,我就能夠忽視已經遍歷的要點。但是,如果我已經知道了,那麼從呼叫中移除位置就沒有意義了,因爲了解我的進度是它的全部要點(或者這對於保存對Google地圖API的呼叫很有用)。 – Pedro

+0

希望這是正確的答案。還有什麼問題需要解決? – JMA

+0

我仍在試圖弄清楚如何計算公交在路線上的進度。我現在很忙,但後來我可能會更新一些實際的Javascript代碼的問題。我正在考慮去除已經遍歷的點的策略,但問題是,只有距離,很難確定我是否已經超越了這個點,或者我是否還在朝着這個點前進。 – Pedro

3

如果您可以每15秒獲得一次公交車的當前位置,那麼使用新點和終點的經度和緯度不是很容易嗎?下面是這樣一個自己的網頁樣品中的谷歌API調用,只需用數據

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626&key=YOUR_API_KEY 

https://developers.google.com/maps/documentation/distance-matrix/intro

+0

我編輯了我的帖子以解決您的建議。仍然沒有進展。 – Pedro