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
risposta
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.
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
Questo è stato molto utile per ottenere i dati completi di un luogo. – karenms
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.
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());
}
}
Ref: - https://developers.google.com/places/android/place-details#get-place Il link sopra dà un oggetto posto che avrà lat e lungo. L'oggetto posto viene rimosso da placeid che si ottiene dal completamento automatico del luogo.
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
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.
@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.
Utilizzare Geocoder. Fare riferimento a: http://developer.android.com/reference/android/location/Geocoder.html – shyam
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