Поиск местоположений в определенном городе в Google Местах Apis
Я использую Google Places Apis для фильтрации результатов внутри определенного города. Я могу фильтровать результаты. Но он также показывает результаты на стороне этого города.
Например, если я установил LatLngBounds города DELHI и искал местоположение в городе NEWYORK. Это также дает мне результат города NEWYORK (но NEWYORK LatLng не лежит внутри DELHI).
Как я могу ограничить результаты в определенном городе?
Это мой класс PlaceAutoCompleteAdapter
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.common.data.DataBufferUtils;
import com.google.android.gms.location.places.AutocompleteFilter;
import com.google.android.gms.location.places.AutocompletePrediction;
import com.google.android.gms.location.places.AutocompletePredictionBuffer;
import com.google.android.gms.location.places.Places;
import com.google.android.gms.maps.model.LatLngBounds;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class PlaceAutocompleteAdapter
extends ArrayAdapter<AutocompletePrediction> implements Filterable {
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,R.layout.simple_expandble_text_view_item, 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(R.id.text1);
textView1.setText(item.getDescription());
return row;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null) {
mResultList = getAutocomplete(constraint);
if (mResultList != null) {
results.values = mResultList;
results.count = mResultList.size();
}
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public CharSequence convertResultToString(Object resultValue) {
if (resultValue instanceof AutocompletePrediction) {
return ((AutocompletePrediction) resultValue).getDescription();
} else {
return super.convertResultToString(resultValue);
}
}
};
}
private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) {
if (mGoogleApiClient.isConnected()) {
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();
autocompletePredictions.release();
return null;
}
return DataBufferUtils.freezeAndClose(autocompletePredictions);
}
return null;
}
}
Ответы
Ответ 1
Взгляд на документацию:
публичный репортаж PendingResult getAutocompletePredictions (клиент GoogleApiClient, строковый запрос, границы LatLngBounds, фильтр AutocompleteFilter) Возвращает предсказания автозаполнения для запроса на основе имен и адресов мест. Для получения дополнительной информации см. Руководство разработчика.
Этот метод выполняет поиск в сети.
Доступ к этому методу зависит от ограничений квот. Подробнее см. В разделе "Ограничения использования".
Параметры
query Строка запроса, для которой должны быть получены предсказания автозаполнения.
границы Географические границы. Если они есть, возвращаемые прогнозы будут смещены в сторону мест в этой области.
filter Фильтр, используемый для ограничения возвращаемых прогнозов. Если значение null, будет использоваться фильтр без ограничений.
Описание для "границ" - это возврат прогнозов предвзятого. Поэтому они не фильтруются, а предвзяты, основываясь на этих границах. Это означает, что результаты внутри границы должны иметь более высокий приоритет, но они не будут единственными результатами.
Ответ 2
Правильный код, который вы написали. Я тоже сделал это, но никогда не пробовал с ограничениями. Я проверил с ограничениями и просмотрел документацию, написав, что он даст предвзятые результаты, что означает, что он даст результаты с приоритетом в пределах заданных границ.
Вот ссылка на документацию
https://developers.google.com/places/android-api/autocomplete