【问题标题】:Get postcode for suburb using Google Places使用 Google 地方信息获取郊区的邮政编码
【发布时间】:2014-10-25 23:51:45
【问题描述】:

我正在使用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();

【问题讨论】:

  • 没有人知道为什么 Google API 会显示某些郊区的郊区邮政编码,而不显示其他郊区的邮编?

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


【解决方案1】:

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

您需要在查询中更加具体才能获得邮政编码。

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

Google 做出这种假设是不合适的,因为它在所有情况下都不正确,但如果这是您的应用需要的行为,那么您可以“故意”做出该决定。

【讨论】:

  • 墨尔本的固定邮政编码为3000,里士满的固定邮政编码为3121。所有郊区都有一个固定的邮政编码,一些郊区共享相同的邮政编码,但这些实例通常是东/西/北/南地区。
  • 墨尔本郊区有 2 个邮政编码(3000 和 3004)。邮政编码 3121 覆盖里士满、伯恩利和克雷蒙。邮政编码和郊区不是一回事。
  • Auspost 邮政编码查找是邮政编码的权威参考。在Melbourne 的情况下,它们同时显示 3000 和 3004。但 3001 甚至 8001 是邮政信箱的有效墨尔本邮政编码。值得记住的是,Google 地方信息是关于位置,而不是邮政地址。至少在澳大利亚,邮政编码是用于邮件递送目的,不是位置定义。这里存在概念上的不匹配。
【解决方案2】:

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

我遇到了完全相同的问题。我想使用 Google Places 自动完成功能来选择郊区,然后总是返回邮政编码。

下面的 JSFiddle 展示了如何做到这一点。 Place Autocomplete Address Form 这是使用地理编码反向查找扩展的股票代码。

它的作用如下:

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

HTML 更改 为 lat long 添加额外的字段

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

      }
    }

这是基于谷歌在此处Place Autocomplete Address Form提供的示例

【讨论】:

    【解决方案3】:

    你可以用这个

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

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 2023-01-29
      • 2020-04-21
      • 2016-03-04
      • 2011-11-28
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多