Google 地理编码 API 错误?

Google Geocoding API Bug?

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

例如

 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

To understand the issue without having to scroll & read that code - the API returns the "right" address even when you supply wrong details for country, postcode etc.

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

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

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

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

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

我怀疑我的问题能否在这里找到答案,因为我发现的错误显然与 "obscure" 全局位置有关。一路上我学到了一些有价值的东西,我觉得我不妨在这里分享而不是仅仅关闭问题:

事实是,当处理用户输入的跨越多个国家市场的地址时,然后您根据 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 placepost code after placemissing commastoo many commas
  • 如果 API returns a status = OK 不以任何方式依赖 formatted_addresspartial_result 字段。相反,使用结果的 address_components 部分以您选择的格式重建整个地址。
  • 对您发送到 API 的地址与您刚刚构建的地址执行不区分字符串的比较。
  • 只有在获得完美匹配后才继续接受地址。

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

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

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