Android: обратное геокодирование - getFromLocation

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

Geocoder myLocation = Geocoder(Locale.getDefault());
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1);

Проблема в том, что я продолжаю получать: метод Geocoder (Locale) не определен для типа savemaplocation.

Любая помощь будет полезна. Спасибо.


Спасибо, я сначала попробовал контекст, локаль один, и это не удалось, и я смотрел на некоторые другие конструкторы (я видел один, который упоминал только локаль). Несмотря ни на что,

Это не сработало, поскольку я все еще получаю: метод Geocoder (Context, Locale) не определен для типа savemaplocation

У меня есть: import android.location.Geocoder;


person Chrispix    schedule 23.01.2009    source источник


Ответы (8)


Следующий фрагмент кода делает это за меня (lat и lng - двойные значения, объявленные над этим битом):

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
person Wilfred Knievel    schedule 25.01.2009
comment
Я тоже пробовал это, каждый раз, когда я пытаюсь просмотреть список адресов, он вылетает. Не уверен что происходит. Я попробую установить здесь новое приложение через день или два, чтобы посмотреть, что я найду. - person Chrispix; 26.01.2009
comment
Я нашел это очень полезным для позиционирования: blogoscoped.com/archive/2008-12 -15-n14.html - person Wilfred Knievel; 29.01.2009
comment
... также у меня есть следующие два разрешения в моем манифесте: ‹uses-permission android: name = android.permission.INTERNET /› ‹uses-permission android: name = android.permission.ACCESS_FINE_LOCATION /› Когда я пропустил одно из них (не могу вспомнить, какой) приложение выдало действительно бесполезную ошибку. - person Wilfred Knievel; 29.01.2009
comment
Как я могу добавить ключ API к этому классу? Так я могу получить больше запросов? - person Olsi Saqe; 20.05.2014
comment
Лучше использовать Locale.US? Поскольку иногда getDefault () возвращает некоторые проблемы, например адреса на случайном языке, не так ли? - person portfoliobuilder; 31.07.2015
comment
есть ли квота для класса геокодера для получения адреса? - person Aman Verma; 16.01.2019
comment
Есть ли у нас в 2019 году (api ›= 26 SDK) способ получить адрес без прохождения контекста? - person Ponomarenko Oleh; 27.02.2019

Вот полный пример кода с использованием потока и обработчика для получения ответа геокодера без блокировки пользовательского интерфейса.

Процедура вызова геокодера, может находиться в классе Helper

public static void getAddressFromLocation(
        final Location location, final Context context, final Handler handler) {
    Thread thread = new Thread() {
        @Override public void run() {
            Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
            String result = null;
            try {
                List<Address> list = geocoder.getFromLocation(
                        location.getLatitude(), location.getLongitude(), 1);
                if (list != null && list.size() > 0) {
                    Address address = list.get(0);
                    // sending back first address line and locality
                    result = address.getAddressLine(0) + ", " + address.getLocality();
                }
            } catch (IOException e) {
                Log.e(TAG, "Impossible to connect to Geocoder", e);
            } finally {
                Message msg = Message.obtain();
                msg.setTarget(handler);
                if (result != null) {
                    msg.what = 1;
                    Bundle bundle = new Bundle();
                    bundle.putString("address", result);
                    msg.setData(bundle);
                } else 
                    msg.what = 0;
                msg.sendToTarget();
            }
        }
    };
    thread.start();
}

Вот вызов этой процедуры геокодера в вашем пользовательском интерфейсе:

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler());

И обработчик для отображения результатов в вашем пользовательском интерфейсе:

private class GeocoderHandler extends Handler {
    @Override
    public void handleMessage(Message message) {
        String result;
        switch (message.what) {
        case 1:
            Bundle bundle = message.getData();
            result = bundle.getString("address");
            break;
        default:
            result = null;
        }
        // replace by what you need to do
        myLabel.setText(result);
    }   
}

Не забудьте указать следующее разрешение в вашем Manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
person EricLarch    schedule 12.02.2011
comment
код работает безупречно, отличная база для дальнейшей настройки - person John; 20.02.2014
comment
Это правильно, иначе андроид будет через NetworkOnMainThreadException. В качестве альтернативы можно даже использовать более простой AsyncTask, чтобы сделать это - person Nezam; 03.05.2014
comment
Обратный геокодированный адрес появляется несколько раз. Я не знаю почему? - person Vineeth Kuttipurath kottayodan; 21.07.2017
comment
@VineethKuttipurathkottayodan Если один и тот же адрес появляется несколько раз, это потому, что вы поместили функцию getAddressFromLocation внутри функции onLocationChanged - person coder; 29.09.2017
comment
есть ли квота для класса геокодера для получения адреса? - person Aman Verma; 16.01.2019

Похоже, здесь происходят две вещи.

1) Вы пропустили ключевое слово new перед вызовом конструктора.

2) Параметр, который вы передаете конструктору геокодера, неверен. Вы проезжаете Locale, где ожидает Context.

Есть два Geocoder конструктора, оба из которых требуют Context, а один также принимает Locale:

Geocoder(Context context, Locale locale)
Geocoder(Context context)

Решение

Измените свой код, чтобы передать действительный контекст и включить new, и все будет в порядке.

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

Примечание

Если у вас все еще есть проблемы, это может быть проблема с разрешением. Геокодирование неявно использует Интернет для выполнения поиска, поэтому вашему приложению потребуется тег INTERNET uses-permission в вашем манифесте.

Добавьте следующий узел разрешений на использование в узел manifest вашего манифеста.

<uses-permission android:name="android.permission.INTERNET" />
person Reto Meier    schedule 23.01.2009
comment
Спасибо, думаю, вчера вечером я работал слишком поздно, не знаю, что случилось с моим новым. Думаю, я забыл его изначально, поставил обратно, когда у меня был только мой Локаль, а затем, когда я вернулся, забыл его снова .. Я ценю это .. - person Chrispix; 23.01.2009
comment
Не волнуйтесь, с первого раза тоже не заметила :) - person Reto Meier; 23.01.2009
comment
есть ли квота для класса геокодера для получения адреса? - person Aman Verma; 16.01.2019
comment
@Sniper получил какой-нибудь ответ по квоте класса геокодера, пожалуйста? - person Gabe; 01.10.2019

Причина в том, что серверная служба не существует:

Классу Geocoder требуется серверная служба, которая не включена в базовую структуру Android. Методы запроса геокодера вернут пустой список, если на платформе нет серверной службы.

person Ingo    schedule 07.10.2013
comment
Это правильный ответ. Другие ответы не будут работать без бэкэнда. - person ajeh; 07.01.2014
comment
Это работает вне симуляторов, если запущены сервисы Google Play. - person Gabe; 01.10.2019

Сначала получите широту и долготу с помощью классов Location и LocationManager. Теперь попробуйте приведенный ниже код для получения информации о городе и адресе.

double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
    List<Address> addresses = gc.getFromLocation(lat, lng, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
        Address address = addresses.get(0);
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
            sb.append(address.getAddressLine(i)).append("\n");
            sb.append(address.getLocality()).append("\n");
            sb.append(address.getPostalCode()).append("\n");
            sb.append(address.getCountryName());
    }

Информация о городе теперь в сб. Теперь преобразуйте sb в String (используя sb.toString ()).

person Antony    schedule 01.06.2012
comment
есть ли квота для класса геокодера для получения адреса? - person Aman Verma; 16.01.2019

Что ж, я все еще в тупике. Итак, вот еще код.

Перед тем, как оставить свою карту, я звоню SaveLocation(myMapView,myMapController);. Это то, что в конечном итоге вызывает мою информацию геокодирования.

Но поскольку getFromLocation может выдать IOException, мне пришлось сделать следующее, чтобы вызвать SaveLocation

try
{
    SaveLocation(myMapView,myMapController);
}
catch (IOException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Затем мне нужно изменить SaveLocation, указав, что он выбрасывает исключения IOExceptions:

 public void SaveLocation(MapView mv, MapController mc) throws IOException{
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
//...
    }

И каждый раз вылетает.

person Chrispix    schedule 23.01.2009
comment
Может быть проблема с разрешениями. Геокодер использует Интернет для поиска, поэтому вам нужно разрешение на использование Интернета. Обновил ответ с подробностями. - person Reto Meier; 24.01.2009
comment
У меня есть доступ в Интернет для отображения. Очень странно, почему все глючит. Дайте мне логарифм. - person Chrispix; 24.01.2009
comment
Это исключение, которое я получаю: java.lang.IllegalArgumentException: latitude == 3.2945512E7 - person Chrispix; 10.02.2009
comment
Думаю, я разобрался, ему нужна широта / долгота, а не E7 (т.е. 32.945512) - person Chrispix; 10.02.2009
comment
@Chrispix, что такое E7? Я пытаюсь понять, что у меня не так? - person Gabriel Fair; 22.02.2012
comment
есть ли квота для класса геокодера для получения адреса? - person Aman Verma; 16.01.2019

Я слышал, что Geocoder работает с ошибками. Недавно я собрал пример приложения, которое использует http-службу геокодирования Google для поиска местоположения от широты до долготы. Не стесняйтесь проверить это здесь

http://www.smnirven.com/?p=39

person Community    schedule 09.10.2009

Использовать это

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
person Sojan Ks    schedule 07.11.2016