Google Geocoding API Bug?

时间:2016-08-31 14:53:35

标签: google-geocoding-api

我遇到了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会返回除错误状态以外的任何内容?

1 个答案:

答案 0 :(得分:0)

不知何故,我怀疑我的问题是否会在这里找到答案,因为我明显发现的错误与一个相当"模糊的"全球位置。在此过程中,我学到了一些有价值的东西,我觉得我可以在这里分享,而不仅仅是关闭问题:

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

API (col A) | Count (col B) 42227 | = if(a2=a1,b1+1,1) = 1 42227 | = if(a3=a2,b2+1,1) = 2 42229 | = if(a4=a3,b3+1,1) = 1 42310 | = if(a5=a4,b4+1,1) = 1 house no, street, zip code, place, countrystreet house no,zip code place, country

....

最佳做法是

  • 保护不同的地址组件 - 甚至street, house no, place, zip code, country位作为用户的不同字段
  • 在服务器上根据需要构建整个地址字符串 - 地理编码API能够处理诸如house no + streetpost code before placepost code after place,{missing commastoo many commas等细微差别。 {1}}等。
  • 如果API返回status = OK,请不要以任何方式依赖formatted_addresspartial_result字段。而是使用结果的address_components部分以您选择的格式重建整个地址。
  • 对您发送到API的地址和刚刚构建的地址执行字符串不敏感的比较。
  • 如果您获得完美匹配,则只接受该地址。

请注意,address_components中地址组件的顺序可能会有所不同,因此请特别注意类型[0]条目设置为street_number, route, locality, postal_codecountry的组件。最后,空间可以破坏最好的方案,所以在比较任何事情之前

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

确保您摆脱了所有不需要的空间。