【问题标题】:Google Geocoding API Bug?谷歌地理编码 API 错误?
【发布时间】:2016-09-11 17:03:03
【问题描述】:

我在使用 Google Geocoding API 时遇到了一个奇怪的问题。我目前正在使用它来查找卢森堡地址的纬度和经度。我无意中发现,即使我在 API 请求中输入了错误的邮政编码和国家/地区,我仍然会返回正确的位置和格式化的地址。

例如

 https://maps.googleapis.com/maps/api/geocode/json?address=1+route+d%27Arlon%2C8399+Windhof%2CLuxembourg&key={Your-API-Key}&language=fr

这是正确的发现命中,正如预期的那样。不过,

 https://maps.googleapis.com/maps/api/geocode/json?address=1+route+d%27Arlon%2C83992+Windhof%2CGermany&key={Your-API-Key}&language=fr

也找到了命中,尽管返回了 partial_match = true。

无需滚动和阅读代码即可了解问题 - 即使您提供了错误的国家/地区、邮政编码等详细信息,API 也会返回“正确”地址。

这怎么可能不是我无法想象的错误。但是,最初,我只是假设如果发现partial_match 存在,我会通过要求用户检查提供的地址来检查此类问题。

但是,仅检查这一点会引发误报。取网址

https://maps.googleapis.com/maps/api/geocode/json?address=2+route+d%27Arlon%2C8552+Oberpallen%2CLuxembourg&key={Your-API-Key}&language=fr

返回 2 Route d'Arlon, 8552 Oberpallen, Luxembourg,据我所知,这与我提供的地址完全相同,但地理编码 API STILL 返回 partial_match。

很明显,partial_match 的意义远不止眼前所见。我当然可以开始对返回的结果进行更严格的检查,而不是简单地依赖partial_match。但是,我希望这里的某个人能够在这里阐明两个问题

  • 为什么我上面的第三个示例返回partial_match,而一切似乎都正常?
  • 当我故意提供错误的国家和邮政编码时,为什么 API 返回的不是错误状态?

【问题讨论】:

    标签: google-geocoding-api


    【解决方案1】:

    不知何故,我怀疑我的问题是否会在这里找到答案,因为我显然发现的错误与一个相当“晦涩”的全球位置有关。在此过程中,我学到了一些有价值的东西,我觉得我不妨在这里分享,而不仅仅是结束问题:

    事实是,在处理用户输入的多个国家市场的地址时,然后您会根据 Google 地理编码 API 检查这些地址,依赖用户的任何原始输入是非常冒险的。以任何方式可靠。根据您在世界的哪个位置,输入地址的方式有很多种

    house no, street, zip code, place, country 或 street house no,zip code place, country 或 street, house no, place, zip code, country 或

    .... .

    最佳做法是

    • 保护不同的地址组件 - 甚至将 house no + street 位作为与用户不同的字段
    • 在服务器上根据需要构建整个地址字符串 - 地理编码 API 能够处理诸如post code before place、post code after place、missing commas、too many commas 等细微差别。李>
    • 如果 API 返回 status = OK,请不要以任何方式依赖 formatted_address 或 partial_result 字段。相反,使用结果的address_components 部分以您选择的格式重建整个地址。
    • 对您发送到 API 的地址和您刚刚构建的地址执行不区分字符串的比较。
    • 只有在完美匹配的情况下才继续接受地址。

    请注意,address_components 中地址组件的顺序可能会有所不同,因此请特别查找 types[0] 条目设置为 street_number, route, locality, postal_code 和 country 的组件。最后,空格会破坏最好的方案,所以在比较任何东西之前,先做一个

    trim(preg_replace('/\s+/',' ', $str));
    

    以确保您已删除所有不需要的空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2011-08-28
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多