web-dev-qa-db-fra.com

récupère Lat Lang à partir d'un identifiant place_id renvoyé par api d'endroit auto-complété

Je cherche l'endroit dans mes applications à l'aide de l'api Google auto-complétion et je souhaite maintenant obtenir la latitude et la longitude de l'endroit que j'ai recherché. Comment obtenir la latitude et la longitude du résultat renvoyé par la fonction de complétion automatique api par Google dans Android?

35
Sajal

L'extrait de code suivant, qui utilise l'API Google Places pour Android, a fonctionné pour moi

Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId)
    .setResultCallback(new ResultCallback<PlaceBuffer>() {
  @Override
  public void onResult(PlaceBuffer places) {
    if (places.getStatus().isSuccess()) {
      final Place myPlace = places.get(0);
      LatLng queriedLocation = myPlace.getLatLng();
      Log.v("Latitude is", "" + queriedLocation.latitude);
      Log.v("Longitude is", "" + queriedLocation.longitude);
    }
    places.release();
  }
});

Visitez API Google Places pour Android pour obtenir une liste complète des méthodes permettant de récupérer des données d'un lieu

44
droidmad

Détails Google Place est la réponse.

A partir du place_id que vous avez obtenu, interrogez Place Details quelque chose comme https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} et vous pouvez obtenir les lat et lng à partir de result.geometry.location JSON.

23
CallMeLaNN

Chaque lieu renvoyé dans la réponse place-autocomplete a un identifiant et une chaîne de référence, comme expliqué ici

Utilisez soit (de préférence Id puisque la référence est obsolète) pour interroger l'API Places pour obtenir des informations complètes sur ce lieu (y compris lat/lng): https://developers.google.com/places/documentation/details# PlaceDetailsRequests

Concernant le commentaire de shyam - Le géocodage ne fonctionnera que si vous avez une adresse complète dans la réponse à la saisie semi-automatique, ce qui n’est pas toujours le cas. Le géocodage donne également une liste des résultats possibles, car la description de lieu que vous obtenez dans la réponse à la saisie semi-automatique n'est pas unique. Selon vos besoins, le géocodage peut suffire.

5
nitzanj

Réf.: - https://developers.google.com/places/Android/place-details#get-place Le lien ci-dessus donne un objet lieu qui aura lat et long L'objet lieu est défini à partir du lieu que l'on obtient automatiquement du lieu.

2
rohitsakala
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (requestCode == Constant.REQUEST_LOCATION_CODE) {

        Place place = PlaceAutocomplete.getPlace(this, data);

        if (place != null) {
            LatLng latLng = place.getLatLng();
            mStringLatitude = String.valueOf(latLng.latitude);
            mStringLongitude = String.valueOf(latLng.longitude);
            EditTextAddress.setText(place.getAddress());
        }
    }
}

Avec le code ci-dessus, vous pouvez obtenir l'adresse LatLng ainsi que l'adresse de chaîne. Utilisez le LatLng où vous voulez.

2
Fahry Mohammed

Le géocodage est une solution très indirecte et, comme l’a dit le second intervenant, si vous exécutez "Apple Store", l’adresse complète risque de ne pas être renvoyée. Au lieu:

Place_ID contient tout ce dont vous avez besoin. Je suppose que vous savez comment obtenir le lieu_id à partir de l'API Places (ils ont un exemple complet sinon).

Ensuite, extrayez une deuxième demande pour les détails du lieu (y compris la latitude et la longitude dans la section géométrie) à l'aide de l'identifiant place_id suivant cette documentation: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign = mdr-devdocs

2
Sal

Cet extrait de code permet d’obtenir la latitude et la longitude d’un lieu en fonction de l’identifiant dans l’auto-complétion

    public class PlacesDetails {
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place";
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete";
    private static final String TYPE_DETAIL = "/details";
    private static final String OUT_JSON = "/json";



    //private static final String API_KEY = "------------ make your specific key ------------; // cle pour le serveur       
    public PlacesDetails() {
        // TODO Auto-generated constructor stub
    }
    public  ArrayList<Double> placeDetail(String input) {
        ArrayList<Double> resultList = null;

        HttpURLConnection conn = null;
        StringBuilder jsonResults = new StringBuilder();
        try {
            StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_DETAIL + OUT_JSON);
            sb.append("?placeid=" + URLEncoder.encode(input, "utf8"));
            sb.append("&key=" + API_KEY);
            URL url = new URL(sb.toString());
            //Log.e("url", url.toString());
            System.out.println("URL: "+url);
            System.out.println("******************************* connexion au serveur *****************************************");
            //Log.e("nous sommes entrai de test la connexion au serveur", "test to connect to the api");
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());

            // Load the results into a StringBuilder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                jsonResults.append(buff, 0, read);

            }
            System.out.println("le json result"+jsonResults.toString());
        } catch (MalformedURLException e) {
            //Log.e(LOG_TAG, "Error processing Places API URL", e);
            return resultList;
        } catch (IOException e) {
            //Log.e(LOG_TAG, "Error connecting to Places API", e);
            return resultList;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
            System.out.println("******************************* fin de la connexion*************************************************"); 
        }

        try {

            // Create a JSON object hierarchy from the results
            //Log.e("creation du fichier Json", "creation du fichier Json");
            System.out.println("fabrication du Json Objet");
            JSONObject jsonObj = new JSONObject(jsonResults.toString());
            //JSONArray predsJsonArray = jsonObj.getJSONArray("html_attributions");
            JSONObject result = jsonObj.getJSONObject("result").getJSONObject("geometry").getJSONObject("location");
            System.out.println("la chaine Json "+result);
            Double longitude  = result.getDouble("lng");
            Double latitude =  result.getDouble("lat");
            System.out.println("longitude et latitude "+ longitude+latitude);
            resultList = new ArrayList<Double>(result.length());
            resultList.add(result.getDouble("lng"));
            resultList.add(result.getDouble("lat"));
            System.out.println("les latitude dans le table"+resultList);

        } catch (JSONException e) {
            ///Log.e(LOG_TAG, "Cannot process JSON results", e);
        }

        return resultList;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PlacesDetails pl = new PlacesDetails();
        ArrayList<Double> list = new ArrayList<Double>();
        list = pl.placeDetail("ChIJbf7h4osSYRARi8SBR0Sh2pI");
        System.out.println("resultat de la requette"+list.toString());
    }    
}
0
Blaise Siani