Получение почтового индекса с помощью Google Maps Javascript API V3 Обратный геокод - PullRequest
18 голосов
/ 17 марта 2011

Я пытаюсь отправить запрос, используя почтовый индекс, в мою БД, когда меняется центр просмотра googlemaps.Я знаю, что это можно сделать с помощью обратного геокодирования, например:

google.maps.event.addListener(map, 'center_changed', function(){
newCenter();
});
...
function newCenter(){
var newc = map.getCenter();
geocoder.geocode({'latLng': newc}, function(results, status){
if (status == google.maps.GeocoderStatus.OK) {
  var newzip = results[0].address_components['postal_code'];
  }
});
};

Конечно, этот код на самом деле не работает.Поэтому мне было интересно, как мне нужно изменить это, чтобы извлечь почтовый код из массива результатов.Спасибо

Ответы [ 19 ]

0 голосов
/ 11 февраля 2016

Использование Jquery

  • Вы не можете быть уверены, в каком месте массива address_components хранится почтовый индекс.Иногда в address_components.length - 1> пин-код может отсутствовать.Это верно в геокодировании "Address to latlng".
  • Вы можете быть уверены, что почтовый код будет содержать строку "postal_code".Так что лучший способ это проверить.
   var postalObject = $.grep(results[0].address_components, function(n, i) {
                                    if (n.types[0] == "postal_code") {
                                        return n;
                                    } else {
                                        return null;
                                    }
                                });

                                $scope.query.Pincode = postalObject[0].long_name;
0 голосов
/ 29 сентября 2017

Ромейн М. - спасибо!Если вам просто нужно найти почтовый индекс в первом возвращенном результате от Google, вы можете сделать всего 2 цикла:

for(var j=0;j < results[0].address_components.length; j++){
    for(var k=0; k < results[0].address_components[j].types.length; k++){
        if(results[0].address_components[j].types[k] == "postal_code"){
            zipcode = results[0].address_components[j].long_name;
        }
    }
}
0 голосов
/ 27 сентября 2017

Кажется, что в настоящее время лучше получить его из успокоительного API, просто попробуйте:

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_KEY_HERE

Использование вызова AJAX GET прекрасно работает!как:

var your_api_key = "***";
var f_center_lat = 40.714224;
var f_center_lon = -73.961452;

$.ajax({ url: "https://maps.googleapis.com/maps/api/geocode/json?latlng="+f_center_lat+","+f_center_lon+"&key="+your_api_key,
            method: "GET"
        })
        .done(function( res ) { if (debug) console.log("Ajax result:"); console.log(res);
            var zipCode = null;
            var addressComponent = res.results[0].address_components;
            for (var x = 0 ; x < addressComponent.length; x++) {
                var chk = addressComponent[x];
                if (chk.types[0] == 'postal_code') {
                    zipCode = chk.long_name;
                }
            }
            if (zipCode) {
                //alert(zipCode);
                $(current_map_form + " #postalcode").val(zipCode);
            }
            else {
                //alert('No result found!!');
                if (debug) console.log("Zip/postal code not found for this map location.")
            }
        })
        .fail(function( jqXHR, textStatus ) {
            console.log( "Request failed (get postal code via geocoder rest api). Msg: " + textStatus );
        });
0 голосов
/ 19 февраля 2015

Этот простой код работает для меня

for (var i = 0; i < address.length; i++) {
        alert(address[i].types);
        if (address[i].types == "postal_code")
            $('#postalCode').val(address[i].long_name);
        if (address[i].types == "")
            $('#country').val(address[i].short_name);
    }
0 голосов
/ 02 сентября 2016
//autocomplete is the text box where u will get the suggestions for an address.

autocomplete.addListener('place_changed', function () {
//Place will get the selected place geocode and returns with the address              
//and marker information.
        var place = autocomplete.getPlace();
//To select just the zip code of complete address from marker, below loop //will help to find. Instead of y.long_name you can also use y.short_name. 
        var zipCode = null;
        for (var x = 0 ; x < place.address_components.length; x++) {
            var y = place.address_components[x];
            if (y.types[0] == 'postal_code') {
                zipCode = y.long_name;
            }
        }
    });
0 голосов
/ 31 июля 2016

Используя JSONPath , это легко сделать с помощью одной строки кода:

var zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;
0 голосов
/ 17 марта 2011

Одним словом, это много усилий. По крайней мере, с API v2 я мог бы получить эти детали таким образом:

var place = response.Placemark[0];
var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

myAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName

myCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName

myState = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName

myZipCode = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber

Должен быть более элегантный способ извлечения отдельных address_components без прохождения цикла джиу-джитсу, через который вы только что прошли.

0 голосов
/ 03 апреля 2019

Я думаю, что вместо проверки индекса лучше проверять ключ типа адреса внутри компонента.Я решил эту проблему с помощью переключателя.

      var address = '';
      var pin = '';
      var country = '';
      var state = '';
      var city = '';
      var streetNumber = '';
      var route ='';
      var place = autocomplete.getPlace(); 
      for (var i = 0; i < place.address_components.length; i++) {
        var component = place.address_components[i];
        var addressType = component.types[0];

        switch (addressType) {
            case 'street_number':
                streetNumber = component.long_name;
                break;
            case 'route':
                route = component.short_name;
                break;
            case 'locality':
                city = component.long_name;
                break;
            case 'administrative_area_level_1':
                state = component.long_name;
                break;
            case 'postal_code':
                pin = component.long_name;
                break;
            case 'country':
                country = component.long_name;
                break;
        }
       }
0 голосов
/ 02 марта 2016
 return $http.get('//maps.googleapis.com/maps/api/geocode/json', {
            params: {
                address: val,
                sensor: false
            }
        }).then(function (response) {
           var model= response.data.results.map(function (item) {
               // return item.address_components[0].short_name;
               var short_name;
             var st=  $.each(item.address_components, function (value, key) {
                    if (key.types[0] == "postal_code") {
                        short_name= key.short_name;
                    }
                });
             return short_name;

            });
                return model;
        });
...