Rota no Android

26 respostas
J

Olá pessoal,

Alguém pode me orientar sobre mapas, eu implementei um mapa (MapActivity) e consigo marcar pontos especificos, mas ainda não descobri como traçar uma rota entre dois pontos.

26 Respostas

otaviojava

no próprio site do android, tem informações muito legais para os developers
dá uma olhada e espero que te ajude.

J

Então Otávio, neste tutorial da pagina que você passou o link, qual eu ja tinha lido, eles mostram detalhadamente como marcar pontos no mapa, como implementar um mapa, muito bom o tutorial, inclusive eu o utilizei em minha implementação, porém eles não abrangem o assunto de traçar uma rota, ou seja, eu estou com meu mapa prontinho, com os dois endereços marcados, agora só preciso traçar uma rota entre os dois pontos, já revirei a net e livros nos ultimos 3 dias e não encontrei nada, ae criei esta conta aqui no GUJ pra ver se consigo uma dica, qualquer coisa. =) valew! se alguém puder ajudar agradeço.

J

Bom pessoal, se alguém estiver com a mesma duvida que eu estava, eis uma solução, complexa mas uma solução, é um exemplo pronto, porém sem comentários, quem quiser entender vai ter que estudar linha a linha, mas garanto que funciona, foi o melhor que encontrei, e se alguém encontrar algo mais simples gostarei de conhecer. segue:

http://code.google.com/p/j2memaprouteprovider/source/browse/#svn%2Ftrunk%2FJ2MEMapRouteAndroidEx%2Fres%3Fstate%3Dclosed

Obs. No link indicado existem dois exemplos, um para Android o qual eu utilizei e outro para Blackbarry, então não confundam os pacotes.

J

Olá pessoal, o Luis Henrique me enviou um email fazendo uma pergunta qual vou responder aqui, pois pode servir para mais pessoas.

A pergunta foi: eu queria saber se você conseguiu implementar duas rotas tocando na tela ou simplesmente digitando endereço, eu vi o exemplo que você mandou, eu estudei ele, mais so consigo por coordenadas, se puder me ajudar, ficarei grato.

É o seguinte eu consegui fazer isto sim, exibo na tela uma serie de rotas e o usuário escolhe a que ele quer, pego o endereço no formato String e traço a rota da seguinte maneira (Vou postar Resumidamente):
double fromLat, fromLon, toLat, toLon;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.maps);
	mapView = (MapView) findViewById(R.id.mapview);
	mapView.setBuiltInZoomControls(true);

	carregaMapa();// esse metodo aqui chama todos os outros que desenharão a rota na minha activity

}

public void carregaMapa() { // este metodo aqui foi explicado no exemplo do post anterior
	new Thread() {
		@Override
		public void run() {
			buscarCoordenadasEndereco("Rua GUJ, 12 - Curitiba", "Rua Java, 10 - Curitiba");// esta é a chamada para o metodo que vai traduzir o endereço para coordenadas é //a duvida descrita, é util para trabalhar com endereços que o usuário digitar
			String url = RoadProvider
					.getUrl(fromLat, fromLon, toLat, toLon);
			InputStream is = getConnection(url);
			mRoad = RoadProvider.getRoute(is);
			mHandler.sendEmptyMessage(0);
		}
	}.start();

	mapView.invalidate();
}

public void buscarCoordenadasEndereco(String enderecoOrigem, String enderecoDestino) {
	Geocoder geoCoder = new Geocoder(this, Locale.getDefault());// esse Geocoder aqui é quem vai traduzir o endereço de String para coordenadas double
	List<Address> addresses = null;//este Adress aqui recebe um retorno do metodo geoCoder.getFromLocationName vc manipula este retorno pra pega as coordenadas

	addresses = geoCoder.getFromLocationName(enderecoOrigem, 1);// o numero um aqui é a quantidade maxima de resultados que vc quer receber
	fromLat = addresses.get(0).getLatitude();
	fromLon = addresses.get(0).getLongitude();
	
	addresses = geoCoder.getFromLocationName(enderecoDestino, 1);
	
	toLat = addresses.get(0).getLatitude();
	toLon = addresses.get(0).getLongitude();
			
}

Espero ter ajudado.

gilsonjunio

show de bola cara!

vmotta

Cara, foi de grande ajuda, show de bola, funcionou tudo aqui e está muito claro :wink:

Desenvolvo há muito tempo em Java, porém sou iniciante em desenvolvimento para Android, estou com uma dúvida, por favor vejam se estou falando besteira:

Para eu criar esse projeto foi necessário selecionar a API do Google plataforma 4.0 (Level 14), não consigo executar em dispositivos com Android 2.1?

Existe alguma forma de executar nessa versão do Android?

Obrigado,
Vitor

J

Sim é possivel executar na versão 2.1, eu mesmo estou uilizando esta e tive o mesmo problema no começo, a questão é: certifique-se que você baixou o pacote "Google APIs by Google Inc., " para esta versão, se não me engano a versão para o 2.1 é “Android API 3, revision”, neste link abaixo tem os passos para você baixar. Depois disto é só criar o projeto na versão desejada. Eu para não ter problema baixei todas as versões, assim eu sempre crio projetos em versões diferentes para conhecer as outras versões.

http://www.androidbrasilprojetos.org/android/google-apis-instalacao-dos-pacotes-de-api-e-criacao-de-uma-avd-compativel/

vmotta

Exatamente isso, já coloquei para baixar todas as versões !!!

Muito obrigado
Vitor

heliob

E como faz pra centralizar ( dar zoom ) na justamente da na rota feita?

J
class MapOverlay extends com.google.android.maps.Overlay {
		Road mRoad;
		ArrayList<GeoPoint> mPoints;

		public MapOverlay(Road road, MapView mv) {
			mRoad = road;
			if (road.mRoute.length > 0) {
				mPoints = new ArrayList<GeoPoint>();
				for (int i = 0; i < road.mRoute.length; i++) {
					mPoints.add(new GeoPoint(
							(int) (road.mRoute[i][1] * 1000000),
							(int) (road.mRoute[i][0] * 1000000)));
				}
			GeoPoint moveTo = new GeoPoint((int) (locM.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLatitude()* 1000000), 
						(int) (locM.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLongitude() * 1000000));
				MapController mapController = mv.getController();
				mapController.animateTo(moveTo);
				mapController.setZoom(16);

			}
		}

Helio neste exemplo da Overlay no metodo "mapController.animateTo(moveTo);" é onde vai estar o centro do mapa, e no metodo "mapController.setZoom(16);" é onde seto o zoom inicial, se você já analizou todo o restante dos códigos deste post entederá fácil como utilizar.

A

Boa tarde,

Estou com um problema, pois quero que o usuário digite o nome do local na tela e a conversão seja feita, não sei onde está o erro pois todas as vezes que digito qualquer endereço, o mapa cria uma rota no oceano, sempre no mesmo lugar. Acho que não está convertendo corretamente.
No compilador, ele coloca a latitude e longitude como 0 quando faço a conversão.

Segue meu código:

package google.com.Mapas;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Mapa25FevActivity extends MapActivity {
    /** Called when the activity is first created. */
	 double fromLat, fromLon, toLat, toLon; 
	 private MapController controlador;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final MapView mapView = (MapView) findViewById(R.id.mapa);
       //permitir utilizar o zoom através dos botões de controle
        mapView.setBuiltInZoomControls(true);
         
        controlador = mapView.getController();
        
       
           
        //aproximar o mapa até curitiba
        
        controlador.setZoom(18);
             
        //Ação do botão do Satélite
        Button ImagemSatelite = (Button) findViewById(R.id.ImagemSatelite);
        Button ImagemRua = (Button) findViewById(R.id.ImagemRua);
        final Button Ir = (Button) findViewById(R.id.Ir);
        
        ImagemSatelite.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mapView.setSatellite(true);
				mapView.setTraffic(true);
			}
		});
        ImagemRua.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mapView.setSatellite(false);
				mapView.setStreetView(true);
				mapView.setTraffic(true);
			}
		});
        Ir.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				EditText origemText =(EditText) findViewById(R.id.origemText);
				EditText destinoText =(EditText) findViewById(R.id.destinoText);
				
				String origem = origemText.toString();
				String destino = destinoText.toString();
				
				try {
					buscarCoordenadasEndereco(origem,destino);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
								
				GeoPoint pointOrigem = new PontoGeo(toLat, toLon);
				GeoPoint pointDestino = new PontoGeo(fromLat, fromLon);
				if(v == Ir){
					controlador.animateTo(pointOrigem);
					MyOverlay imagemOrigem = new MyOverlay(pointOrigem,R.drawable.ponto);
					MyOverlay imagemDestino = new MyOverlay(pointDestino,R.drawable.ponto);
					mapView.getOverlays().add(imagemOrigem);
					mapView.getOverlays().add(imagemDestino);
					//centralizar o mapa no ponto
			        mapView.getController().setCenter(pointOrigem);
			       
					mapView.invalidate();
				}
				
			}
		});
    
    }
    public void buscarCoordenadasEndereco(String enderecoOrigem, String enderecoDestino) throws IOException {  
    	
    	Geocoder geoCoder = new Geocoder(this, Locale.getDefault());// esse Geocoder aqui é quem vai traduzir o endereço de String para coordenadas double  
        List<Address> addresses = null;//este Adress aqui recebe um retorno do metodo geoCoder.getFromLocationName vc manipula este retorno pra pega as coordenadas  
      
        addresses = geoCoder.getFromLocationName(enderecoOrigem, 1);// o numero um aqui é a quantidade maxima de resultados que vc quer receber  
        fromLat = addresses.get(0).getLatitude();  
        fromLon = addresses.get(0).getLongitude();  
          
        addresses = geoCoder.getFromLocationName(enderecoDestino, 1);  
          
        toLat = addresses.get(0).getLatitude();  
        toLon = addresses.get(0).getLongitude();  
                  
    }    
    @Override
    protected boolean isRouteDisplayed(){
    	return false;
    }
}
J

Alexandre, teóricamente o metodo esta pronto e sem erros, basta chamar o metodo

passando um endereço válido, vc esta fazendo isto?

A

Passei “Curitiba”, mas tentei colocando “Avenida Sete de Setembro, 1000 - Curitiba”.

O estranho é que sempre ele retorna o Valor 0 para Latitude e Longitude.

J

Endereços que são localizados no google maps não retornam vazios, teste direto pelo google maps, se retornar valor tem que funcionar na sua aplicação, caso esteja tudo certo com o endereço, sugiro que debugue sua aplicação e verifique se as conversões de coordenadas estão retornando valores válidos para rota, no meu desenvolvimento me bati um pouco com essas conversões, deu um certo trabalho para enteder para qual o valor a aplicação precisava converter os valores de coordenadas, eu acredito ser ai o seu problema. Para saber qual a coordenada utilizada pelo google, pequise um endereço no google maps e consulte “O que há aqui?”, ele traz os valores em coordenads do endereço, ae vc compara com o que sua aplicação ta gerando.

A

Veja só:

Existem dois TextViews onde o usuário digita o ponto Origem e o Ponto destino:

EditText origemText =(EditText) findViewById(R.id.origemText);
EditText destinoText =(EditText) findViewById(R.id.destinoText);

Depois crio duas Strings para passar para o método buscarCoordenadaEndereco:

String origem = origemText.toString();
String destino = destinoText.toString();

Chamo o método buscarCoordenadaendereco:

buscarCoordenadasEndereco(origem,destino);

O método faz as conversões do String:

public void buscarCoordenadasEndereco(String enderecoOrigem, String enderecoDestino) throws IOException {  
    	
    	Geocoder geoCoder = new Geocoder(this, Locale.getDefault());// esse Geocoder aqui é quem vai traduzir o endereço de String para coordenadas double  
        List<Address> addresses = null;//este Adress aqui recebe um retorno do metodo geoCoder.getFromLocationName vc manipula este retorno pra pega as coordenadas  
      
        addresses = geoCoder.getFromLocationName(enderecoOrigem, 1);// o numero um aqui é a quantidade maxima de resultados que vc quer receber  
        fromLat = addresses.get(0).getLatitude();  
        fromLon = addresses.get(0).getLongitude();  
          
        addresses = geoCoder.getFromLocationName(enderecoDestino, 1);  
          
        toLat = addresses.get(0).getLatitude();  
        toLon = addresses.get(0).getLongitude();  
                  
    }

Depois chamo o GeoPoint, onde passo dois valores (Double) (latitude e longitude):

GeoPoint pointOrigem = new PontoGeo(toLat, toLon);
GeoPoint pointDestino = new PontoGeo(fromLat, fromLon);

Em seguida peço para o mapa ir até o ponto de Origem:

controlador.animateTo(pointOrigem);

Deveria funcionar certo? O problema na depuração, é que não consigo ver a conversão dentro do método BuscaCoordenada, consigo apenas ver que ele sai de lá contendo o valor 0.

J

Este motodo ta pegando a String certa?

String origem = origemText.toString(); String destino = destinoText.toString();

você se certificaou disto?
Tente imprimir na console do emulador, tenho a impressão que o retorno ae não é a string desejada.
use o Logcat.

A

Tentei converter fazendo assim:

String origem = origemText.getText().toString();

Porém continuou como vazio, depois tentei:

Editable debug1 = origemText.getText();
				String origem = debug1.toString();

Nada também.

No logCat não consigo entender, coloquei:

Log.d(LOGS, origem);

aparece assim o Logcat:

02-26 23:54:33.586: D/dalvikvm(233): GC_FOR_MALLOC freed 4598 objects / 287544 bytes in 198ms
02-26 23:54:34.116: D/dalvikvm(233): GC_FOR_MALLOC freed 8140 objects / 438472 bytes in 132ms
02-26 23:54:34.657: D/dalvikvm(233): GC_FOR_MALLOC freed 4911 objects / 321976 bytes in 92ms
02-26 23:54:34.956: D/dalvikvm(233): GC_FOR_MALLOC freed 6778 objects / 414096 bytes in 83ms
02-26 23:54:36.217: D/dalvikvm(233): GC_FOR_MALLOC freed 8204 objects / 631064 bytes in 348ms
02-26 23:54:37.366: D/dalvikvm(233): GC_FOR_MALLOC freed 6098 objects / 370304 bytes in 603ms
02-26 23:54:38.297: I/MapActivity(233): Handling network change notification:CONNECTED
02-26 23:54:38.297: E/MapActivity(233): Couldn't get connection factory client
02-26 23:54:38.908: D/dalvikvm(233): GC_EXTERNAL_ALLOC freed 5733 objects / 497912 bytes in 117ms
02-26 23:54:39.146: D/dalvikvm(233): GC_EXTERNAL_ALLOC freed 778 objects / 140216 bytes in 90ms
02-26 23:54:39.426: I/MapActivity(233): Handling network change notification:CONNECTED
02-26 23:54:39.426: E/MapActivity(233): Couldn't get connection factory client
A

O mais bizarro é que mesmo atribuindo o valor diretamente na String:

String origem = "Curitiba";

Ele atribui este valor:

origem: android.widget.EditText@44f14588

felipebonezi

Brother,

EditText edt = (EditText) findViewById(R.id.id_do_edittext);
edt.setText("Curitiba");

Também existe um modo de utilizar a própria navegação do Google! :wink:

A

Mas nesse caso estou setando um valor pro EditText, eu preciso recuperar um valor digitado pelo usuário e jogar em uma String.

Como faço para utilizar a própria navegação do Google?

:wink:

A

Consegui resolver o problema e vou postar aqui para que mais pessoas que estejam passando por isso também saibam como eu fiz. As declarações dos botões estavam sendo feitas no local errado, devendo ser feita dentro do método que captura o click do botão:

botOk.setOnClickListener(new View.OnClickListener() {
					
					public void onClick(View v) {
						// TODO Auto-generated method stub
						new Thread() {
		                	EditText edOrigem = (EditText)findViewById(R.id.editTextOrigem);
		                	EditText edDestino = (EditText)findViewById(R.id.editTextDestino);
		                	
		                	public String origem = edOrigem.getText().toString();
		                	public String destino=  edDestino.getText().toString();
crfwilliams

Opa, muito boas as dicas, mas empaquei em um problema parecido.
Preciso traçar em meu app android uma rota que já existe, e já está salva na web.
Gostaria de saber se tem como eu pegar o link desse mapa e carrega-lo em minha aplicação android.

Obrigado!

diogo10

To revivendo esse tópico porque não conseguir rodar o exemplo em questão. Esta dando erro no Parser. Você consegui implementar Julio ?

F

Olá, gostaria de saber como abrir no android, um mapa criado no google.
Tenho uma aplicação no android, onde ele está abrindo um mapa com uma localização de lat e long que eu estou setando.
Então, como faço pra mudar isso? fazendo ele abrir o mapa já criado…

P

Boa noite,

Gostaria de saber se você poderia mandar pra mim um exemplar do código funcionando pois tenho um trabalho da pós e estou com dificuldades.

R

Boa tarde,

gostaria de saber se alguém conseguiu fazer esse código funcionar. Tenho uma idéia de implementação, mas ao invés de digitar o endereço no próprio android, ele irá ler através de um QR-Code.

obrigado,

Rafael

Criado 12 de outubro de 2011
Ultima resposta 26 de set. de 2013
Respostas 26
Participantes 12