Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Maps API v3 - Geocoder results issue with bounds

Goal: I want to have a custom search (geocode) function and be able to list and click each result and display it on the map.

Wanted: Adjust map bounds / zoom level accordingly, i.e. searching for "MA, USA" should zoom the map to let me see the whole Massachusetts state, while searching for "Boston, MA, USA" should zoom on the Boston area. When listing multiple results, the same should apply when clicking on a result.

Issue: I can use the geometry.bounds object with fitBounds - but - some results you get using the geocoder do not have that geometry.bounds object.

A quick example: searching for "Boston" returns

Boston, MA, USA
Boston, IN, USA
Boston, KY, USA
Boston, GA 31626, USA
Boston, Salem, VA 22713, USA
Boston, NY 14025, USA

Both "Boston, KY" and "Boston NY 14025" do not have bounds.

Question: Is there a reliable way to display any geocoder result on a map at the appropriate zoom level?

Right now I am using something like that but I find this ugly and it doesn't solve the zoom issue

if (results[0].geometry.bounds) {

    map.fitBounds(results[0].geometry.bounds);

} else {

    map.setCenter(results[0].geometry.location);
    // eventually set zoom here to some middle-range value (ugly)
}
like image 263
MrUpsidown Avatar asked Feb 28 '12 22:02

MrUpsidown


People also ask

What happens when you exceed the Google geocoding API rate limit 1 point?

According to Google's API Usage and Billing page, there is a limit of 50 requests per second. If you exceed this amount, subsequent requests to the API will fail with the OVER_DAILY_LIMIT or OVER_QUERY_LIMIT status code and the geocoded data will not be returned.

What does geocoder failed due to Over_query_limit?

If you are getting the error OVER_QUERY_LIMIT when trying to geocode an address with Google set as geocoding provider, this means that you exceeded the Google Maps Platform web services usage limits by: sending too many requests per day or e.g. by. sending requests too fast, i.e. too many requests per second.

What is the maximum limit for the number of geocode requests?

While there is no maximum number of requests per day, the following usage limit is still in place for the Geocoding API: 50 requests per second, calculated as the sum of client-side and server-side queries.


2 Answers

Right. After trying both methods and testing, it comes out that:

  1. the geometry.bounds object is "optionnaly returned" as the doc says
  2. we don't exactly know what the geometry.bounds object is based on
  3. geometry.bounds "may not match the recommended viewport" and often doesn't
  4. geometry.bounds returns a square or rectangle of any size and shape while the viewport functions always return a rectangle with the same aspect ratio (around 1.43), whatever your map container dimensions are, as far as I tested.

Below is the example of San Francisco, CA, mentioned in the doc.
In red using geometry.bounds and in blue using the viewport functions.

San Francisco, CA

The solution is simple enough and is reliable.

var resultBounds = new google.maps.LatLngBounds(

    results[0].geometry.viewport.getSouthWest(), 
    results[0].geometry.viewport.getNorthEast()
);

map.fitBounds(resultBounds);
like image 127
MrUpsidown Avatar answered Sep 21 '22 21:09

MrUpsidown


The viewport object has the information you need to make a bounds object. Something like this:

var bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(results[0].geometry.viewport.southwest.lat, results[0].geometry.viewport.southwest.lng),
    new google.maps.LatLng(results[0].geometry.viewport.northeast.lat, results[0].geometry.viewport.northeast.lng)
);

Then you can use fitBounds on that new bounds object, just like you're doing for the returned bounds object. Like this:

map.fitBounds(bounds);
like image 44
Allan Wintersieck Avatar answered Sep 17 '22 21:09

Allan Wintersieck