我使用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();
答案 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 这是通过地理编码反向查找扩展的股票代码。
它遵循以下要求:
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);
}
}
});