views:

391

answers:

1

I am using google maps API geocoding service to get location's country name, postal code etc.

JSON response:

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

Here is the problem - sometimes (despite checking for undefined) I get an error that country is undefined.

var country = document.getElementById("id_country");
if(place.AddressDetails.Country.CountryNameCode != undefined){
    country.value = place.AddressDetails.Country.CountryNameCode;
}

Also how can I access PostalCodeNumber?

place.AddressDetails.AdministrativeArea.SubAdministrativeArea.PostalCode.PostalCodeNumber
A: 

Most of the time when I try code such as:

place.AddressDetails.AdministrativeArea. //etc.

I dont get anything and I have no idea how to explain it, but my team mate wrote a script to manually parse it and it works fine for us (code is alot though). You can try it and edit it for getting the rest of missing fields (your postal code):

//[MARKEL]: Returns object type: obj.ad1, obj.ad2, obj.ad3, obj.state, obj.country
function ResolveGeoCode(point, returnCall) {
    //[MARKEL]: initialize geocoder
    geocoder = new GClientGeocoder();

    geocoder.getLocations(point, function getAddress(response) {
        //[MARKEL]: Create a object to call proxy location Set location variable to be global 
        //because it will be assigned in call-back function
        var Location;

        if (!response || response.Status.code != 200) {
            //MARKEL: [TODO] => Set code here to alert that the address id invalid
        }
        else {
            place = response.Placemark[0];
            place = response.Placemark[0];
            point = new GLatLng(place.Point.coordinates[1],
                        place.Point.coordinates[0]);

            var len = place.address.toString().split(",").length;
            var array = place.address.toString().split(",");
            //alert(place.address);
            //alert(len);
            if (len >= 3) {
                if (array[0].length > 2) {
                    Location = {
                        Street: array[0],
                        State: array[1],
                        Country: array[2]
                    };
                }
                else {
                    Location = {
                        Street: array[1],
                        State: "",
                        Country: array[2]
                    };
                }
            }
            else if (len == 2) {
                Location = {
                    Street: "",
                    State: array[0],
                    Country: array[1]
                };

            }

            else if (len == 1) {
                Location = {
                    Sreet: "",
                    State: "",
                    Country: array[0]
                };
            }
            else {
                //[MARKEL]: [TODO] => Place code here to indicate that the address is not valid.
            }

        }
        returnCall(Location);
        return Location;
    });

}
Shawn Mclean