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

303
22

Я пытаюсь получить адрес на основе 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;

спросил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
1
Решение
352

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

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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
286

Вот полный примерный код с использованием 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" />

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
263

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


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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
133

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


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


ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
98

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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
77

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


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

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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
45

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


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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
45

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


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

ответил(а) 2021-01-25T16:57:53+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема