Hilfsbereit, pfeilschnell und immer informiert! (Alles rund um T-Mobile G1 und Android)

GoogleMaps mit der Geocoder Klasse - Tutorial

In den Android-Usergruppen häuften sich in letzter Zeit die Fragen über die Funktionalität der Geocoder Klasse und deren Möglichkeit eine Adresse in Longitude und Latitude zu konvertieren. Ich hoffe dieses kleine Tutorial kann einige Fragen beantworten.

Was die Anwendung kann:

Sie konvertiert eine eingegebene Adresse in Longitude und Latitude und zeigt den Standort auf einer Karte an.

Wie die Anwendung aussieht:

Schritt-für-Schritt Tutorial:

1. Erstelle zuerst ein passendes Layout. Es gibt mittlerweile genügend Tutorials zum Layouting (zum Beispiel im anddev.org - Forum), daher werde ich hier nicht weiter darauf eingehen. Du kannst dir aber den angehängten Sourcecode downloaden um zu sehen, wie meine main.xml aussieht

2. Füge den folgenden Code zu deiner Manifest.xml hinzu. Direkt über den Tag:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> 

3. Nun können wir mit dem eigentlichen Java-Code beginnen:

Alles was du tun musst ist
- Eine GeoCoder Instanz erstellen

gc = new Geocoder(this); //create new geocoder instance 

- Je eine OnClickListener-Funktion für den Suchen-Button (btnSearch) und den Text aus dem EditText-Feld (address)

gc = new Geocoder(this); //create new geocoder instance
btnSearch.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    String addressInput = adress.getText().toString(); //Get input text
  }
}); 

- Nun lassen wir die GeoCoder Klasse nach der eingegebenen Adresse suchen (try-catch-statement nicht vergessen!)

gc = new Geocoder(this); //create new geocoder instance
btnSearch.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    String addressInput = adress.getText().toString(); //Get input text   
    try {
      List<Address> foundAdresses = gc.getFromLocationName(addressInput, 5); //Search addresses
    }
    catch (Exception e) {
      //@todo: Show error message
    }
  }
}); 

- Nun können wir die Longitude und Latitude der gefundenen Adresse auslesen und sie auf der Karte anzeigen (die navigateToLocation-Funktion findest du im kompletten Quellcode)

gc = new Geocoder(this); //create new geocoder instance
btnSearch.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    String addressInput = adress.getText().toString(); //Get input text   
    try {
      List<Address> foundAdresses = gc.getFromLocationName(addressInput, 5); //Search addresses
      for (int i = 0; i < foundAdresses.size(); ++i) {
        //Save results as Longitude and Latitude
        //@todo: if more than one result, then show a select-list
        Address x = foundAdresses.get(i);
        lat = x.getLatitude();
        lon = x.getLongitude();
      }
      navigateToLocation((lat * 1000000), (lon * 1000000), myMap); //display the found address
    }
    catch (Exception e) {
      //@todo: Show error message
    }
  }
}); 

Kompletter Quellcode

Der komplette Quellcode zeigt außerdem noch eine Fehlermeldung an, wenn die Adresse nicht gefunden wurde.

//Lot's of imports here... see full source
 
public class simpleGoogleMaps extends MapActivity {
  protected boolean isRouteDisplayed() { return false; }
  private MapView myMap;
  private Button btnSearch;
  private EditText adress;
  private Geocoder gc;
  private double lat;
  private double lon;
 
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    myMap = (MapView) findViewById(R.id.simpleGM_map); //Get map from XML
    btnSearch = (Button) findViewById(R.id.simpleGM_btn_search); //Get button from XML
    adress = (EditText) findViewById(R.id.simpleGM_adress); //Get address from XML
 
    gc = new Geocoder(this); //create new geocoder instance
 
    btnSearch.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        String addressInput = adress.getText().toString(); //Get input text
 
        try {
 
          List<Address> foundAdresses = gc.getFromLocationName(addressInput, 5); //Search addresses
 
          if (foundAdresses.size() == 0) { //if no address found, display an error
            Dialog locationError = new AlertDialog.Builder(simpleGoogleMaps.this)
              .setIcon(0)
              .setTitle("Error")
              .setPositiveButton(R.string.ok, null)
              .setMessage("Sorry, your address doesn't exist.")
              .create();
            locationError.show();
          }
          else { //else display address on map
            for (int i = 0; i < foundAdresses.size(); ++i) {
              //Save results as Longitude and Latitude
              //@todo: if more than one result, then show a select-list
              Address x = foundAdresses.get(i);
              lat = x.getLatitude();
              lon = x.getLongitude();
            }
          navigateToLocation((lat * 1000000), (lon * 1000000), myMap); //display the found address
          }
        }
        catch (Exception e) {
          //@todo: Show error message
        }
 
      }
    });
    }
 
  /**
  * Navigates a given MapView to the specified Longitude and Latitude
  */
  public static void navigateToLocation (double latitude, double longitude, MapView mv) {
    GeoPoint p = new GeoPoint((int) latitude, (int) longitude); //new GeoPoint
    mv.displayZoomControls(true); //display Zoom (seems that it doesn't work yet)
    MapController mc = mv.getController();
    mc.animateTo(p); //move map to the given point
    int zoomlevel = mv.getMaxZoomLevel(); //detect maximum zoom level
    mc.setZoom(zoomlevel - 1); //zoom
    mv.setSatellite(false); //display only "normal" mapview 
  } 

Ich hoffe das Tutorial veranschaulicht, wie leicht es ist eine Adresse in Long/Lat zu konvertieren. Für mehr Infos rund um die Arbeit mit GoogleMaps empfehle ich folgendes Tutorial auf anddev.org.

Dieses Tutorial wurde von mir bereits hier auf englisch im Anddev.org Forum veröffentlicht

AnhangGröße
simpleGoogleMaps.tar65.5 KB

Kommentare

Hi, echt schönes Tutorial!

Hi,

echt schönes Tutorial! Vielen Dank. Hab noch eine Frage. Ich versuche gerade die PLZ aus der Adresse auszulesen, aber x.getPostalCode() ist null und auch wenn ich mir die Adresszeilen einzeln ausgeben lasse, ist da keine PLZ dabei. Liefert die Methode getFromLocationName() diese garnicht mit? Wenn ich den anderen Weg gehe, also zu einem bestimmten Punkt die Adresse suche über getFromLocation() ist sie dabei. Gut ... man könnte also über getFromLocationName() den Punkt ermitteln und dann das Ergebnis nochmal durch getFromLocation() jagen, aber das ist nicht wirklich schön :-) Vielleicht hast du ja eine Idee.

Liebe Grüße
Rudi

Hallo, schön mal deutsche

Hallo,

schön mal deutsche Android Seite zu finden.Ich hab da auch gleich mal ne Frage.
Wie kann ich die Dateien in simpleGoogleMaps.tar mit eclipse öffnen.
Und wie krieg ich die auf mein G1 und kann sie damit öffnen.

Bin noch neu in der Materie,deswegen die Frage.

mfg knuppel

Hi knuppel, lies dir bitte

Hi knuppel,

lies dir bitte das Hello-World Tutorial auf der offiziellen Android Seite durch [1]. Dort wird alles nötige erklärt.

Ansonsten schau einfach ins Forum, dort gibt es ähnlich relevante Fragen, bzw User, die dir helfen können.

schönen Gruß!
Mic

[1] http://developer.android.com/guide/tutorials/hello-world.html