Google maps api 3 Google将自动完成建议放入响应数组中,但响应数组中没有单元号/子许可证

Google maps api 3 Google将自动完成建议放入响应数组中,但响应数组中没有单元号/子许可证,google-maps-api-3,google-places-api,Google Maps Api 3,Google Places Api,我正在使用GooglePlacesAPI使用javascript自动完成地址 当我在输入框中键入地址的单元号和街道号时,它会在建议下拉列表中显示结果,但当我选择地址时,用于操作“place\u changed”事件的侦听器没有任何带有“subpremise”类型的地址组件,即使格式化的\u address属性中也没有单元号。尽管是否包含来自“街道编号”、“城市”、“国家”等的其他详细信息 例如:如果我键入“1403/648 Bourke Street”,并带有澳大利亚的国家/地区限制。它在下拉列

我正在使用GooglePlacesAPI使用javascript自动完成地址

当我在输入框中键入地址的单元号和街道号时,它会在建议下拉列表中显示结果,但当我选择地址时,用于操作“place\u changed”事件的侦听器没有任何带有“subpremise”类型的地址组件,即使格式化的\u address属性中也没有单元号。尽管是否包含来自“街道编号”、“城市”、“国家”等的其他详细信息

例如:如果我键入“1403/648 Bourke Street”,并带有澳大利亚的国家/地区限制。它在下拉列表中显示了5个结果,第一个结果是“澳大利亚墨尔本伯克街1403/648号”,但当我选择此选项时,我在place_change event listener中得到的所有结果都是“澳大利亚墨尔本伯克街648号”


虽然这个问题是间歇性的,但它对某些单位地址有效,但对其他单位地址无效。任何建议都将不胜感激

在我看来,谷歌似乎在验证地址是否真实(至少在他们上次更新位置数据库时是真实的——我猜是政府记录)。问题是,在创建新的“子许可证”地址时,总是会发生细分,而查看这些地址的频率似乎更高。奇怪的是,他们允许一个“无效”的地址作为自动完成建议,但却限制了结果

在下面的悉尼地址上查找将返回“subpremise”和“street_number”

澳大利亚新南威尔士州悉尼皮特街9/321号

下面的墨尔本地址只与“路线”一样准确

澳大利亚维多利亚州不伦瑞克市皮特街321号2号

最大的问题是,结果不会在回复中的任何地方返回单位或街道号码

我将下面的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
    }
}

对@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号)。

Places Autocomplete API的设计不支持“subpremise”结果。一段时间前,在公共问题跟踪网站

澳大利亚次级许可证结果的地址看起来与street_地址/前提结果的地址“足够接近”(大多以数字开头)。这目前会导致就地自动完成返回类似于子预处理结果的结果,但是请注意,类型仍然是“路由”:

使用此Place_id的Place Details(和地理编码)请求实际上会找到正确的子许可证结果:

但是,这并不能保证对所有子预许可查询都有效,甚至从长远来看,也不能保证对这个特定查询有效

更可靠的方法是使用地理编码API搜索预测的“描述”:


谷歌不支持它,但你不能阻止客户这么做

以下是受@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;
    }
}

因为我只想收集单元号并将其预先添加到街道号,所以我的解决方案是:

constplace=this.AutoComplete.getPlace();
if(isNullOrUndefined(place))返回;
const parts=place.address\u组件;
const getAddressPart=部分=>{
const found=parts.find(p=>p.types.indexOf(part)>-1);
如果(找到){
返回find.long\u名称;
}
返回null;
};
常量地址=this.Input.current.value;//输入[文本]值
let streetNumber=getAddressPart(“街道号”);
//正则匹配关联
如果(街道号码){
常量regex=RegExp(`[^\\s,]*(${streetNumber})[^\\s,]*`);
const foundStreetNumber=regex.exec(地址);
streetNumber=foundStreetNumber[0];
}
常量地址={
完整地址:地址,
街道号:街道号,
街道:getAddressPart(“路线”),
郊区:getAddressPart(“子本地”),
城市:getAddressPart(“地点”),
国家:getAddressPart(“国家”),
邮政编码:getAddressPart(“邮政编码”)
};
这将改进Google Places API中的街道编号数据,以满足以下地址:

4/33新西兰奥克兰伯肯黑德莫科亚路0626号

斯洛文尼亚Kidričevo无产阶级乌利卡3/25号(地址可能没有第一个街道号码)


如果没有街道号,它也不会起任何作用,如果没有单元号,它的值将是相同的。

我不知道这种行为的原因,你可以通过传递你收到的lat lon来使用google places,也许你从那里得到的对象将包含更多的数据。你曾经找到过这个问题的答案吗?我也有同样的问题。还有澳大利亚单位,不确定这是否是该国特有的。ThanksPlaces Autocomplete API的设计允许用户根据底图数据键入他们想要的任何内容并返回与之最匹配的地址。由于各种原因,次级许可级别的详细信息并不总是可用的,因此很少返回。您从用户输入中恢复“数字”的解决方案可能是最实用的选择。
   "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" ],
   "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" ]
/* 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;
    }
}
autofillUnitNumber(
    document.getElementById("txtAutocomplete"),
    document.getElementById("txtUnitNumber"),
    document.getElementById("txtStreetNumber"),
    document.getElementById("txtStreetName"));