Rota no Android

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.

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

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.

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.

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):

[code]

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 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();

}[/code]

Espero ter ajudado.

show de bola cara!

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

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/

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

Muito obrigado
Vitor

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

[code]class MapOverlay extends com.google.android.maps.Overlay {
Road mRoad;
ArrayList 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);

		}
	}[/code]

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.

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;
    }
}

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

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

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

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

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.

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.

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.

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

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

String origem = "Curitiba";

Ele atribui este valor:

origem: android.widget.EditText@44f14588

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: