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.
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:
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
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.
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!