2010-11-12 55 views
4

我能夠成功獲取經緯度並將其傳遞給地址解析器以獲取地址。但是,我並不總是收到回覆地址。似乎需要幾次嘗試?我不知道爲什麼。Geocoder並不總是返回值

現在有沒有更好的方法來獲取地址?

public List<Address> getAddresses(){ 
      Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); 
      List<Address> addresses = new ArrayList(); 
      try { 
     addresses = geocoder.getFromLocation(latitude, longitude, 1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

     return addresses; 
     } 

我在這裏調用此方法:

LocationListener onLocationChange=new LocationListener() { 
     public void onLocationChanged(Location loc) { 
      //sets and displays the lat/long when a location is provided 
      String latlong = "Lat: " + loc.getLatitude() + " Long: " + loc.getLongitude(); 
      latitude = loc.getLatitude(); 
      longitude = loc.getLongitude(); 

      List<Address> addresses = getAddresses(); 

      if(addresses.size() > 0 && addresses != null) 
      zipcode = addresses.get(0).getPostalCode(); 

      Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show(); 
     } 
+0

有很多lats和longs沒有人住在附近? – John 2010-11-12 21:33:05

+0

有趣的是,它可以檢測到我的確切郵編,它只需要幾次嘗試?測試期間我沒有移動位置。 – 2010-11-12 21:33:53

+0

你應該測試這個代碼,並列出一些經驗證的緯度/經度點,你知道它的地址(或缺少它)。 – 2010-11-12 21:35:47

回答

4

在我的經驗,谷歌的地理編碼器總不上班,我有一對夫婦在地圖上的固定點,當我點擊覆蓋它彈出一個爲這個經緯度的地址加油,這些點不會改變,有時我點擊10次相同的點,但我只能得到7個地址。

它很奇怪,但就是這樣,我只是修改我的應用程序來解決這個問題。

+0

你是怎麼得到它的? – 2010-11-12 22:45:00

+2

不完全聰明或有效,但我做了一段時間的循環,我要求的地址,直到我得到它或最多3次。網絡上的壓力並不是那麼糟糕,99%的時間在我第三次得到我正在尋找的答案時。我在第三節我沒有得到它,我認爲這是根本沒有信息的那一點。 我知道,這可以解決得更好。 – blindstuff 2010-11-13 15:26:04

+0

有趣,生病得試試看。 – 2010-11-13 23:42:10

3

上述方法以及互聯網上的其他許多例子的問題是,他們只嘗試從第一個返回的提供商那裏檢索數據,其中addresses.get(0).getPostalCode()。當您執行代碼List<Address> addresses = getAddresses()時,它將檢索提供者列表,每個提供者都提供他們自己的數據。並非所有提供商都會包含相同的數據。

我收到郵政編碼時遇到同樣的問題。在我最初的測試中,我發現我正在接收來自6個提供商的數據。這6家提供商中只有2家返回了郵政編碼。我試圖使用address.get(0).getPostalCode()訪問的第一個提供商不是其中的一個。更合適的方法是遍歷所有返回的提供程序,以查看誰返回了我正在查找的數據。

像下面這樣的東西應該工作。賠率是,其中一個提供商將返回郵政編碼。這可以通過提供商返回的任何地理編碼數據完成。

List<Address> address = gc.getFromLocation(myLatitude, myLongitude, 10); 

if (address.size() > 0) { 
    strZipcode = address.get(0).getPostalCode(); 

    //if 1st provider does not have data, loop through other providers to find it. 
    count = 0; 
    while (strZipcode == null && count < address.size()) { 
     strZipcode = address.get(count).getPostalCode(); 
     count++; 
    } 
} 
+0

strZipcode = address.get(count).getPostalCode(); – Jambaaz 2015-04-28 19:22:53

0

的情況下,任何人都還在尋找一個解決方法,這裏是我做過什麼: 首先,我確信所有的點都很好(將加載),但並不一定能夠獲得通過地理編碼抓住(獲取數據被擊中或未命中) 秒,我們強制代碼做我們希望它做的事,換句話說,如果我們知道它可以找到一個經緯度,讓它繼續嘗試,直到它!這diddnt似乎也影響我的加載時間!所以這裏是代碼:

do { 
$geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$key.'sensor=false'); 

$output= json_decode($geocode); 
$lat = $output->results[0]->geometry->location->lat; 
$long = $output->results[0]->geometry->location->lng; 
} while($lat == '' and $long == ''); 

這將繼續循環,直到經度和長度都不是空字符串!

快樂編碼! :P

0

如果您使用的自動完成功能,你可以從廣場對象獲取的地方位置:

private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback 
     = new ResultCallback<PlaceBuffer>() { 
    @Override 
    public void onResult(PlaceBuffer places) { 
     if (!places.getStatus().isSuccess()) { 
      // Request did not complete successfully 
      AALog.e("Geocoder Place query did not complete. Error: " + places.getStatus().toString()); 
      return; 
     } 
     // Get the Place object from the buffer. 
     final Place place = places.get(0); 
     //--------------here you can recover the place location--------------------- 
     ((DrawerActivity)getActivity()).lastPlace = place.getLatLng(); 
     //----------------------------------------------------------------------   
     places.release(); 
     getActivity().getFragmentManager().beginTransaction().remove(AutocompleteFragment.this).commit(); 
    } 
}; 

這個回調應該被註冊爲遵循內部適配器視圖。OnItemClickListener:

 PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
       .getPlaceById(mGoogleApiClient, placeId); 
     placeResult.setResultCallback(mUpdatePlaceDetailsCallback);