Получение почтового индекса с помощью 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 ]

18 голосов
/ 18 марта 2011

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

var address = results[0].address_components;
var zipcode = address[address.length - 1].long_name;
11 голосов
/ 06 апреля 2012

Вы можете сделать это довольно легко используя библиотеку underscore.js: http://documentcloud.github.com/underscore/#find

_.find(results[0].address_components, function (ac) { return ac.types[0] == 'postal_code' }).short_name
11 голосов
/ 09 ноября 2011

Используете JQuery?

var searchAddressComponents = results[0].address_components,
    searchPostalCode="";

$.each(searchAddressComponents, function(){
    if(this.types[0]=="postal_code"){
        searchPostalCode=this.short_name;
    }
});

short_name или long_name будут работать выше
переменная "searchPostalCode" будет содержать почтовый индекс и только если вы получаете его из API Карт Google.

Иногда вы НЕ получаете «почтовый индекс» в ответ на ваш запрос.

10 голосов
/ 17 марта 2011

Хорошо, я понял. Решение немного уродливее, чем хотелось бы, и мне, вероятно, не нужен последний цикл for, но вот код для всех, кому нужно извлечь дерьмо из address_components []. Это внутри функции обратного вызова геокодера

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

Вы также можете использовать этот код, эта функция поможет получить zip при нажатии кнопки или onblur или keyup или keydown.

Просто передайте адрес этой функции.

используйте google apiс удаленным ключом и опцией сенсора, поскольку теперь это не требуется.

function callZipAPI(addSearchZip)
{    
    var geocoder = new google.maps.Geocoder();
    var zipCode = null;

    geocoder.geocode({ 'address': addSearchZip }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {

            //var latitude = results[0].geometry.location.lat();
            //var longitude = results[0].geometry.location.lng();

            var addressComponent = 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);
            }
            else {
                alert('No result found!!');
            }
        } else {            
            alert('Enter proper address!!');
        }
    });
}
2 голосов
/ 23 июня 2011

Это займет всего два цикла. Массив «results» обновляется, как только мы обнаружили, что первый «тип» - это «postal_code».

Затем он обновляет исходный массив вновь найденным массивом и снова зацикливается.

            var i, j,
            result, types;

            // Loop through the Geocoder result set. Note that the results
            // array will change as this loop can self iterate.
            for (i = 0; i < results.length; i++) {

                result = results[i];

                types = result.types;

                for (j = 0; j < types.length; j++) {

                    if (types[j] === 'postal_code') {

                        // If we haven't found the "long_name" property,
                        // then we need to take this object and iterate through
                        // it again by setting it to our master loops array and 
                        // setting the index to -1
                        if (result.long_name === undefined) {
                            results = result.address_components;
                            i = -1;
                        }
                        // We've found it!
                        else {
                            postcode = result.long_name;
                        }

                        break;

                    }

                }

            }
2 голосов
/ 14 декабря 2018
$.each(results[0].address_components,function(index,value){
    if(value.types[0] === "postal_code"){
        $('#postal_code').val(value.long_name);
    }
});
1 голос
/ 27 декабря 2011
places.getDetails( request_details, function(results_details, status){

                // Check if the Service is OK
                if (status == google.maps.places.PlacesServiceStatus.OK) {                  

                    places_postal           = results_details.address_components
                    places_phone            = results_details.formatted_phone_number
                    places_phone_int        = results_details.international_phone_number
                    places_format_address   = results_details.formatted_address
                    places_google_url       = results_details.url
                    places_website          = results_details.website
                    places_rating           = results_details.rating

                    for (var i = 0; i < places_postal.length; i++ ) {
                        if (places_postal[i].types == "postal_code"){
                            console.log(places_postal[i].long_name)
                        }
                    }

                }
            });

Мне кажется, это очень хорошо работает, это с новым Google Maps API V3. Если это кому-нибудь поможет, напишите комментарий, я пишу сценарий, пока мы говорим ... так что он может измениться.

1 голос
/ 26 октября 2017

Я использую этот код для получения «Почтовый индекс» и «Местность», но вы можете использовать его для получения любого другого поля, просто меняя значение типа:

JAVASCRIPT

var address = results[0].address_components;
var zipcode = '';
var locality = '';

for (var i = 0; i < address.length; i++) {
     if (address[i].types.includes("postal_code")){ zipcode = address[i].short_name; }    
     if (address[i].types.includes("locality")){ locality = address[i].short_name; }
}
1 голос
/ 03 августа 2017

В PHP я использую этот код. Почти в любых условиях это работает.

$zip = $data["results"][3]["address_components"];
$zip = $index[0]["short_name"];
...