2016-08-31 78 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)); 

,以確保您已清除所有不需要的空間的空間可以破壞的最佳方案的破壞。