Получить Lat Lang из place_id, возвращенного автозаполненным местом api
Я ищу место в своих приложениях с помощью автозаполнения google api, и теперь я хочу получить широту и долготу того места, которое я искал. Как получить широту и долготу из результата, возвращаемого автозаполнением api в google в android?
Ответы
Ответ 1
Следующий фрагмент кода, который использует API Google Places для android, работал у меня
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();
}
});
Посетите API Google Адресов для Android для получения полного списка методов извлечения данных из места
Ответ 2
Сведения о Google Place - это ответ.
Из place_id
, который вы получили, запросите Place Details что-то вроде https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key}
, и вы можете получить lat
и lng
из result.geometry.location
JSON.
Ответ 3
Каждое место, возвращенное в место - ответ автозаполнения, содержит Id и ссылочную строку, как описано здесь.
Используйте либо (предпочтительно Id, поскольку ссылка устарела), чтобы запросить API-интерфейс Places для получения полной информации об этом месте (включая lat/lng):
https://developers.google.com/places/documentation/details#PlaceDetailsRequests
Относительно комментария shyam - Геокодирование будет работать только в том случае, если вы получили полный адрес в ответе автозаполнения, что не всегда так. Также геокодирование дает список возможных результатов, поскольку описание места, которое вы получаете в ответе автозаполнения, не уникально. В зависимости от ваших потребностей геокодирования может быть достаточно.
Ответ 4
Геокодирование - это очень косвенное решение, и, как сказал второй ответчик, если вы делаете "Apple Store", он может не возвращать полный адрес. Вместо этого:
Place_ID содержит все, что вам нужно. Я предполагаю, что вы знаете, как получить place_id из API Places (у них есть полный пример, если нет).
Затем вытащите второй запрос для деталей места (включая широту и долготу в разделе геометрии) с помощью place_id, следующего за этой документацией:
https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs
Ответ 5
Ссылка: - https://developers.google.com/places/android/place-details#get-place
Вышеупомянутая ссылка дает объект места, который будет иметь длину и длину. Объект места деируется из места, из которого можно получить автозаполнение места.
Ответ 6
@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());
}
}
}
С помощью приведенного выше кода вы можете получить как LatLng, так и адрес String. Используйте LatLng, где вы хотите.
Ответ 7
Этот фрагмент позволяет получить широту и долготу места в соответствии с идентификатором обратно в автоматическое завершение
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());
}
}
Ответ 8
На основании последней версии документации по автозаполнению
Вариант 1. Встраивание фрагмента AutocompleteSupportFragment.
AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
autocompleteFragment
.setPlaceFields(Arrays.asList(Place.Field.ID,
Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS));
Вариант 2. Использование намерения для запуска операции автозаполнения
List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS);
// Start the autocomplete intent.
Intent intent = new Autocomplete.IntentBuilder(
AutocompleteActivityMode.FULLSCREEN, fields)
.build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
какие бы поля вы ни интересовали, вы должны упомянуть, как указано выше.
Вы получите результат, как показано ниже:
onPlaceSelected:
{
"a":"#90, 1st Floor, Balaji Complex, Kuvempu Main Road, Kempapura, Hebbal
Kempapura, Bengaluru, Karnataka 560024, India",
"b":[],
"c":"ChIJzxEsY4QXrjsRQiF5LWRnVoc",
"d":{"latitude":13.0498176,"longitude":77.600347},
"e":"CRAWLINK Networks Pvt. Ltd."
}
Примечание. Результат отображается при разборе объекта Place на json
Ответ 9
добавить эти строки под функцию
autocomplete.addListener('place_changed', function() {});
var place = autocomplete.getPlace();
autocomplete.setFields(['place_id', 'geometry', 'name', 'formatted_address']);
var lng = place.geometry.location.lng();
var lat = place.geometry.location.lat();
var latlng = {lat , lng};
console.log(latlng);
Ответ 10
предоставьте Place.Field.LAT_LNG, чтобы получить широту и долготу для места.
autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID,
Place.Field.NAME,Place.Field.LAT_LNG));
тогда получите LatLng
LatLng destinationLatLng = place.getLatLng();
и может видеть сквозь тост
destlat = destinationLatLng.latitude;
destLon = destinationLatLng.longitude;
Toast.makeText(getApplicationContext(), "" + destlat + ',' + destLon, Toast.LENGTH_LONG).show();
Ответ 11
Прости нас, мы новички. Мы пытаемся получить широту и долготу адреса в Google Places SDK, но мы получаем только искомый адрес, который использует getLat и getLng, но либо мы не знаем, где его разместить, либо неправильно его указали. Заранее большое спасибо.
//JAVA ДЕЯТЕЛЬНОСТЬ
//PARTE CODIGO AUTOOMPLETE
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
private static final String TAGGOOGLE = "GoogleActivity";
private static final int RC_SIGN_IN = 1;
private int STORAGE_PERMISSION_CODE= 1;//Para los permisos
final private int REQUEST_CODE_ASK_PERMISSIONS = 111;
private static final String TAG = "CAPublicaOfertaActivity";
//COORDENADAS ENTRE LAS QUE BUSCA EL AUTOCOMPLETE
private static final LatLngBounds LAT_LNG_BOUNDS = new LatLngBounds(
new LatLng(27.666172, -18.273932), new LatLng(42.772283, 4.747570));
//PARTE CODIGO AUTOOMPLETE
AutoCompleteTextView etdireccionnegocioAutoCA;
PlaceAutocompleteAdapter mPlaceAutocompleteAdapter;
GoogleApiClient mGoogleApiClient;
//DECLARO VARIANTES
TextView tvocultolatitudCA, tvocultolongitudCA, tvocultoCA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capublicar_oferta);
// AUTOCOMPLETE
etdireccionnegocioAutoCA = (AutoCompleteTextView) findViewById(R.id.etdireccionnegocioAutoCA);
//INICIAR PROCESO AUTOOMPLETE
init();
//ENLAZO VARIANTES
tvocultolatitudCA = (TextView) findViewById(R.id.tvocultolatitudCA);
tvocultolongitudCA = (TextView) findViewById(R.id.tvocultolongitudCA);
tvocultoCA = (TextView) findViewById(R.id.tvocultoCA);
}//FIN ONCREATE
//MANDAR OFERTA
public void publicaroferta(View view) {
//ENLAZO VARIANTES CAMPOS OBLIGATORIOS
String direccionnegocioCA = etdireccionnegocioAutoCA.getText().toString();
String latitudnegocioCA = tvocultolatitudCA.getText().toString();
//Double latitudint = Double.parseDouble(latitudnegocioCA);
String longitudnegocioCA = tvocultolongitudCA.getText().toString();
//Double longitudint = Double.parseDouble(longitudnegocioCA);
}
//PROTOCOLO AUTOCOMPLETE
private void init() {
Log.d(TAG, "init: initializing");
mGoogleApiClient = new GoogleApiClient
.Builder(this)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.enableAutoManage(this, this)
.build();
mPlaceAutocompleteAdapter = new PlaceAutocompleteAdapter(this, mGoogleApiClient,
LAT_LNG_BOUNDS, null);
etdireccionnegocioAutoCA.setAdapter(mPlaceAutocompleteAdapter);
etdireccionnegocioAutoCA.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_SEARCH
|| actionId == EditorInfo.IME_ACTION_DONE
|| keyEvent.getAction() == KeyEvent.ACTION_DOWN
|| keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {
}
return false;
}
});
hideSoftKeyboard();
}
private void hideSoftKeyboard(){
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
//АДАПТЕР
public class PlaceAutocompleteAdapter
extends ArrayAdapter<AutocompletePrediction> implements Filterable {
private static final String TAG = "PlaceAutoCompleteAd";
private static final CharacterStyle STYLE_BOLD = new StyleSpan(Typeface.BOLD);
private ArrayList<AutocompletePrediction> mResultList;
private GoogleApiClient mGoogleApiClient;
private LatLngBounds mBounds;
private AutocompleteFilter mPlaceFilter;
public PlaceAutocompleteAdapter(Context context, GoogleApiClient googleApiClient,
LatLngBounds bounds, AutocompleteFilter filter) {
super(context, android.R.layout.simple_expandable_list_item_2, android.R.id.text1);
mGoogleApiClient = googleApiClient;
mBounds = bounds;
mPlaceFilter = filter;
}
public void setBounds(LatLngBounds bounds) {
mBounds = bounds;
}
@Override
public int getCount() {
return mResultList.size();
}
@Override
public AutocompletePrediction getItem(int position) {
return mResultList.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = super.getView(position, convertView, parent);
AutocompletePrediction item = getItem(position);
TextView textView1 = (TextView) row.findViewById(android.R.id.text1);
TextView textView2 = (TextView) row.findViewById(android.R.id.text2);
textView1.setText(item.getPrimaryText(STYLE_BOLD));
textView2.setText(item.getSecondaryText(STYLE_BOLD));
return row;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<AutocompletePrediction> filterData = new ArrayList<>();
if (constraint != null) {
filterData = getAutocomplete(constraint);
}
results.values = filterData;
if (filterData != null) {
results.count = filterData.size();
} else {
results.count = 0;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
mResultList = (ArrayList<AutocompletePrediction>) results.values;
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public CharSequence convertResultToString(Object resultValue) {
if (resultValue instanceof AutocompletePrediction) {
return ((AutocompletePrediction) resultValue).getFullText(null);
} else {
return super.convertResultToString(resultValue);
}
}
};
}
private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) {
if (mGoogleApiClient.isConnected()) {
Log.i(TAG, "Starting autocomplete query for: " + constraint);
PendingResult<AutocompletePredictionBuffer> results =
Places.GeoDataApi
.getAutocompletePredictions(mGoogleApiClient, constraint.toString(),
mBounds, mPlaceFilter);
AutocompletePredictionBuffer autocompletePredictions = results
.await(60, TimeUnit.SECONDS);
final Status status = autocompletePredictions.getStatus();
if (!status.isSuccess()) {
Toast.makeText(getContext(), "Error contacting API: " + status.toString(),
Toast.LENGTH_SHORT).show();
Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString());
autocompletePredictions.release();
return null;
}
Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount()
+ " predictions.");
return DataBufferUtils.freezeAndClose(autocompletePredictions);
}
Log.e(TAG, "Google API client is not connected for autocomplete query.");
return null;
}
Ответ 12
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();
}
});
Используйте этот метод для получения lat и lang из placeid.