android - setmylocationenabled - google maps api demos
obtener Lat Lang de un place_id devuelto por autocompletar lugar api (8)
Estoy buscando el lugar en mis aplicaciones usando la API de autocompletar de Google y ahora quiero obtener la latitud y la longitud del lugar que he buscado. ¿Cómo obtener la latitud y la longitud del resultado devuelto por la API de autocompletar lugar en Google en Android?
Cada lugar devuelto en la respuesta de autocompletar lugar tiene una Id y una cadena de referencia como se explica here .
Utilice cualquiera (preferiblemente Id ya que la referencia está en desuso) para consultar la API de Places para obtener la información completa sobre ese lugar (incluido lat / lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests
Con respecto al comentario de shyam: la codificación geográfica solo funcionará si tienes una dirección completa en la respuesta de autocompletar, que no siempre es el caso. Además, la codificación geográfica ofrece una lista de resultados posibles, ya que la descripción del lugar que obtienes en la respuesta de autocompletar no es única. Dependiendo de sus necesidades, la geocodificación podría ser suficiente.
El siguiente fragmento de código que usa la API de Google Places para Android funcionó para mí
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();
}
});
Visite la API de Google Places para Android para obtener una lista completa de métodos para recuperar datos de un lugar
Este fragmento permite obtener la latitud y la longitud de un lugar de acuerdo con el identificador en el autocompletar
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());
}
}
La geocodificación es una solución muy indirecta, y como dijo el segundo respondedor, si hace "Apple Store" puede que no devuelva la dirección completa. En lugar:
Place_ID contiene todo lo que necesitas. Supongo que sabes cómo obtener el place_id de la API de Places (tienen un ejemplo completo si no es así).
A continuación, obtenga una segunda solicitud para los detalles del lugar (incluida la latitud y la longitud en la sección de geometría) utilizando el place_id que sigue a esta documentación: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs
Ref: - https://developers.google.com/places/android/place-details#get-place El enlace de arriba muestra un objeto de lugar que tendrá latitud y longitud. El objeto lugar se deriva del placeid que se obtiene del lugar de autocompletar.
Google Place Details es la respuesta.
Desde el place_id
que obtuviste, consulta los detalles de lugar como https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key}
y puedes obtener lat
and lng
de result.geometry.location
JSON.
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();
}
});
Utiliza este método para obtener lat y lang de 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 el código anterior, puede obtener la LatLng y la dirección de Cadena. Use LatLng donde quiera.