Android: обратное геокодирование - getFromLocation - PullRequest
49 голосов
/ 23 января 2009

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

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

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

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


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

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

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

Ответы [ 8 ]

67 голосов
/ 25 января 2009

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

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
48 голосов
/ 13 февраля 2011

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

Процедура вызова геокодера, может быть расположена в классе 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();
}

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

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" />
36 голосов
/ 23 января 2009

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

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

2) Неверный параметр, который вы передаете конструктору Geocoder. Вы проходите в 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 Использования-разрешения.

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

<uses-permission android:name="android.permission.INTERNET" />
8 голосов
/ 07 октября 2013

Причиной этого является несуществующая внутренняя служба:

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

4 голосов
/ 01 июня 2012

Сначала получите широту и долготу, используя класс 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 ()).

2 голосов
/ 24 января 2009

Ну, я все еще в тупике. Так что вот еще код.

Прежде чем покинуть карту, я звоню 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);
//...
    }

И он каждый раз падает.

0 голосов
/ 07 ноября 2016

Используйте это

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
0 голосов
/ 09 октября 2009

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

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

...