我正在使用Google Places API来使用javascript自动填写地址
当我在输入框中键入单元号和地址的街道号时,它会在建议下拉列表中显示结果,但是当我选择地址时,操作'place_changed'事件的侦听器没有任何带有address_component的地址输入'subpremise'即使是formatted_address属性也没有单位编号。虽然它确实包含来自'街道号码','城市','国家'等的其他详细信息
例如:如果我输入“1403/648 Bourke Street”,并且国家限制为澳大利亚。它显示我在下拉列表中的5个结果,第一个作为“1403/648 Bourke street,Melbourne,Australia”,但是当我选择此选项时,我在place_change事件监听器中获得的是“648 Bourke street,Melbourne,Australia”
这个问题是断断续续的,它适用于某些单位地址,但对其他地址不起。任何建议都将受到高度赞赏!!
答案 0 :(得分:7)
Places Autocomplete API不支持“subpremise”结果。这是在https://issuetracker.google.com/35830389
的公共问题跟踪器中报告并回答的澳大利亚的subpremise结果地址看起来与street_address / premise结果“足够接近”(它们主要以数字开头)。这当前导致Place Autocomplete返回可能看起来像subpremise结果的内容,但是请注意该类型仍然是“route”:
http://maps.googleapis.com/maps/api/place/autocomplete/json?input=9/321%20Pitt%20Street,%20Sydney
description: "9/321 Pitt Street, Sydney NSW, Australia",
place_id: "Eig5LzMyMSBQaXR0IFN0cmVldCwgU3lkbmV5IE5TVywgQXVzdHJhbGlh",
types: ["route","geocode",],
使用此place_id放置详细信息(和地理编码)请求实际上会找到正确的子预付款结果:
"result" : {
"address_components" : [
{
"long_name" : "9",
"short_name" : "9",
"types" : [ "subpremise" ]
},
{
"long_name" : "321",
"short_name" : "321",
"types" : [ "street_number" ]
},
...
"formatted_address" : "9/321 Pitt St, Sydney NSW 2000, Australia",
"types" : [ "subpremise" ],
但是,这不能保证适用于所有subpremise查询,或者甚至长期查询这个特定查询。
更可靠的方法是使用地理编码API搜索预测的“描述”:
"results" : [
{
"address_components" : [
{
"long_name" : "9",
"short_name" : "9",
"types" : [ "subpremise" ]
},
{
"long_name" : "321",
"short_name" : "321",
"types" : [ "street_number" ]
},
...
],
"formatted_address" : "9/321 Pitt St, Sydney NSW 2000, Australia",
"place_id" : "Eik5LzMyMSBQaXR0IFN0LCBTeWRuZXkgTlNXIDIwMDAsIEF1c3RyYWxpYSIdGhsKFgoUChIJkyPU0z2uEmsR-pmiK6UvZUASATk",
"types" : [ "subpremise" ]
答案 1 :(得分:5)
在我看来,谷歌正在验证该地址是真实的(当他们上次更新他们的地方数据库时至少是真实的 - 我想政府记录)。问题是,在创建新的“subpremise”地址的过程中,细分一直在发生,并且对这些地址的查找似乎更频繁。奇怪的是,他们允许“无效”地址作为自动完成建议,但随后限制结果。
查看下面的悉尼地址将返回“subpremise”和“street_number”
“9/321 Pitt Street,Sydney,New South Wales,Australia”
以下墨尔本地址仅与“路线”
一样准确“2/321 Pitt Street,Brunswick,Victoria,Australia”
最大的问题是结果不会在回复的任何地方返回单位或街道号码。
我已经将以下JS一起入侵,将用户输入的地址与返回的结果进行比较。如果缺少“数字”,则添加它们。您可以根据需要自定义代码。
if (addressType == 'route') {
var regex = RegExp('^(.*)'+GPLACESSTREET.split(' ',1)[0]), // get all the user entered values before a match with the first word from the Google result
result = regex.exec(INPUTFEILD.value);
if ( Array.isArray(result) ) {
FULLSTREETADDRESS = result[1]+''+GPLACESSTREET; // add the street name to the user-entered unit & street number
}
}
答案 2 :(得分:0)
@ MountainAsh的代码稍作修改:
if (addressType == 'route') {
var regex = RegExp('^(.*?)'+GPLACESSTREET.split(' ',1)[0]), // get all the user entered values before a match with the first word from the Google result
result = regex.exec(INPUTFEILD.value);
if ( Array.isArray(result) ) {
FULLSTREETADDRESS = result[1]+''+GPLACESSTREET; // add the street name to the user-entered unit & street number
}
}
请注意 RegExp 中的其他?,这使得搜索非贪婪地涵盖街道名称以相同的郊区名称开头的情况(例如123 Clayton Rd,克莱顿)。
答案 3 :(得分:0)
Google不支持它,但是您不能阻止客户这样做!
这是一个受@MountainAsh和@Randell的代码启发的完整功能:
/* Add the unit number (+ fix the street number) if required.
*
* Idea from https://stackoverflow.com/questions/17936689/google-places-autocomplete-suggestions-with-unit-no-subpremise-is-not-coming-in
*
* Test cases:
* 9/321 Pitt Street, Sydney, New South Wales, Australia <-- Google throws away the unit number
* 2/321 Pitt Street, Brunswick, Victoria, Australia <-- Google says street number = 2
* 1b/123 Clayton Road, Clayton, Victoria, Australia <-- Google says street number = 1
*/
function autofillUnitNumber(txtAutocomplete, txtUnitNumber, txtStreetNumber, txtStreetName) {
var regex = RegExp("^(.*?)\/(.*?) " + txtStreetName.value); // get all the user entered values before a match with the street name; group #1 = unit number, group #2 = street number
var results = regex.exec(txtAutocomplete.value);
if (Array.isArray(results)) { // it was in unit number/street number format
var unitNumber = results[1]; // group #1
var streetNumber = results[2]; // group #2
txtUnitNumber.value = unitNumber;
txtStreetNumber.value = streetNumber;
}
}
使用Google自动填充功能自动填充其他表单字段后即可调用它,例如:
autofillUnitNumber(
document.getElementById("txtAutocomplete"),
document.getElementById("txtUnitNumber"),
document.getElementById("txtStreetNumber"),
document.getElementById("txtStreetName"));
答案 4 :(得分:0)
由于我只是想收集单元号并将其添加到街道号之前,所以我的解决方法是:
const place = this.AutoComplete.getPlace();
if (isNullOrUndefined(place)) return;
const parts = place.address_components;
const getAddressPart = part => {
const found = parts.find(p => p.types.indexOf(part) > -1);
if (found) {
return found.long_name;
}
return null;
};
const address = this.Input.current.value; // input[text] value
let streetNumber = getAddressPart("street_number");
// Regex Match associated
if (streetNumber) {
const regex = RegExp(`[^\\s,]*(${streetNumber})[^\\s,]*`);
const foundStreetNumber = regex.exec(address);
streetNumber = foundStreetNumber[0];
}
const Address = {
FullAddress: address,
StreetNumber: streetNumber,
Street: getAddressPart("route"),
Suburb: getAddressPart("sublocality"),
City: getAddressPart("locality"),
Country: getAddressPart("country"),
PostCode: getAddressPart("postal_code")
};
这将改善Google Places API中的街道号码数据,以适应以下地址:
新西兰奥克兰0626号伯肯黑德Mokoia Rd 4/33号
斯洛文尼亚Kidričevo的Proletarska ulica 3/25 (地址可能没有第一个街道编号)。
如果没有街道编号,它也将不起作用,如果没有单位编号,其值将相同。