2014-11-21 5 views
2

У меня есть форма, которая собирала бы информацию о местоположении от пользователя. Я использую Google api для автозаполнения информации о местоположении. Он отлично работает. Все было заполнено красиво, но есть некоторые места (например, мое рабочее место, которое является зданием), Google не возвращает почтовый код для него.Google помещает api, не возвращая почтовый индекс для некоторых мест

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

Ниже мой код:

HTML

<div id="location-autocomplete" style="display: none;"> 
     <div class="half-formfield"> 
      @Html.LabelFor(x => x.Address) 
      @Html.TextBoxFor(x => x.Address, new { @class = "two-third-field", id = "street_number", required = "required" }) 
     </div> 
     <div> 
      @Html.LabelFor(x => x.UnitNumber, new { value = "Unit Number" }) 
      @Html.TextBoxFor(x => x.UnitNumber, new { @class = "one-third-field" }) 
     </div> 
     <div class="half-formfield"> 
      @Html.LabelFor(x => x.City) 
      @Html.TextBoxFor(x => x.City, new { @class = "half-field", required = "required", id = "locality" }) 
     </div> 
     <div> 
      @Html.LabelFor(x => x.ProvinceOrState) 
      @Html.TextBoxFor(x => x.ProvinceOrState, new { @class = "half-field", required = "required", id = "administrative_area_level_1" }) 
     </div> 
     <div class="half-formfield"> 
      @Html.LabelFor(x => x.ZipOrPostalCode) 
      @Html.TextBoxFor(x => x.ZipOrPostalCode, new { @class = "half-field", required = "required", id = "postal_code" }) 
     </div> 
     <div> 
      @Html.LabelFor(x => x.Country) 
      @Html.TextBoxFor(x => x.Country, new { @class = "half-field", required = "required", id = "country" }) 
     </div> 
     <input type="button" value="Clear Address" onclick="clearAddress()" id="clear-btn" class="service-form-btn"/> 

JS

var placeSearch, autocomplete; 
var componentForm = { 
    street_number: 'short_name', 
    route: 'long_name', 
    locality: 'long_name', 
    administrative_area_level_1: 'short_name', 
    country: 'long_name', 
    postal_code: 'short_name' 
}; 

function initialize() { 
    // Create the autocomplete object, restricting the search 
    // to geographical location types. 
    autocomplete = new google.maps.places.Autocomplete(
     /** @type {HTMLInputElement} */(document.getElementById('autocomplete')), 
     { types: ['geocode'] }); 
    // When the user selects an address from the dropdown, 
    // populate the address fields in the form. 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 
     fillInAddress(); 
     showAddressComponent(); 
     setTimeout(hideAddressSearch, 800); 
    }); 

} 

function fillInAddress() { 
    // Get the place details from the autocomplete object. 
    var place = autocomplete.getPlace(); 

    for (var component in componentForm) { 
     if (component != "route") { 
      document.getElementById(component).value = ''; 
      document.getElementById(component).disabled = false; 
     } 
    } 
    // Get each component of the address from the place details 
    // and fill the corresponding field on the form. 
    for (var i = 0; i < place.address_components.length; i++) { 
     var addressType = place.address_components[i].types[0]; 
     if (componentForm[addressType]) { 
      var val = place.address_components[i][componentForm[addressType]]; 
      console.log(val); 
      if (addressType != "route") document.getElementById(addressType).value = val; 
      else if (addressType == "route") document.getElementById("street_number").value = document.getElementById("street_number").value + " " + val; 
     } 
    } 
} 

// Bias the autocomplete object to the user's geographical location, 
// as supplied by the browser's 'navigator.geolocation' object. 
function geolocate() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function (position) { 
      var geolocation = new google.maps.LatLng(
       position.coords.latitude, position.coords.longitude); 
      autocomplete.setBounds(new google.maps.LatLngBounds(geolocation, 
       geolocation)); 
     }); 
    } 
} 

Скриншот

enter image description here

Интересно, если это ошибка или просто Google не знает почтовый индекс здания. В этом случае, есть ли какая-нибудь работа вокруг этого?

Заранее спасибо.

+4

Google, не находит почтовый индекс для этого адреса. Так что это не связано со стеной шаблона кода, который вы вставили. Это звучит как вопрос для обращения к Google. – bzlm

ответ

0

Почтовый индекс для этого адреса есть, но только часть (думаю, это FSA-код).

Функция не признает эту часть, потому что для этого адреса возвращаемых типов-массив:

["postal_code_prefix", "postal_code"] 

... но функция проверяет только первый элемент из типов массива.

можно исправить: собственный пример

function fillInAddress() { 
    // Get the place details from the autocomplete object. 
    var place = autocomplete.getPlace(); 

    for (var component in componentForm) { 
    document.getElementById(component).value = ''; 
    document.getElementById(component).disabled = false; 
    } 

    // Get each component of the address from the place details 
    // and fill the corresponding field on the form. 
    for (var i = 0; i < place.address_components.length; i++) { 
    var addressTypes = place.address_components[i].types,addressType,val; 
    for(var j=0;j<addressTypes.length;++j){ 

     addressType=addressTypes[j]; 

     if (componentForm[addressType]) { 
     val = place.address_components[i][componentForm[addressType]]; 
     document.getElementById(addressType).value = val; 
     break; 
     } 
    } 

    } 
} 
+0

Он все еще не работает. Какой код FSA вы получили от него? V7X? – TheBokiya

+0

Да, 'V7X', http://jsfiddle.net/doktormolle/9bLcu2cd/ –

+0

На самом деле это не правильный FSA-код для здания. Карты Google также выдают просто этот код, если вы просматриваете адрес на картах Google. – TheBokiya

0
var location = place.geometry.location; 
var lat = location.lat(); 
var lng = location.lng(); 


var latlng = {lat: lat, lng: lng}; 
      geocoder.geocode({'location': latlng}, function(results, status) { 
         if (status == google.maps.GeocoderStatus.OK) { 

          if (results[0]) { 

          for (var i = 0; i < results[0].address_components.length; i++) { 
           var types = results[0].address_components[i].types; 

           for (var typeIdx = 0; typeIdx < types.length; typeIdx++) { 
            if (types[typeIdx] == 'postal_code') { 
             //console.log(results[0].address_components[i].long_name); 

             var pincode = results[0].address_components[i].short_name; 
             alert('pin'+pincode); 

            } 
           } 
          } 

          $('#pac-input2').val(results[0].formatted_address); 
          infowindow.setContent(results[0].formatted_address); 
          //infowindow.open(map, marker); 
          } 
         } 

      }); 
+0

Добро пожаловать в переполнение стека! Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. Ответы только на код без каких-либо других препятствий. – Ajean

Смежные вопросы