Подтвердить что ты не робот

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

Я пытаюсь отправить запрос, используя почтовый код, в мою БД всякий раз, когда меняет центр просмотра 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'];
  }
});
};

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

4b9b3361

Ответ 1

Хорошо, так что я понял. Решение немного уродливее, чем хотелось бы, и мне, вероятно, не нужен последний цикл 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

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

var address = results[0].address_components;
var zipcode = address[address.length - 1].long_name;

Ответ 3

Использование 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" var будет содержать почтовый (zip?) код IF и только если вы получите один из API Карт Google.

Иногда вы НЕ получаете "postal_code" в ответ на запрос.

Ответ 4

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

_.find(results[0].address_components, function (ac) { return ac.types[0] == 'postal_code' }).short_name

Ответ 5

Для циклов требуется всего два. Массив "результатов" обновляется после того, как мы обнаружили, что первым "типом" является "почтовый_код".

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

            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;

                    }

                }

            }

Ответ 6

Вы также можете использовать этот код, эта функция поможет получить почтовый индекс при нажатии кнопки или 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!!');
        }
    });
}

Ответ 7

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)
                        }
                    }

                }
            });

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

Ответ 8

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

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

Ответ 9

Одним словом, это много усилий. По крайней мере, с 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

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

Ответ 10

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

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

Ответ 11

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

  • Вы не можете быть уверены, в каком месте в массиве address_components хранится почтовый код. Иногда в address_components.length - 1 > pincode может не быть. Это верно в геокодировании "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;

Ответ 12

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

Ответ 13

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

var zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;

Ответ 14

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

Ответ 15

Кажется, что в настоящее время лучше получить его из остаточного 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 );
        });

Ответ 16

Ромейн М. - спасибо! Если вам просто нужно найти почтовый индекс в первом возвращенном результате от 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;
        }
    }
}

Ответ 17

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

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; }
}

Ответ 18

$.each(results[0].address_components,function(index,value){
    if(value.types[0] === "postal_code"){
        $('#postal_code').val(value.long_name);
    }
});