Google Map API Salvar um percurso
-
Uma aplicação mobile deve salvar todo o trajeto percorrido por uma pessoa. Digamos que a pessoa resolva viajar de SP ao RJ, quando a aplicação for acionada ela deve salvar o percurso feito pela pessoa. Os dados do percurso salvo serão enviados para um sistema de rastreamento que trabalha com a google map api. Esse sistema mostrará ao operador do mesmo qual foi o trajeto utilizado pela pessoa que viajou de SP à RJ. Não tenho experiência com google map api, mas dei uma boa lida na documentação. Encontrei lá que um percurso pode ser desenhado no mapa através do recurso de Polylines. Resumidamente o objeto polyline desenha uma linha baseada em uma sequencia de coordenadas informadas:
Cada marcador no mapa da imagem, corresponde a uma coordenada que compõe o polyline.
Agora vem a pergunta, como farei para garantir que a linha formada pelas coordenadas obtidas pela aplicação android, fiquem o mais fiel possível ao formato da estrada no mapa? Na imagem acima a polyline foi desenhada seguindo os clicks do mouse no mapa. Cada click inseria uma nova coordenada na polyline. Reparem que mesmo clicando manualmente a polyline ainda não fica perfeita, seguindo o "desenho" da estrada, mas ao menos fica aceitável.
Pela lógica, que percebi, uma polyline ficará o mais fiel possível, dependendo da distancia em que cada coordenada foi tirada, ou seja, quanto maior a distância de uma coordenada para a outra menor vai ser a fidelidade da polyline para com o "desenho" da estrada no mapa.
Qual seria a solução aqui? uma thread que salva a coordenada de tempos em tempos e envia para o sistema remoto? Qual seria o intervalo de tempo adequado de uma coordenada para a outra? Ou seria melhor uma thread baseada em distancia e não em tempo, visto que o viajante pode ficar parado em um local, por n motivos e a aplicação ficaria enviando coordenadas repetidas a todo momento?
-
Você vai fazer em Qt ou em Android (java)?
Fazer pooling para pegar a posição do GPS é uma faca de 2 gumes: se for muito "rápido" come a bateria, se for "lento" você perde resolução. Mas quanto menor o tempo entre a aquisição do valor é melhor para a resolução.
E para enviar a posição para o servidor, faça um buffer(vetor) e envie de tempos em tempos, mas com um tempo bem maior, porque usar a conexão de dados também gasta mais a bateria .Por exemplo:
- Faça um pooling de 2 em 2 segundos (ou 4)- Coloque num vetor.
- Faça um pooling de 30 em 30 segundos - Envie para o servidor o vetor.
-
Valeu Tio, a ideia é essa mesma, eu continuei pesquisando em outros fóruns enquanto essa pergunta aqui não era respondida.
A aplicação vai armazenar as coordenadas baseadas na distancia e não no tempo, e enviará os dados para o servidor de tempo em tempo. Isso é suficiente pois não é necessário que o rastreamento seja em tempo real.
Trata-se de uma solução para uso dentro de veículos então creio que bateria não seria um problema pois o usuário pode deixar ligado no carregador veicular. Mesmo assim não quero criar uma aplicação que vá consumir muitos recursos.
Sim, pretendo fazer em Qt -
@Exotic_Devel,
O tempo aqui é relevante porque, se você armazena o valor da posição de 10 em 10 segundos e o veículo está numa velocidade considerável você perde "resolução" e vai ter que usar algum artificio (no caso usar o GoogleMaps) para interpolar o trajeto. Quanto menor o tempo de pooling melhor fica.
Aplicações como Waze usam a posição do GPS quase de 1 em 1 segundo. E o Waze grava o trajeto que você pode ver depois (no MapEditor do site). -
@TioRoy said:
@Exotic_Devel,
O tempo aqui é relevante porque, se você armazena o valor da posição de 10 em 10 segundos e o veículo está numa velocidade considerável você perde "resolução" e vai ter que usar algum artificio (no caso usar o GoogleMaps) para interpolar o trajeto. Quanto menor o tempo de pooling melhor fica.
Aplicações como Waze usam a posição do GPS quase de 1 em 1 segundo. E o Waze grava o trajeto que você pode ver depois (no MapEditor do site).Verdade, e tem o outro lado também, se o veículo ficar parado em um sinal, ou preso no transito ele vai ficar armazenando coordenadas repetidas. Se bem que bastaria descartar a coordenada, caso ela seja repetida.
Por isso minha ideia era salvar por distância, tipo, a cada 100 metros, salva a coordenada. -
Usa um QMap/QHash onde a chave é o "LatLng". Assim você não precisa se preocupar com repetições: coletou, colocou no QMap/QHash. A única coisa que você precisa notar é que no momento de enumerar, o QMap e o QHash não mantém a ordem de inclusão, que no seu caso é importante. E não me lembro de uma classe do Container Classes que faça.