在Google Places Apis中搜索特定城市内的位置

我正在使用Google Places Apis过滤特定城市内的结果。我可以过滤结果。但它也会显示该城市的结果。 例如,如果我设置DELHI城市的LatLngBounds并在城市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 implements Filterable { private ArrayList 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 getAutocomplete(CharSequence constraint) { if (mGoogleApiClient.isConnected()) { PendingResult 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; } } 

看文档:

public abstract PendingResult getAutocompletePredictions(GoogleApiClient客户端,字符串查询,LatLngBounds边界,AutocompleteFilterfilter)根据地点的名称和地址返回查询的自动完成预测。 有关更多信息,请参阅开发人员指南。

此方法执行网络查找。

访问此方法受配额限制。 有关详细信息,请参阅使用限制。

参数

query要为其提取自动完成预测的查询字符串。

边界 地理边界。 如果存在,返回的预测将偏向该区域的位置。

filter用于限制返回的预测的filter。 如果为null,则将使用没有约束的filter。

“边界”的描述是返回有偏见的预测。 所以那些没有被过滤,但是基于这个界限有偏见。 这意味着绑定内的结果应该具有更高的优先级,但这些结果不会是唯一的结果。

UPDATE

截至2018年4月,Google增加了指定如何处理自动完成预测中的边界的可能性。 现在,您可以使用带有boundsMode参数的GeoDataClient类的getAutocompletePredictions()方法。

有关详细信息,请参阅https://stackoverflow.com/a/50134855/5140781 。

你写的代码是对的。 我也做过这个,但从未尝试过。 我检查了边界并浏览了文档,它写了它将给出有偏见的结果,这意味着它将给出优先于给定范围内的结果。

这是文档链接

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