25

Sto cercando il luogo nelle mie app utilizzando la posizione di completamento automatico di Google api e ora voglio ottenere latitudine e longitudine del luogo che ho cercato. Come ottenere latitudine e longitudine dal risultato restituito da autocomplete posizionare API da google in Android?ottiene Lat Lang da un posto restituito da autocomplete posto api

+0

Utilizzare Geocoder. Fare riferimento a: http://developer.android.com/reference/android/location/Geocoder.html – shyam

+0

L'API corrente non consente di farlo con una richiesta poiché è possibile con l'API Web. Si prega di upvotare https://issuetracker.google.it/issues/35828699 per richiedere le coordinate esposte nella risposta alle previsioni. – AlexKorovyansky

risposta

5

Ogni posto restituito nella risposta place-autocomplete ha un ID e una stringa di riferimento come spiegato here.

Utilizzare uno (preferibilmente ID Da è deprecato riferimento) per interrogare Luoghi API per la piena informazioni su quel luogo (tra cui lat/lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests

Per quanto riguarda il commento di Shyam - Geocoding funziona solo se hai un indirizzo completo nella risposta di completamento automatico che non è sempre il caso. Inoltre Geocoding fornisce un elenco di possibili risultati poiché la descrizione del luogo che si ottiene nella risposta al completamento automatico non è univoca. A seconda delle esigenze, la geocodifica potrebbe essere sufficiente.

1

Il geocoding è una soluzione molto indiretta e, come il secondo interlocutore, ha affermato che se si esegue "Apple Store" non è possibile restituire l'indirizzo completo. Invece:

Place_ID contiene tutto ciò di cui hai bisogno. Suppongo che tu sappia come ottenere place_id dall'API Places (hanno un esempio completo se non).

Poi tirare una seconda richiesta per i dettagli posto (tra cui latitudine e longitudine nella sezione geometria) utilizzando la place_id seguente documentazione: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs

+0

Questo è stato molto utile per ottenere i dati completi di un luogo. – karenms

20

Google Place Details è la risposta.

Dal place_id hai, interrogare Luogo Dettagli qualcosa come https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} e si può ottenere la lat e lng da result.geometry.location JSON.

0

Questo frammento di codice consente di ottenere la latitudine e la longitudine di un luogo secondo l'identificatore di nuovo nel completamento automatico

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

Il seguente frammento di codice che utilizza Google Places API per Android ha funzionato per me

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

Visita Google Places API for Android per una lista completa dei metodi per recuperare i dati da un luogo

-1
 Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId) 
     .setResultCallback(new ResultCallback<PlaceBuffer>() { 
     @Override 
     public void onResult(PlaceBuffer places) { 
      if (places.getStatus().isSuccess() && places.getCount() > 0) { 
       final Place myPlace = places.get(0); 
       Log.i(TAG, "Place found: " + myPlace.getName()); 
       LatLng latlangObj = myPlace.getLatLng(); 
       Log.v("latitude:", "" + latlangObj.latitude); 
       Log.v("longitude:", "" + latlangObj.longitude); 
      } else { 
       Log.e(TAG, "Place not found"); 
    } 
    places.release(); 
    } 
}); 

Utilizzare questo metodo per ottenere lat e lang da placeid.

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

Con il codice di cui sopra, è possibile ottenere il LatLng così come l'indirizzo di stringa. Usa LatLng dove vuoi.

Problemi correlati