具有单元号/子预付款的Google地方自动填充建议不会出现在响应数组中

时间:2013-07-30 00:57:44

标签: google-maps-api-3 google-places-api

我正在使用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”

这个问题是断断续续的,它适用于某些单位地址,但对其他地址不起。任何建议都将受到高度赞赏!!

5 个答案:

答案 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放置详细信息(和地理编码)请求实际上会找到正确的子预付款结果:

https://maps.googleapis.com/maps/api/place/details/json?placeid=Eig5LzMyMSBQaXR0IFN0cmVldCwgU3lkbmV5IE5TVywgQXVzdHJhbGlh

   "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搜索预测的“描述”:

https://maps.googleapis.com/maps/api/geocode/json?&address=9%2F321%20Pitt%20St%2C%20Sydney%20NSW%202000%2C%20Australia

   "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 (地址可能没有第一个街道编号)。

如果没有街道编号,它也将不起作用,如果没有单位编号,其值将相同。