2016-08-31 76 views
0

我遇到了Google Geocoding API的一个奇怪问题。我目前正在使用它来查找卢森堡地址的经纬度。我意外地发现,即使我的API请求中包含邮政编码和国家/地区错误,我仍然可以找回正确的位置和格式的地址。Google地理编码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被发现存在。

但是,只是检查这会抛出误报。就拿URL

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当一切显然OK?
  • 当我故意提供错误的国家和邮政编码时,为什么API返回错误状态以外的任何内容?

回答

0

不知怎的,我怀疑我的问题会在这里找到答案,因为我明显发现的错误属于相当“模糊”的全球位置。一路走来,我学到了一些有价值的东西,我觉得我不妨在这里分享一下,而不仅仅是关闭这个问题:

事实是,当处理用户输入的多个国家市场上的地址以及您然后检查Google地理编码API,依靠用户的任何原始输入以任何方式可靠都是非常危险的。根据你在世界中上有输入一个地址

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

....这么多不同的方式。

最佳做法是

  • 保护不同地址组件 - 甚至house no + street位来自用户
  • 在服务器上的不同字段建立整个地址字符串作为你喜欢它 - 地理编码API能够处理轻微的细微差别,如post code before placepost code after placemissing commastoo many commas
  • 如果API返回一个status = OK不依赖于任何的formatted_address的不止或任何方式的partial_result字段。相反,使用结果的address_components部分以您选择的格式重建整个地址。
  • 对您发送到API的地址和您刚刚构建的地址执行字符串不敏感比较。
  • 只有完成匹配才能继续接受地址。

注意,地址组件的address_components的顺序可以不同,所以看起来是专门为[0]项设置为street_number, route, locality, postal_codecountry的类型的组件。最后,所以之前你比较什么做

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

,以确保您已清除所有不需要的空间的空间可以破坏的最佳方案的破坏。