Come posso trovare la latitudine e la longitudine dall'indirizzo?


Risposte:


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

strAddressè una stringa contenente l'indirizzo. La addressvariabile contiene gli indirizzi convertiti.


1
Lancia il "servizio java.io.IOException non disponibile"
Kandha

3
Hai bisogno delle giuste autorizzazioni per poter accedere al servizio. # <uses-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android: name = "android.permission.INTERNET" />
Flo

quale versione di android api stai costruendo applicazione devi avere google api disponibile ho compilato con google api 8. controlla che la cartella google api sia presente nel tuo progetto. e nel file manifest aggiungi utilizza la libreria com.google.android.maps
ud_an

1
ho già dato i permessi e includo la libreria ... posso ottenere la visualizzazione della mappa ... lancia quell'IOException al geocoder ...
Kandha

6
Controlla la risposta di @NayAneshGupte di seguito, non penso che ci sia una GeoPointclasse nelle nuove librerie. Invece usa LatLng. stackoverflow.com/a/27834110/2968401
user2968401

80

La soluzione di Ud_an con API aggiornate

Nota : la classe LatLng fa parte di Google Play Services.

Obbligatorio :

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

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

Aggiornamento: se hai l'SDK di destinazione 23 e versioni successive, assicurati di occuparti dell'autorizzazione di runtime per la posizione.

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

2
Grazie, ha funzionato per me, la soluzione di cui sopra non funzionava.
Rizwan Sohaib,

1
Quando si istanzia il Geocoder si dovrebbe passare il contesto Geocoder coder = new Geocoder (this); o new Geocoder (getApplicationContext) non getActivity () come indicato nella risposta.
The_Martian

1
@Quantumdroid sopra il codice è scritto in frammento. Altrimenti hai assolutamente ragione. È il contesto.
Nayanesh Gupte

2
Soluzione bella e pulita. Nessuna delle risposte menziona che Geocoder utilizza l'accesso sincrono, in quanto tale si consiglia vivamente di metterlo in un servizio in background per evitare di bloccare l'interfaccia utente.
The_Martian

1
Ottima soluzione. IOException verrà chiamata quando viene inserito un indirizzo / codice postale non valido. Puoi evitare if(address.size() <1){//show a Toast}else{//put rest of code here}
quell'errore

51

Se vuoi inserire il tuo indirizzo nella mappa di Google, puoi usare in modo semplice quanto segue

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

O

se hai bisogno di ottenere lat long dal tuo indirizzo, utilizza Google Place Api che segue

creare un metodo che restituisca un JSONObject con la risposta della chiamata HTTP come segue

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

ora passa quel JSONObject al metodo getLatLong () come segue

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

Spero che questo ti aiuti a trovare altri .. !! Grazie..!!


1
purtroppo questa soluzione non funziona con la connessione mobile di alcuni operatori di telefonia mobile: la richiesta restituisce sempre OVER_QUERY_LIMIT . Quegli operatori mobili utilizzano il NAT sovraccarico, assegnando lo stesso IP a molti dispositivi ...
Umberto

@UmbySlipKnot Puoi spiegare di più su OVER_QUERY_LIMIT? Cos'è quello? grazie.
FariborZ

7

Il seguente codice funzionerà per 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

Dove l'indirizzo è la stringa (123 Testing Rd City State zip) che vuoi convertire in LatLng.


3

In questo modo puoi trovare la latitudine e la longitudine di dove abbiamo cliccato sulla mappa.

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

Funziona bene.

Per ottenere l'indirizzo della posizione possiamo utilizzare la classe geocoder.


1

Una risposta al problema di Kandha sopra:

Lancia il "servizio java.io.IOException non disponibile" ho già dato i permessi e includo la libreria ... posso ottenere la visualizzazione della mappa ... lancia quell'IOException al geocoder ...

Ho appena aggiunto una cattura IOException dopo il tentativo e ha risolto il problema

    catch(IOException ioEx){
        return null;
    }

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

1
Quel controllo nullo non sta facendo nulla.
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();
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.