Comment puis-je trouver la latitude et la longitude de l'adresse?


Réponses:


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

strAddressest une chaîne contenant l'adresse. La addressvariable contient les adresses converties.


1
Il lance le "service java.io.IOException non disponible"
Kandha

3
Vous avez besoin des bonnes autorisations pour pouvoir accéder au service. # <uses-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android: name = "android.permission.INTERNET" />
Flo

quelle version d'api android vous construisez l'application dont vous avez besoin pour avoir google api disponible j'ai construit avec google api 8. vérifiez que le dossier google api est là dans votre projet. et dans votre fichier manifeste, ajoutez utilise la bibliothèque com.google.android.maps
ud_an

1
J'ai déjà donné ces autorisations et j'ai inclus la bibliothèque ... je peux obtenir une vue de la carte ... cela jette cette IOException au géocodeur ...
Kandha

6
Découvrez la réponse de @NayAneshGupte ci-dessous, je ne pense pas qu'il y ait une GeoPointclasse dans les nouvelles bibliothèques. Utilisez plutôt LatLng. stackoverflow.com/a/27834110/2968401
user2968401

81

La solution d'Ud_an avec des API mises à jour

Remarque : la classe LatLng fait partie des services Google Play.

Obligatoire :

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

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

Mise à jour: si vous disposez du SDK cible 23 et supérieur, assurez-vous de prendre soin de l'autorisation d'exécution pour l'emplacement.

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
Merci, cela a fonctionné pour moi, la solution ci-dessus ne fonctionnait pas.
Rizwan Sohaib

1
Lors de l'instanciation du géocodeur, vous devez passer le contexte Geocoder coder = new Geocoder (this); ou nouveau Geocoder (getApplicationContext) pas getActivity () comme indiqué dans la réponse.
The_Martian

1
Le code @Quantumdroid ci-dessus est écrit en fragment. Sinon, vous avez tout à fait raison. C'est le contexte.
Nayanesh Gupte

2
Solution belle et propre. Aucune des réponses ne mentionne que Geocoder utilise un accès synchrone, en tant que tel, il est fortement recommandé de le mettre dans un service d'arrière-plan pour éviter de bloquer l'interface utilisateur.
The_Martian

1
Excellente solution. IOException sera appelée lorsque l'adresse / code postal invalide est entré. Vous pouvez éviter cette erreur avec un simple if(address.size() <1){//show a Toast}else{//put rest of code here}
grantespo

51

Si vous souhaitez placer votre adresse dans google map, utilisez simplement les éléments suivants

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

OU

si vous aviez besoin d'obtenir lat long de votre adresse, utilisez Google Place Api en suivant

créer une méthode qui retourne un JSONObject avec la réponse de l' appel HTTP comme suit

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

passez maintenant ce JSONObject à la méthode getLatLong () comme suit

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

J'espère que cela vous aidera et les autres .. !! Je vous remercie..!!


1
malheureusement cette solution ne fonctionne pas avec la connexion mobile de certains opérateurs mobiles: la requête renvoie toujours OVER_QUERY_LIMIT . Ces opérateurs mobiles utilisent la surcharge NAT, attribuant la même adresse IP à de nombreux appareils ...
Umberto

@UmbySlipKnot Pouvez-vous nous en dire plus sur OVER_QUERY_LIMIT? Qu'est-ce que c'est? Merci.
FariborZ

7

Le code suivant fonctionnera pour 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

Où adresse est la chaîne (zip 123 Testing Rd City State) que vous souhaitez convertir en LatLng.


3

C'est ainsi que vous pouvez trouver la latitude et la longitude de l'endroit où nous avons cliqué sur la carte.

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

Ça marche bien.

Pour obtenir l'adresse de l'emplacement, nous pouvons utiliser la classe de géocodeur.


1

Une réponse au problème de Kandha ci-dessus:

Il lance le "service java.io.IOException non disponible" J'ai déjà donné ces autorisations et inclut la bibliothèque ... je peux obtenir une vue de la carte ... cela lance cette IOException au géocodeur ...

Je viens d'ajouter une capture IOException après l'essai et cela a résolu le problème

    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
Cette vérification nulle ne fait rien.
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();
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.