Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
872 views
in Technique[技术] by (71.8m points)

google maps - How to get Places.GeoDataApi.getAutocompletePredictions ONLY inside the bounds?

I am using Places.GeoDataApi for Android and I get different search results depending on the location of the device performing the request. I need the results to be consistently located inside the bounds. I don't see where that could be setup in the getAutocompletePredictions request. Is there anything I am missing?

I get address/place autocomplete suggestions using the GoogleApiClient and Places API through:

Places.GeoDataApi.getAutocompletePredictions()

The method requires a GoogleApiClient object, a String to autocomplete, and a LatLngBounds object to limit the search range. This is what my usage looks like:

LatLngBounds bounds = new LatLngBounds(new LatLng(38.46572222050097, -107.75668023304138),new LatLng(39.913037779499035, -105.88929176695862));


GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .addApi(Places.GEO_DATA_API)
            .build();


PendingResult<AutocompletePredictionBuffer> results =
Places.GeoDataApi.getAutocompletePredictions(googleApiClient, "Starbucks", bounds, null);

Version in use: com.google.android.gms:play-services-location:8.3.0

Documentation: https://developers.google.com/places/android/autocomplete

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Good news. As of April 2018 Google added possibility to specify how to treat the bounds in autocomplete predictions. Now you can use the getAutocompletePredictions() method of GeoDataClient class with boundsMode parameter

public Task<AutocompletePredictionBufferResponse> getAutocompletePredictions (String query, LatLngBounds bounds, int boundsMode, AutocompleteFilter filter)

boundsMode - How to treat the bounds parameter. When set to STRICT predictions are contained by the supplied bounds. If set to BIAS predictions are biased towards the supplied bounds. If bounds is null then this parameter has no effect.

source: https://developers.google.com/android/reference/com/google/android/gms/location/places/GeoDataClient

You can modify your code to something similar to:

LatLngBounds bounds = new LatLngBounds(new LatLng(38.46572222050097, -107.75668023304138),new LatLng(39.913037779499035, -105.88929176695862));
GeoDataClient mGeoDataClient = Places.getGeoDataClient(getBaseContext());;

Task<AutocompletePredictionBufferResponse> results =
        mGeoDataClient.getAutocompletePredictions("Starbucks", bounds, GeoDataClient.BoundsMode.STRICT, null);

try {
    Tasks.await(results, 60, TimeUnit.SECONDS);
} catch (ExecutionException | InterruptedException | TimeoutException e) {
    e.printStackTrace();
}

try {
    AutocompletePredictionBufferResponse autocompletePredictions = results.getResult();

    Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount()
            + " predictions.");

    // Freeze the results immutable representation that can be stored safely.
    ArrayList<AutocompletePrediction> al = DataBufferUtils.freezeAndClose(autocompletePredictions);

    for (AutocompletePrediction p : al) {
        CharSequence cs = p.getFullText(new CharacterStyle() {
            @Override
            public void updateDrawState(TextPaint tp) {

            }
        });
        Log.i(TAG, cs.toString());
    }

} catch (RuntimeExecutionException e) {
    // If the query did not complete successfully return null
    Log.e(TAG, "Error getting autocomplete prediction API call", e);
}

I hope this helps!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...