gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:10:03 25 4
gpt4 key购买 nike

我正在使用 Google Places Apis 来过滤特定城市内的结果。我能够过滤结果。但它也会显示该城市以外的结果。例如,如果我设置 DELHI 城市的 LatLngBounds 并搜索 NEWYORK 城市的位置。它还为我提供了纽约市的结果(但纽约市的 LatLng 不在德里)。

如何将我的结果限制在特定城市?

这是我的 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;
}
}

最佳答案

查看文档:

public abstract PendingResult getAutocompletePredictions (GoogleApiClient client, String query, LatLngBounds bounds, AutocompleteFilter filter) Returns autocomplete predictions for a query based on the names and addresses of places. For more information, see the developer's guide.

此方法执行网络查找。

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

参数

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

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

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

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

更新

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

参见 https://stackoverflow.com/a/50134855/5140781了解更多详情。

关于android - 在 Google Places Apis 中搜索特定城市内的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com