Геокодирование CLGeocoder безнадежно неточно
У меня есть приложение, которое направляет геокодирование (получить координаты заданного адреса), чтобы отобразить кучу контактов на MKMapView
. Приложение было разработано задолго до того, как iOS поддерживало форвардное геокодирование с помощью CLGeocoder
(впервые доступно в iOS 5). Таким образом, мое приложение использует API геокодирования Google Maps, что, как правило, очень точно. Учитывая полный адрес с номером улицы, он, как правило, даст вам точное местоположение этого адреса на расстоянии нескольких метров.
Я делаю некоторые обновления для своего приложения для поддержки iOS 6 и решил перейти от использования API Google к использованию CLGeocoder
при условии, что приложение работает на iOS 5 или выше. Однако в моих тестах (все с адресами в Португалии, где я живу) это настолько неточно, что полностью непригодно.
Я использую – geocodeAddressString:completionHandler:
и, например, учитывая адрес "Avenida da Liberdade 195, Lisboa, Portugal", он дает мне "Avenida da Liberdade" "в городе Синтре, а не в Лиссабоне (Лиссабон). Это примерно в 15 км от настоящего адреса. Avenida da Liberdade - одна из самых больших и известных улиц Лиссабона. Это эквивалент, например, 5-й авеню в Нью-Йорке. Это не какая-то непонятная маленькая переулок.
Есть ли что-то, что я делаю неправильно, чтобы получить такую ужасную точность? Имеют ли другие проблемы с аналогичной точностью, особенно с адресами за пределами США?
В настоящее время похоже, что мне придется придерживаться API Карт Google. Кстати, я использую симулятор iOS 6, и результаты не лучше. Помещение той же строки поиска в поле поиска в приложении iOS 6 Maps дает те же самые неточные результаты.
EDIT: добавлен CLGeocoder
код:
CLGeocoder *fgeo = [[[CLGeocoder alloc] init] autorelease];
NSLog(@"Geocoding for Address: %@\n", address);
[fgeo geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
if (!error) {
// do stuff with the placemarks
for (CLPlacemark *placemark in placemarks) {
NSLog(@"%@\n %.2f,%.2f",[placemark description], placemark.location.horizontalAccuracy, placemark.location.verticalAccuracy);
}
} else {
NSLog(@"Geocoding error: %@", [error localizedDescription]);
}
}];
РЕДАКТИРОВАТЬ 2: я обнаружил, что если я использую – geocodeAddressDictionary:completionHandler:
и передаю словарь адресов с адресом улицы, почтовый кода (zip-код) и столько деталей, сколько я могу себе представить, он дает мне достаточно точные координаты, но все же с радиусом точности более 400 м, что неприемлемо.
Ответы
Ответ 1
Ну, похоже, что да, Apple CLGeocoder
не так точна для прямого геокодирования (адрес → координаты) как API геокодирования Google Maps, особенно за пределами США. Использование словаря адресов со всеми полями, заполненными как можно полнее, работает намного лучше, чем простая строка адреса, но она все еще не там, где достаточно хорошо. Если Google (обычно) даст вам координаты в пределах 5-10 м от номера улицы, Apple предоставит вам координаты где-то на правой улице, если повезет.
EDIT:
Найден Разработчик Apple Техническая нота TN2289, в которой указаны поддерживаемые страны для CLGeocoder
. Похоже, что Португалия находится в списке частично поддерживаемых регионов, который он описывает как:
Следующие территории не полностью поддерживаются, потому что покрытие более ограничено или по другим причинам. Например, местоположение может быть возможно только для геокодирования до уровня дороги, а не для конкретной адресной точки на этой дороге.
Что соответствует моим результатам с CLGeocoder
в Португалии. Наверное, мне просто нужно ждать улучшения освещения.