Wie kann ich den Breiten- und Längengrad anhand der Adresse ermitteln?

111

Ich möchte den Standort einer Adresse in Google Maps anzeigen.

Wie erhalte ich mithilfe der Google Maps-API den Breiten- und Längengrad einer Adresse?

Kandha
quelle
Ich hatte das gleiche Problem Schauen Sie sich meine Lösung hier an stackoverflow.com/a/19170557/2621050
Bruno Pinto

Antworten:

139
public GeoPoint getLocationFromAddress(String strAddress){

Geocoder coder = new Geocoder(this);
List<Address> address;
GeoPoint p1 = null;

try {
    address = coder.getFromLocationName(strAddress,5);
    if (address==null) {
       return null;
    }
    Address location=address.get(0);
    location.getLatitude();
    location.getLongitude();

    p1 = new GeoPoint((double) (location.getLatitude() * 1E6),
                      (double) (location.getLongitude() * 1E6));

    return p1;
    }
}

strAddressist eine Zeichenfolge, die die Adresse enthält. Die addressVariable enthält die konvertierten Adressen.

ud_an
quelle
1
Es wirft den "java.io.IOException Service nicht verfügbar"
Kandha
3
Sie benötigen die richtigen Berechtigungen, um auf den Dienst zugreifen zu können. # <Verwendungsberechtigung android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <Verwendungsberechtigung android: name = "android.permission.INTERNET" />
Flo
Welche Android-API-Version Sie erstellen Anwendung, die Sie benötigen, um Google API verfügbar zu haben Ich habe mit Google API 8 erstellt. Überprüfen Sie, ob der Google API-Ordner in Ihrem Projekt vorhanden ist. und in Ihrer Manifestdatei add verwendet die Bibliothek com.google.android.maps
ud_an
1
Ich habe diese Erlaubnis bereits gegeben und die Bibliothek eingeschlossen ... ich kann eine Kartenansicht bekommen ... es wirft diese IOException auf Geocoder ...
Kandha
6
Schauen Sie sich die Antwort von @NayAneshGupte unten an. Ich glaube nicht, dass es GeoPointin den neuen Bibliotheken eine Klasse gibt . Verwenden Sie stattdessen LatLng. stackoverflow.com/a/27834110/2968401
user2968401
80

Ud_ans Lösung mit aktualisierten APIs

Hinweis : Die LatLng- Klasse ist Teil der Google Play Services.

Obligatorisch :

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

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

Update: Wenn Sie über das Ziel-SDK 23 und höher verfügen, achten Sie auf die Laufzeitberechtigung für den Speicherort.

public LatLng getLocationFromAddress(Context context,String strAddress) {

    Geocoder coder = new Geocoder(context);
    List<Address> address;
    LatLng p1 = null;

    try {
        // May throw an IOException
        address = coder.getFromLocationName(strAddress, 5);
        if (address == null) {
            return null;
        }

        Address location = address.get(0);
        p1 = new LatLng(location.getLatitude(), location.getLongitude() );

    } catch (IOException ex) {

        ex.printStackTrace();
    }

    return p1;
}
Nayanesh Gupte
quelle
2
Danke, es hat bei mir funktioniert, die obige Lösung hat nicht funktioniert.
Rizwan Sohaib
1
Wenn Sie den Geocoder instanziieren, sollten Sie den Kontext Geocoder coder = new Geocoder (this) übergeben. oder neuer Geocoder (getApplicationContext) nicht getActivity () wie in der Antwort angegeben.
The_Martian
1
@Quantumdroid über Code ist in Fragment geschrieben. Ansonsten bist du absolut richtig. Es ist Kontext.
Nayanesh Gupte
2
Schöne und saubere Lösung. In keiner der Antworten wird erwähnt, dass Geocoder einen synchronen Zugriff verwendet. Daher wird dringend empfohlen, diesen in einen Hintergrunddienst zu stellen, um ein Blockieren der Benutzeroberfläche zu vermeiden.
The_Martian
1
Tolle Lösung. IOException wird aufgerufen, wenn eine ungültige Adresse / Postleitzahl eingegeben wird. Sie können diesen Fehler mit einem einfachenif(address.size() <1){//show a Toast}else{//put rest of code here}
grantespo
51

Wenn Sie Ihre Adresse in Google Map platzieren möchten, können Sie diese auf einfache Weise verwenden

Intent searchAddress = new  Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q="+address));
startActivity(searchAddress);

ODER

Wenn Sie Lat Long von Ihrer Adresse benötigen, verwenden Sie die folgende Google Place-API

Erstellen einer Methode , die Gibt eine JSONObject mit der Antwort des HTTP - Aufruf wie folgt

public static JSONObject getLocationInfo(String address) {
        StringBuilder stringBuilder = new StringBuilder();
        try {

        address = address.replaceAll(" ","%20");    

        HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        stringBuilder = new StringBuilder();


            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return jsonObject;
    }

Übergeben Sie nun das JSONObject wie folgt an die Methode getLatLong ()

public static boolean getLatLong(JSONObject jsonObject) {

        try {

            longitute = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lng");

            latitude = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lat");

        } catch (JSONException e) {
            return false;

        }

        return true;
    }

Ich hoffe das hilft dir und anderen .. !! Danke dir..!!

Nirav Dangi
quelle
1
Leider funktioniert diese Lösung nicht mit der Mobilfunkverbindung einiger Mobilfunkbetreiber: Die Anforderung gibt immer OVER_QUERY_LIMIT zurück . Diese Mobilfunkbetreiber verwenden NAT-Überladung und weisen vielen Geräten dieselbe IP zu ...
Umberto
@UmbySlipKnot Können Sie mehr über OVER_QUERY_LIMIT erklären? Was ist das? Danke.
FariborZ
7

Der folgende Code funktioniert für Google Apiv2:

public void convertAddress() {
    if (address != null && !address.isEmpty()) {
        try {
            List<Address> addressList = geoCoder.getFromLocationName(address, 1);
            if (addressList != null && addressList.size() > 0) {
                double lat = addressList.get(0).getLatitude();
                double lng = addressList.get(0).getLongitude();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } // end catch
    } // end if
} // end convertAddress

Dabei ist die Adresse die Zeichenfolge (Postleitzahl 123 Testing Rd City State), die Sie in LatLng konvertieren möchten.

Neutrino
quelle
3

Auf diese Weise können Sie den Breiten- und Längengrad des Klicks auf die Karte ermitteln.

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) 
    {                
        GeoPoint p = mapView.getProjection().fromPixels(
            (int) event.getX(),
            (int) event.getY());

        Toast.makeText(getBaseContext(), 
             p.getLatitudeE6() / 1E6 + "," + 
             p.getLongitudeE6() /1E6 , 
             Toast.LENGTH_SHORT).show();
    }                            
    return false;
} 

Es funktioniert gut.

Um die Adresse des Standorts zu erhalten, können wir die Geocoder-Klasse verwenden.

Rakesh Gondaliya
quelle
1

Eine Antwort auf das Kandha-Problem oben:

Es löst den "java.io.IOException-Dienst nicht verfügbar" aus. Ich habe diese Berechtigung bereits erteilt und die Bibliothek eingeschlossen. Ich kann eine Kartenansicht erhalten. Es löst diese IOException bei Geocoder aus.

Ich habe gerade nach dem Versuch eine catch-IOException hinzugefügt, die das Problem gelöst hat

    catch(IOException ioEx){
        return null;
    }
ylag75
quelle
0
Geocoder coder = new Geocoder(this);
        List<Address> addresses;
        try {
            addresses = coder.getFromLocationName(address, 5);
            if (addresses == null) {
            }
            Address location = addresses.get(0);
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            Log.i("Lat",""+lat);
            Log.i("Lng",""+lng);
            LatLng latLng = new LatLng(lat,lng);
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            googleMap.addMarker(markerOptions);
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,12));
        } catch (IOException e) {
            e.printStackTrace();
        }
Manikanta Reddy
quelle
1
Diese Nullprüfung macht nichts.
AjahnCharles
0
public void goToLocationFromAddress(String strAddress) {
    //Create coder with Activity context - this
    Geocoder coder = new Geocoder(this);
    List<Address> address;

    try {
        //Get latLng from String
        address = coder.getFromLocationName(strAddress, 5);

        //check for null
        if (address != null) {

            //Lets take first possibility from the all possibilities.
            try {
                Address location = address.get(0);
                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

                //Animate and Zoon on that map location
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            } catch (IndexOutOfBoundsException er) {
                Toast.makeText(this, "Location isn't available", Toast.LENGTH_SHORT).show();
            }

        }


    } catch (IOException e) {
        e.printStackTrace();
    }
}
Jay Patoliya
quelle