使用Google商家信息获取郊区的邮政编码

时间:2014-10-25 23:51:46

标签: javascript jquery google-places-api google-geocoding-api

我使用Google Place Autocomplete通过郊区名称检索邮政编码。我目前正在使用的代码很棒,并且可以检索我需要的所有内容,但是,它只适用于某些郊区,而不会为其他人提供邮政编码。

例如:

  • Laverton,澳大利亚维多利亚(好)
  • 澳大利亚维多利亚州墨尔本机场(好)
  • 澳大利亚维多利亚州墨尔本(无邮政编码)
  • Richmond,Victoria,Australia(无邮政编码)

HTML

<input id="supplier-area" type="text">

JS

var autocomplete;

function initialize() {
    autocomplete = new google.maps.places.Autocomplete(
        (document.getElementById('supplier-area')),
        {
            types: ['(cities)'],
            componentRestrictions: {
                country: 'au'
            }
        }
    );

    google.maps.event.addListener(autocomplete, 'place_changed', function() {
        var place = autocomplete.getPlace();
        alert(JSON.stringify(place));
    });
}

initialize();

3 个答案:

答案 0 :(得分:3)

墨尔本是一个城市,它涵盖了许多邮政编码。同样,里士满是一个跨越多个邮政编码的郊区(西北地区为3067,其他地方为3121)。

您需要在查询中更具体地获取postal_code。

如果您需要邮政编码,可以在getPlace()返回的lat / lng上执行reverse geo-code。 Google通常会返回您查询区域的逻辑中心(市中心/ CBD等)。由于lat / lng是一个精确的点,而不是一个区域,因此没有歧义,它将有一个邮政编码。

谷歌做这个假设是不合适的,因为它在所有情况下都不正确,但如果这是你的应用需要的行为,那么你可以做出那个决定&#34;故意&#34;。

答案 1 :(得分:1)

D会说什么是正确的。悉尼,墨尔本等地区不会返回邮政编码,因此您需要进行反向地理编码查询。

我有完全相同的问题。我想使用Google地方信息自动填充功能来选择郊区,然后始终返回邮政编码。

以下JSFiddle显示了如何执行此操作。 Place Autocomplete Address Form 这是通过地理编码反向查找扩展的股票代码。

它遵循以下要求:

  1. 获取自动填充结果
  2. 如果没有邮政编码
  3. 获取结果的地理坐标
  4. 调用geocoder.geocode以获取返回坐标处的地址
  5. 询问地址响应,并从这些地理坐标返回的地址中读取城市和邮政编码值

HTML更改 为纬度添加额外的字段

    <tr>
        <td class="label">Lat</td>
        <td class="wideField" colspan="3"><input class="field" id="lat" disabled="true"/></td>
    </tr>
    <tr>
        <td class="label">Long</td>
        <td class="wideField" colspan="3"><input class="field" id="lng" disabled="true"/></td>
    </tr>

不仅需要地址组件,而且还需要几何图形,以便获取地理坐标

autocomplete.setFields(['address_component', 'geometry']);

功能

    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 then fill-in 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]];
          document.getElementById(addressType).value = val;
        }    
      }
      // geometry
      var geometry = place.geometry;
      var lat = geometry.location.lat();
      var lng = geometry.location.lng();

      document.getElementById("lat").value = lat;
      document.getElementById("lng").value = lng;

      var postcode = document.getElementById("postal_code");
      if(postcode.value == ""){
        //alert("no postcode use lat/lng to lookup place")
        var geocoder = new google.maps.Geocoder();

        var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)};

         geocoder.geocode({'location': latlng}, function(results, status) {
              if (status === 'OK') {
                if (results[0]) {
                  var faddress = results[0].formatted_address;
                  var addressParts = results[0].address_components;

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

                    if (addressType == "postal_code" || addressType == "locality") {
                      var val = addressParts[i][componentForm[addressType]];
                      document.getElementById(addressType).value = val;
                    }    
                  }

                  //alert(faddress);
                } else {
                  window.alert('No results found');
                }
              } else {
                window.alert('Geocoder failed due to: ' + status);
              }
        });

      }
    }

这是基于Google在此处Place Autocomplete Address Form

给出的示例

答案 2 :(得分:0)

你可以用这个

google.maps.event.addListener(autocomplete, 'place_changed', function () {

  var place = autocomplete.getPlace();

  for (var i = 0; i < place.address_components.length; i++) {
    var addressType = place.address_components[i].types[0];
    if (addressType == "postal_code") {
      var postalcode = place.address_components[i].long_name;
      $("#Address_Postcode").val(postalcode);
    }
  }
});