2010-11-12 6 views
4

Я могу успешно получить lat/long и передать его геокодеру для получения адреса. Однако я не всегда получаю адрес обратно. Похоже, это требует нескольких попыток? Я не знаю, почему.Геокодер не всегда возвращает значение

Есть ли лучший способ получить адрес на этом этапе?

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

Есть много латов и длинношерстных, у которых нет людей, живущих поблизости? – John

+0

Что смешно, так это то, что он может обнаружить мой точный zipcode, это всего лишь несколько попыток? Во время тестирования я не перемещал места. –

+0

Вы должны проверить этот код со списком проверенных точек lat/lon, для которых вы знаете адрес (или его отсутствие). –

ответ

4

В моем опыте Googles Geocoder всегда не работает, у меня есть пара неподвижных точек на карте, при нажатии на оверлей он хлопает тост с адресом для этого lat/long, эти точки не меняются, иногда я нажимаю на одну и ту же точку 10 раз, но я получаю только 7 из них.

Это странно, но так оно и есть, я просто изменил свое приложение, чтобы решить проблему.

+0

как вы обошли его? –

+2

Не совсем умный или эффективный, но я делаю цикл while, я прошу адрес, пока не получу его или до 3 раз. Штраф в сети не так уж плох, и в 99% случаев я в третий раз получил ответ, который я искал. Я к третьему, я не получил его, я полагаю, что это просто не информация для этого момента. Я знаю, это можно было бы решить лучше. – blindstuff

+0

интересно, больно попробовать это. –

3

Проблема с вышеуказанным подходом, как и многие другие примеры в Интернете, заключается в том, что они только пытаются получить данные от первого возвращенного поставщика с addresses.get(0).getPostalCode(). Когда вы выполняете код List<Address> addresses = getAddresses(), он извлекает список поставщиков, каждый из которых предоставляет свои собственные данные. Не все поставщики будут содержать одни и те же данные.

У меня была такая же проблема с получением почтового индекса. Во время моих первоначальных тестов я обнаружил, что получаю данные от 6 поставщиков. Только 2 из этих 6 провайдеров вернули почтовый индекс. Первый провайдер, с которым я пытался связаться с 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 = адрес.get (count) .getPostalCode(); – Jambaaz

0

в случае, если кто-то до сих пор ищут исправить, вот что я сделал: первый, я убедился, что все точки были в порядке (загрузит), но не всегда могут получить захвачены геокодированию (получение данные попадают или промахиваются) Во-вторых, мы вынуждаем код делать то, что мы хотим, чтобы это сделать, другими словами, если мы знаем, что он может найти lat и long, давайте просто заставляем его продолжать попытки, пока это не произойдет! это 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

1

Геокодер не работает в некоторых районах. Вместо использования Geocoder вы можете использовать Geocoding Api. Перейдите по ссылке, чтобы получить подробную информацию о апи,

https://developers.google.com/s/results/?q=geocoding+api

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(); 
    } 
}; 

Этот обратный вызов должен быть зарегистрирован как следовать в AdapterView ,OnItemClickListener:

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

 Смежные вопросы

  • Нет связанных вопросов^_^