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

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

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

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

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


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

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

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

Ответ 1

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

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

Ответ 2

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

Процедура вызова геокодера, может быть расположена в классе помощника

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" />

Ответ 3

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

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 в вашем манифесте.

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

<uses-permission android:name="android.permission.INTERNET" />

Ответ 4

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

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

Ответ 5

Сначала выберите Локатор и Долгота, используя класс 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. Теперь преобразуем sb в String (используя sb.toString()).

Ответ 6

Хорошо, я все еще тупой. Так вот больше кода.

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

И он срабатывает каждый раз.

Ответ 7

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

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

Ответ 8

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

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