views:

52

answers:

1

I created a function to take location input, pass it to Google Maps Javascript API V2, and return a latitude/longitude/normalized address that I'll have to split into different fields in a database (i.e. city, state, postal). I'm requiring at least a level 5/post code accuracy for the input so that the returned data from Google will always have...

  • Country
  • City (Locality)
  • State (Administrative Area)
  • Postal
  • Lat/Long

Here's some info on the JSON object structure that Google returns. http://code.google.com/apis/maps/documentation/javascript/v2/services.html#Geocoding_Structured

Problem: For some instances, Placemark.AddressDetails will not include a postal code, while the summarized Placemark.address will include the postal code.

For example, the following input examples will return a postal code inside Placemark.address, but not Placemark.AddressDetails;

  • 10437 Innovation Drive, Milwaukee, WI 53226
  • MOMA
  • Empire State Building --> this actually returns the postal code inside of some weird "DependentLocality" under SubAdministrativeArea.Locality

Here's my troubleshooting code:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
<!-- You must insert your maps API script here. -->
<script language="javascript" type="text/javascript" src="http://www.json.org/json2.js"&gt;&lt;/script&gt;

<script type="text/javascript"> 
    $(document).ready(function()
    {
        var geocoder = new GClientGeocoder();

        $.geolocateAddress = function(address)
        {  
            geocoder.getLocations(address, function(response)
            {
                if (response != null && response.Placemark != undefined)
                {

                    var placemark = response.Placemark[0];
                    // Placemark has Post code or higher accuracy -> http://code.google.com/apis/maps/documentation/javascript/v2/reference.html#GGeoAddressAccuracy
                    if (placemark.AddressDetails.Accuracy >= 5)
                    {
                        alert(placemark.address);
                        try {
                            alert(placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber);
                        } catch (err) {
                            alert('What the deuce?  Why is there no postal code?... I bet you the placemark.address has the postal code.');
                            alert(JSON.stringify(placemark));
                        }
                    } else {
                        alert('Sorry, this requires at least a postal code input for accuracy')
                    }
                } else {
                    alert('Failed to geo locate address');
                }
            });
        };

        $("#location").blur(function(event)
        {
            var address = $("#location").val();
            $.geolocateAddress(address);
        });

    });
</script>

<form action="" method="get"> 
    <input title="Location" type="text" value="" id="location" /> 
</form>

Phew... Is there something I'm just not understanding about schema of Google Maps placemarks? Would I be able to solve this problem by upgrading to Google Maps Javascript API V3? (V2 JSON objects seems more intuitive IMO) http://code.google.com/apis/maps/documentation/javascript/services.html

I'm about to throw in the towel on this. Hopefully somebody can help!

+1  A: 

This has been a problem ever since the geocoding service existed.

For a bit of background, see the "bug report/feature request" I posted to the issue tracker in 2008:

http://code.google.com/p/gmaps-api-issues/issues/detail?id=606

In that thread, Pamela Fox and Thor Mitchell are Google employees who were part of the Maps team at the time.

A year and a half later, Google responded with some improvements:

https://groups.google.com/group/google-maps-api/browse_thread/thread/4d0ade19dadcda4f#

and things improved a lot, but geocoding is not an exact science.

In any case, you might be using an old version of the geocoder because I get a postal code with this request:

http://maps.google.com/maps/api/geocode/xml?sensor=false&amp;address=10437%20Innovation%20Drive,%20Milwaukee,%20WI

That's a direct http request, but the API V3 should be returning the same data.

Marcelo
Awesome. I'll try using V3 API, see if that solves my problem, and let you know the result. Thanks!
David Budiac
Just implemented. V3 is way more robust than V2... feels a bit weird to have to iterate through address_components to find the 'type' I want, should I need to isolate a postal code for example. Seems to work great though. Thanks!
David Budiac