Геокодер не всегда возвращает значение - PullRequest
4 голосов
/ 13 ноября 2010

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

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

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

Ответы [ 5 ]

4 голосов
/ 13 ноября 2010

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

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

3 голосов
/ 11 августа 2012

Проблема с вышеупомянутым подходом, а также многими другими примерами в Интернете заключается в том, что они пытаются получить данные только от первого возвращенного поставщика с 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 голосов
/ 23 августа 2016

Если вы используете автозаполнение, вы можете получить местоположение из объекта Place:

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);
0 голосов
/ 08 февраля 2016

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

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

0 голосов
/ 09 апреля 2015

в случае, если кто-то все еще ищет исправление, вот что я сделал: во-первых, я удостоверился, что все точки были в порядке (будут загружаться), но не всегда могут быть захвачены геокодированием (получение или попадание данных) во-вторых, мы заставляем код делать то, что мы хотим, иными словами, если мы знаем, что он МОЖЕТ найти широту и долготу, давайте просто заставим его продолжать попытки, пока это не произойдет!это, похоже, не повлияло и на мое время загрузки!так вот код:

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 == '');

это будет продолжаться до тех пор, пока и lat, и long не будут пустыми строками!

счастливого кодирования!: P

...