Геокодер не всегда возвращает значение
Я могу успешно получить lat/long и передать его геокодеру для получения адреса. Однако я не всегда получаю адрес обратно. Похоже, это займет пару попыток? Я не уверен почему.
Есть ли лучший способ для меня получить адрес в этой точке?
public List<Address> getAddresses(){
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> addresses = new ArrayList();
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
Я вызываю этот метод здесь:
LocationListener onLocationChange=new LocationListener() {
public void onLocationChanged(Location loc) {
//sets and displays the lat/long when a location is provided
String latlong = "Lat: " + loc.getLatitude() + " Long: " + loc.getLongitude();
latitude = loc.getLatitude();
longitude = loc.getLongitude();
List<Address> addresses = getAddresses();
if(addresses.size() > 0 && addresses != null)
zipcode = addresses.get(0).getPostalCode();
Toast.makeText(getApplicationContext(), zipcode,Toast.LENGTH_SHORT).show();
}
5 ответов
По моему опыту, Googles Geocoder не всегда работает, у меня есть пара фиксированных точек на карте, когда я нажимаю на оверлей, он добавляет тост с адресом для этого широты / долготы, эти точки не меняются, иногда я нажмите на одну и ту же точку 10 раз, но я получу только адрес 7 из них.
Это странно, но так оно и есть, я просто изменил свое приложение, чтобы обойти проблему.
Проблема с вышеупомянутым подходом, а также многими другими примерами в Интернете, состоит в том, что они только пытаются получить данные от первого возвращенного поставщика с addresses.get(0).getPostalCode()
, Когда вы выполняете код List<Address> addresses = getAddresses()
он извлекает список поставщиков, каждый из которых предоставляет свои собственные данные. Не все поставщики будут содержать одинаковые данные.
У меня была такая же проблема с получением почтового индекса. Во время моих начальных тестов я обнаружил, что получаю данные от 6 поставщиков. Только 2 из этих 6 провайдеров вернули почтовый индекс. Первый поставщик, к которому я пытался получить доступ address.get(0).getPostalCode()
не был одним из них. Более подходящим подходом было бы перебрать всех возвращенных провайдеров, чтобы увидеть, кто вернул данные, которые я искал.
Что-то вроде следующего должно работать. Скорее всего, один из провайдеров вернет почтовый индекс. Это может быть сделано для любых данных геокодирования, которые вам нужны поставщиками.
List<Address> address = gc.getFromLocation(myLatitude, myLongitude, 10);
if (address.size() > 0) {
strZipcode = address.get(0).getPostalCode();
//if 1st provider does not have data, loop through other providers to find it.
count = 0;
while (strZipcode == null && count < address.size()) {
strZipcode = address.get(count).getPostalCode();
count++;
}
}
Геокодер не работает в некоторых областях. Вместо использования Geocoder, вы можете использовать Geocoding Api. Перейдите по ссылке, чтобы получить подробную информацию о API,
В случае, если кто-то все еще ищет исправление, вот что я сделал: во-первых, я удостоверился, что все точки были в порядке (загрузились), но не всегда могли быть захвачены геокодированием (получение данных попало или нет), во-вторых, мы заставляем код делать то, что мы хотим, иными словами, если мы знаем, что он МОЖЕТ найти лат и долг, давайте просто заставим его продолжать попытки, пока он не сделает! это, похоже, не повлияло и на мое время загрузки! так вот код:
do {
$geocode=file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$key.'sensor=false');
$output= json_decode($geocode);
$lat = $output->results[0]->geometry->location->lat;
$long = $output->results[0]->geometry->location->lng;
} while($lat == '' and $long == '');
это будет продолжаться до тех пор, пока и lat, и long не будут пустыми строками!
Удачного кодирования!:П
Если вы используете автозаполнение, вы можете получить местоположение из объекта Place:
private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
= new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
// Request did not complete successfully
AALog.e("Geocoder Place query did not complete. Error: " + places.getStatus().toString());
return;
}
// Get the Place object from the buffer.
final Place place = places.get(0);
//--------------here you can recover the place location---------------------
((DrawerActivity)getActivity()).lastPlace = place.getLatLng();
//----------------------------------------------------------------------
places.release();
getActivity().getFragmentManager().beginTransaction().remove(AutocompleteFragment.this).commit();
}
};
Этот обратный вызов должен быть зарегистрирован следующим образом в AdapterView.OnItemClickListener:
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
.getPlaceById(mGoogleApiClient, placeId);
placeResult.setResultCallback(mUpdatePlaceDetailsCallback);