使用Google Places获取郊区的邮政编码

Get postcode for suburb using Google Places

本文关键字:邮政编码 郊区 获取 Google Places 使用      更新时间:2023-09-26

我正在使用Google Place Autocomplete按郊区名称检索邮政编码。我目前使用的代码工作得很好,确实可以检索到我需要的一切,然而,它只适用于一些郊区,而不给你邮政编码。

例如:

  • 澳大利亚维多利亚州拉弗顿(良好)
  • 澳大利亚维多利亚墨尔本机场(良好)
  • 澳大利亚维多利亚州墨尔本(无邮政编码)
  • 澳大利亚维多利亚州里士满(无邮政编码)
  • 等等

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

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

您需要在查询中更加具体,才能获得postal_code。

如果你需要邮政编码,你可以对getPlace()返回的lat/lng进行反向地理编码。谷歌通常会返回您查询的区域的逻辑中心(市中心/CBD等)。由于纬度/lng是一个精确的点,而不是一个区域,因此没有歧义,它将有一个邮政编码。

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

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

我也有同样的问题。我想使用谷歌位置自动完成功能来选择郊区,然后总是返回邮政编码。

下面的JSFiddle展示了如何做到这一点。放置自动填写地址表单这是通过地理代码反向查找扩展的股票代码。

其作用如下:

  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>

不仅需要询问地址组件,还需要询问几何结构,这样你就可以获得geo corinates

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

这是基于谷歌在这里给出的例子Place Autocomplete Address Form

您可以使用此

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