2017-08-11 119 views
3

我想通過Android的GeoCoder類使用用戶輸入文本進行搜索。這裏是我的代碼:Android GeoCoder:通過郵政編碼搜索返回意外結果

Geocoder iGeocoder = new Geocoder(getContext(), Locale.GERMAN); 

public Address getAdress(String aUserInput) { 
    List<Address> tAddressList = iGeocoder.getFromLocationName(aUserInput, 1000, 47.060940, 8.564278, 51.526396, 13.736392); 
    if(tAddressList != null && 
       tAddressList.size() > 0) { 
     for(Address tAddress : tAddressList) { 

      // return the first adress found for germany. 
      Log.e(TAG, "returning Adress: " + tAddress); 
      if(tAddress.getCountryCode().equals("DE")) { 

       return tAddress; 
      } 

     } 
     return null; 
    } else { 
     return null; 
    } 
} 

邊框我傳遞給getFromLocationName粗略地表示,德國政府拜仁。我知道這個邊界框並不能保證結果地址真的存在。我發現一些問題,特別是通過郵政編碼搜索時。

  • 通過郵政編碼搜索時返回的一些結果地址沒有「管理區域」,因此我無法篩選我想要的狀態(=「拜仁」)。
  • 奇怪的是,如果我搜索郵政編碼97070,97078或97076,GeoCoder只返回美國俄勒岡州的地址。然而這些郵政編碼也是在德國小鎮維爾茨堡的地方。例如。 97082將返回維爾茨堡地址,但97070(維爾茨堡中央)不會被發現,它只返回俄勒岡地址。
+0

你需要證明你在哪裏上的拉鍊搜索代碼碼。 –

+0

這就是代碼。這一切都在一行「getFromLocationName ..」中完成。你錯過了什麼嗎? – dan

+0

啊 - 這是郵政編碼,其餘部分是靜態的(我的意思是你的硬編碼值)? –

回答

7

嘗試自定義您的locale。使用德國和德國。 Germany用於德國的國家,而不是language

Locale locale = new Locale(langCode, countryCode) 

Locale locale = new Locale("de", "DE"); 

Geocoder iGeocoder = new Geocoder(getContext(), locale); 

GeoCode默認爲美國,所以它似乎首先篩選郵政編碼。如果您test here

97070給出Wilsonville, OR 97070, USA

47.060940, 8.564278的結果給出Spitzibüelstrasse 8, 6410 Goldau, Switzerland

97070, 47.060940, 8.564278沒有給出結果(這只是測試儀),它不能區分的結果,包括郵政編碼和LAT長。

如果您需要增加區域設置區域 - 您可以隨時創建一個包含3個國家區域設置的數組並在每個區域進行搜索。

您也有太多的回報 - 您只需要在第一個if之後返回一個null,並且它沒有返回地址,以確保所有路徑都有返回值。

public Address getAdress(String aUserInput) { 
    .../... 
    if(.../...) { 
     for(Address tAddress : tAddressList) { 
      .../... 
      if(tAddress.getCountryCode().equals("DE")) { 

       return tAddress; 
      } 
     } 
    } 
    return null; 
} 

還有Region Biasing感謝jausen brett的鏈接

https://maps.googleapis.com/maps/api/geocode/json?address=<some address>&region=de&key=YOUR_API_KEY 

Component Filtering

https://maps.googleapis.com/maps/api/geocode/json?components=locality:<desired locality>|country:DE&key=YOUR_API_KEY 
+1

精心製作。 –

+0

既然你是在主持人選舉,我認爲你會很合理......人們正在低調我的答案是正確的(一個捷徑你的)OP只是犯了一個錯字。感覺像朋友們在我身上聯合起來(編碼不是謊言......你的答案和我的問題解決了這個問題,我得到了兩個反對票。陰謀?大聲笑) –

+0

@JasonKrs這不是一個陰謀 - 你可以將它標記爲mod注意它是否與你有關。我最好的猜測是第一個答案的downote是因爲它沒有解決問題,第二個答案是因爲你基本上重複了我的答案。你運行它並測試它是很好的。您需要知道 - 運行mod的人受到很多審查,並且如果有投票欺詐行爲 - 就像我讓人們代表我倒下或投票一樣 - 這可能會導致我的帳戶被暫停或甚至關閉。如果你仍然擔心 - 請隨時發佈meta。 –