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

голоса
46

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

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

Вопрос заключается в том, что я получаю: метод Geocoder (Locale) не определено для типа savemaplocation

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


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

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

У меня есть: импорт android.location.Geocoder;

Задан 23/01/2009 в 10:08
источник пользователем
На других языках...                            


8 ответов

голоса
62

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

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Ответил 25/01/2009 в 01:58
источник пользователем

голоса
41

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

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

Вот вызов этой процедуры Geocoder в вашем UI деятельности:

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" />
Ответил 12/02/2011 в 23:35
источник пользователем

голоса
34

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

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

Заметка

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

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

<uses-permission android:name="android.permission.INTERNET" />
Ответил 23/01/2009 в 11:25
источник пользователем

голоса
7

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

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

Ответил 07/10/2013 в 08:40
источник пользователем

голоса
4

Во-первых получить широту и долготу с помощью местоположения и класса 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.toString ()).

Ответил 01/06/2012 в 13:41
источник пользователем

голоса
2

Ну, я все еще озадачен. Так вот больше кода.

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

И он выходит из строя каждый раз.

Ответил 24/01/2009 в 00:06
источник пользователем

голоса
0

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

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Ответил 07/11/2016 в 13:36
источник пользователем

голоса
0

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

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

Ответил 09/10/2009 в 06:55
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more