City / state analysis from Google Maps request

var geocoder = new google.maps.Geocoder(); geocoder.geocode({'latLng': foundLoc}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { if (results[1]) { var loc = getCityState(results); } } }); function getCityState(results) { var citystateArray = results[1].formatted_address.split(",",2); var city = citystateArray[0]; var state = citystateArray[1].substring(1, 3); return (city + ', ' + state) } 

This is what I use now, and it works in about 90% of cases. In other cases, formatted_address contains the city and the city along with the state, sometimes only the city and the city, and sometimes everything you can dream of.

I have not yet found a CONSISTENT way to ALWAYS get the city / state from the results of the Google Maps API. Do any of you guys have one? Thanks.

An example of one answer that Google uses as an example on its page:

 { "status": "OK", "results": [ { "types": [ "street_address" ], "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", "address_components": [ { "long_name": "1600", "short_name": "1600", "types": [ "street_number" ] }, { "long_name": "Amphitheatre Pkwy", "short_name": "Amphitheatre Pkwy", "types": [ "route" ] }, { "long_name": "Mountain View", "short_name": "Mountain View", "types": [ "locality", "political" ] }, { "long_name": "California", "short_name": "CA", "types": [ "administrative_area_level_1", "political" ] }, { "long_name": "United States", "short_name": "US", "types": [ "country", "political" ] }, { "long_name": "94043", "short_name": "94043", "types": [ "postal_code" ] } ], "geometry": { "location": { "lat": 37.4219720, "lng": -122.0841430 }, "location_type": "ROOFTOP", "viewport": { "southwest": { "lat": 37.4188244, "lng": -122.0872906 }, "northeast": { "lat": 37.4251196, "lng": -122.0809954 } } } } ] } 

Sometimes these fields do not matter, sometimes they do.

+7
source share
2 answers

Why are you formatted_address ?

There are component_address, you can go through them and look for those with

 "types": [ "administrative_area_level_1", "political" ]// the state "types" : [ "locality", "political" ]//the city 

Here is an example: http://jsfiddle.net/doktormolle/QWPCL/

+12
source

It seems to work for me so far ...

  readCityAndStateFromResult: (data) -> displayName = [] for component in data[0].address_components if component.types and component.types.length switch true when 'locality' in component.types displayName.push component.long_name when 'administrative_area_level_1' in component.types or 'administrative_area_level_2' in component.types displayName.push component.short_name return displayName.join ', ' if displayName.length return null 
0
source

All Articles