javascript - API di Google Maps: calcolare il tempo rimanente secondo il percorso predefinito
Sto cercando di implementare una sorta di tracker personale degli autobus in tempo reale e sono bloccato con questo problema: supponiamo che il punto A sia la mia origine e il punto E sia la mia destinazione. I punti B, C e D sono tappe che definiscono il percorso specifico dell'autobus. Ogni 15 secondi ricevo l'aggiornamento della posizione dell'autobus e poi devo mostrare all'utente il tempo stimato rimanente per raggiungere la destinazione, basandomi sul suo percorso.
Succede che nell'API Google Directions ogni punto di sosta venga preso in considerazione indipendentemente dalla posizione attuale dell'autobus lungo il percorso specificato. In realtà, se passo oltre il punto C, per esempio, allora i punti A, B e C dovrebbero essere esclusi dal calcolo perché l'autobus si è già fermato in quei punti.
Come posso ottenere qualcosa del genere usando le API di GMaps? È possibile?
AGGIORNAMENTO: Se può essere utile, sto facendo questo su un server Node.js e non ho controllo sull'intervallo di aggiornamento della posizione. Questo perché faccio una chiamata esterna a un'API che mi restituisce la posizione dell'autobus specificato. Certo, posso fare le chiamate quante volte voglio, ma la posizione restituita viene aggiornata solo ogni 15 secondi. C'è anche una chiamata che mi restituisce tutte le coordinate lat/lon che compongono il percorso da usare come parametri di waypoint per Google Directions.
Vedo che, conoscendo i punti di inizio e fine del percorso, e conoscendo la posizione attuale dell'autobus sul percorso, posso determinare quali punti di riferimento devo ignorare alla prossima chiamata all'API Google Directions. Ma come posso determinare se l'autobus si trova all'interno del suo percorso? E come posso determinare il suo "progresso" all'interno del percorso? Non riesco a trovare un modo ovvio per farlo.
AGGIORNAMENTO:
Quindi ho seguito la risposta di Loreda L e ho verificato se potevo utilizzare l'API Google Distance Matrix invece di Google Directions. Ma non sono ancora riuscito a capirlo. Per esempio, utilizziamo questa chiamata di esempio:
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
Qui ho un'origine di lat=-23.307339 e lon=-51.171461, ma supponiamo che l'autobus abbia fatto un progresso sul percorso tale che la sua posizione ora sia: lat=-23.315229; lon=-51.170670, che è a metà strada tra due punti su questo percorso. Poi facciamo di nuovo la chiamata:
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
Puoi effettuare queste chiamate sul tuo browser per vedere i risultati. Da quello che ho visto, questi dati non mi dicono nulla sul tempo di viaggio all'interno del percorso dato. Mi restituiscono solo le distanze e i tempi di viaggio individuali tra le destinazioni e l'origine, ma il calcolo di queste distanze non tiene conto del percorso che ho scelto. Puoi verificarlo su Google Maps:
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
Puoi anche controllare la stessa chiamata, questa volta usando Google Directions:
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
Non riesco ancora a capire come usare questi dati per ottenere quello che voglio.
Risposta n. 1
Come menzionato nella documentazione, il risultato della chiamata alla matrice delle distanze consiste in righe contenenti valori di durata e distanza per ciascuna coppia. Questo significa che devi formare le tue coppie prima di effettuare la chiamata. Quindi, supponiamo che il tuo percorso sia composto dai seguenti punti:
Il tuo intero percorso:
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
Questo significa che devi effettuare una chiamata alla matrice delle distanze con i seguenti parametri:
Le tue origini per la chiamata API della matrice delle distanze:
Lat_1,Lon_1
Lat_2,Lon_2
Lat_3,Lon_3
Lat_4,Lon_4
Le tue destinazioni per la chiamata API della matrice delle distanze:
Lat_2,Lon_2
Lat_3,Lon_3
Lat_4,Lon_4
Lat_5,Lon_5
Quando invii questo alla chiamata API distance-matrix (https://maps.googleapis.com/maps/api/distancematrix), restituirà distanza e durata per i seguenti percorsi:
Point 1 --> Point 2
Point 2 --> Point 3
Point 3 --> Point 4
Point 4 --> Point 5
Puoi già vedere che per ottenere la durata totale di un viaggio, devi sommare tutte le durate che vengono restituite quando usi questo metodo. Inoltre, nella tua domanda menzioni che sei in grado di non considerare i punti già percorsi. Quindi, se vuoi aggiornare la durata del viaggio mentre ti muovi lungo il percorso, tutto ciò che devi fare è rimuovere i punti già percorsi dal tuo array e usare la posizione più recente come origine per la prima coppia che è ancora da percorrere. Questo assumendo che l'autista dell'autobus non stia saltando nessuno dei punti.
- Nota: Per il tuo problema, per poter ignorare un punto nel tuo percorso (dopo che è stato attraversato), puoi verificare se la distanza tra la posizione attuale e la posizione del punto in questione è inferiore a una certa soglia (diciamo 10 m). Una volta che ciò accade, puoi semplicemente assumere che il punto sia stato attraversato e puoi rimuoverlo dall'array.
Risposta n. 2
Se puoi ottenere la posizione attuale dell'autobus ogni 15 secondi, non dovrebbe essere facile usare la longitudine e la latitudine del nuovo punto e del punto finale? Qui sotto c'è una chiamata al Google API nel loro esempio web, basta fornire loro i tuoi dati
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
