Обратное местоположение Android-геокодера - надежный способ получить город?

Я искал совсем немного без везения до сих пор.

Геокодер Android возвращает объект android.location.Address. Город, насколько я понял, надо вернуть в getLocality(). Кажется, в США это работает хорошо, за пределами — нет.

Я пишу международное приложение и изо всех сил пытаюсь найти решение, чтобы узнать город геолокации.

Вот вывод из Чехии/Праги:

Address[addressLines=
[0:"Psohlavců 1764/2",
1:"147 00 Prague-Prague 4",
2:"Czech Republic"],
feature=2,
admin=Hlavní město Praha,
sub-admin=Prague,
locality=null,
thoroughfare=Psohlavců,
postalCode=147 00,
countryCode=CZ,
countryName=Czech Republic,
hasLatitude=true,
latitude=50.0276543,
hasLongitude=true,
longitude=14.4183926,
phone=null,
url=null,
extras=null]

locality равно нулю, город находится в пределах sub-admin ! Сам адрес в порядке, так что сервер геокодера, кажется, знает город.

Вот несколько случайных примеров из ЕС, но локальность работает частично:

Address[addressLines=[0:"Nad lesem 440/34",1:"147 00 Prague-Prague 4",2:"Czech Republic"],feature=34,admin=Hlavní město Praha,sub-admin=Prague,locality=null,thoroughfare=Nad lesem,postalCode=147 00,countryCode=CZ,countryName=Czech Republic,hasLatitude=true,latitude=50.02424,hasLongitude=true,longitude=14.4117568,phone=null,url=null,extras=null]

Address[addressLines=[0:"Hauner Straße 4",1:"84431 Heldenstein",2:"Germany"],feature=4,admin=null,sub-admin=null,locality=Heldenstein,thoroughfare=Hauner Straße,postalCode=84431,countryCode=DE,countryName=Germany,hasLatitude=true,latitude=48.2540274,hasLongitude=true,longitude=12.3413535,phone=null,url=null,extras=null]

Address[addressLines=[0:"Igler Straße",1:"6020 Innsbruck",2:"Austria"],feature=Igler Straße,admin=Tyrol,sub-admin=Innsbruck,locality=Innsbruck,thoroughfare=Igler Straße,postalCode=6020,countryCode=AT,countryName=Austria,hasLatitude=true,latitude=47.2465698,hasLongitude=true,longitude=11.4054237,phone=null,url=null,extras=null]

Address[addressLines=[0:"Durnberg 24",1:"5724 Stuhlfelden",2:"Austria"],feature=24,admin=Salzburg,sub-admin=Zell am See District,locality=null,thoroughfare=Durnberg,postalCode=5724,countryCode=AT,countryName=Austria,hasLatitude=true,latitude=47.3233373,hasLongitude=true,longitude=12.4960482,phone=null,url=null,extras=null]

Address[addressLines=[0:"U Roháčových kasáren 14",1:"100 00 Prague 10",2:"Czech Republic"],feature=14,admin=Hlavní město Praha,sub-admin=Prague,locality=Prague 10,thoroughfare=U Roháčových kasáren,postalCode=null,countryCode=CZ,countryName=Czech Republic,hasLatitude=true,latitude=50.0704092,hasLongitude=true,longitude=14.4673473,phone=null,url=null,extras=null]

Может быть, вина на мне, но мне кажется, что в зависимости от страны и района город будет находиться в разных полях. Тем не менее, сам адрес в основном кажется достаточно хорошим, чтобы отправить почтовое письмо.

Кто-нибудь написал умную функцию, которая пытается извлечь больше смысла из результатов Geocoder? Жаль, что Google хранит информацию, но не предоставляет ее должным образом.


person John    schedule 20.02.2014    source источник
comment
Ага. В некоторых странах по-другому. Сначала посмотрите на местоположение, если оно пустое, проверьте суб-администратора.   -  person dannyroa    schedule 21.02.2014
comment
Вы уверены, что суб-администратор надежен в качестве альтернативы, если местность пуста?   -  person John    schedule 21.02.2014
comment
Просто исходя из моего опыта, это либо локально, либо суб-админ. Не сталкивался со сценарием, когда оба пусты.   -  person dannyroa    schedule 21.02.2014
comment
Это ошибка. Даже я столкнулся с той же проблемой. К сожалению, я не нашел обходного пути.   -  person user2511882    schedule 21.02.2014


Ответы (1)


Собираюсь закрыть свой вопрос, решил его обходным путем. Используя предложение от dannyroa

String city="unknown";
if (address.getLocality() != null)  city=address.getLocality();
else
  if (address.getSubAdminArea() != null)  city=address.getSubAdminArea();

Это можно расширить, получив информацию о городе из второй адресной строки. удаление почтового индекса и взятие остатка, но эта информация не уникальна в пределах города и может меняться в зависимости от района/зоны.

person John    schedule 21.02.2014
comment
Это тоже ненадежно, так как иногда getSubAdminArea() также возвращает null, но город остается в mAdminArea (и в странном формате cityName). Кажется, что это обратное геокодирование недостаточно надежно - person Leo Droidcoder; 15.06.2016
comment
Может быть, вы можете предоставить пример местоположения? Google чертовски плохо с этим справился, они, наверное, начали и поняли, как плохо их данные вписываются в новые страны. Похоже, они продолжали расширять свои и без того несоответствующие структуры, добавляя все больше и больше данных, перелопачивая их то здесь, то там. Однако: Вы МОЖЕТЕ сделать его надежным. Если этот код не работает в определенной стране, вам просто нужно найти правильные правила для этой страны и добавить к нему случай if. До сих пор это работало во всех странах, имеющих отношение ко мне (пока) - person John; 11.10.2016
comment
Совсем не надежен. саб админка это не всегда город. - person ; 28.11.2016
comment
Для вас то же самое, что и для Льва. Без примера ваш комментарий бесполезен. - person John; 29.11.2016