Сервис геокодирования карт Google - PullRequest
1 голос
/ 28 февраля 2010

Я использую сервис геокодирования API карт Google для получения названия страны, почтового индекса и т. Д.

JSON-ответ:

{
  "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]
      }
    }
  ]
}

Вот проблема - иногда (несмотря на проверку неопределенности) я получаю сообщение об ошибке, что страна неопределена.

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

Также, как я могу получить доступ к PostalCodeNumber?

place.AddressDetails.AdministrativeArea.SubAdministrativeArea.PostalCode.PostalCodeNumber

1 Ответ

1 голос
/ 28 февраля 2010

Большую часть времени, когда я пробую код, такой как:

place.AddressDetails.AdministrativeArea. //etc.

Я ничего не понимаю и не знаю, как это объяснить, но мой напарник написал скрипт для его ручного разбора, и он отлично работает для нас (хотя кода много). Вы можете попробовать и отредактировать его, чтобы получить оставшиеся пропущенные поля (ваш почтовый индекс):

//[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;
    });

}
...