Подтвердить что ты не робот

Поиск местоположений в определенном городе в 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;
    }
}
4b9b3361

Ответ 1

Взгляд на документацию:

публичный репортаж PendingResult getAutocompletePredictions (клиент GoogleApiClient, строковый запрос, границы LatLngBounds, фильтр AutocompleteFilter)  Возвращает предсказания автозаполнения для запроса на основе имен и адресов мест. Для получения дополнительной информации см. Руководство разработчика.

Этот метод выполняет поиск в сети.

Доступ к этому методу зависит от ограничений квот. Подробнее см. В разделе "Ограничения использования".

Параметры

query Строка запроса, для которой должны быть получены предсказания автозаполнения.

границы Географические границы. Если они есть, возвращаемые прогнозы будут смещены в сторону мест в этой области.

filter Фильтр, используемый для ограничения возвращаемых прогнозов. Если значение null, будет использоваться фильтр без ограничений.

Описание для "границ" - это возврат прогнозов предвзятого. Поэтому они не фильтруются, а предвзяты, основываясь на этих границах. Это означает, что результаты внутри границы должны иметь более высокий приоритет, но они не будут единственными результатами.

Ответ 2

Правильный код, который вы написали. Я тоже сделал это, но никогда не пробовал с ограничениями. Я проверил с ограничениями и просмотрел документацию, написав, что он даст предвзятые результаты, что означает, что он даст результаты с приоритетом в пределах заданных границ.

Вот ссылка на документацию

https://developers.google.com/places/android-api/autocomplete