Геокодирование CLGeocoder безнадежно неточно
У меня есть приложение, которое выполняет геокодирование (получить координаты по указанному адресу), чтобы отобразить несколько контактов на MKMapView
, Приложение было разработано задолго до того, как iOS поддержала прямое геокодирование с использованием CLGeocoder
(впервые доступно в iOS 5). Поэтому мое приложение использует API геокодирования Карт Google, который, как правило, очень точный. Учитывая полный адрес с номером улицы, он обычно дает вам точное местоположение этого адреса в течение нескольких метров.
Я делаю некоторые обновления для моего приложения для поддержки iOS 6 и решил перейти с использования Google API на использование CLGeocoder
при условии, что приложение работает на iOS 5 или выше. Однако в моих тестах (все с адресами в Португалии, где я живу) он настолько неточен, что его невозможно использовать.
я использую – geocodeAddressString:completionHandler:
и, например, учитывая адрес "Авенида да Либердаде 195, Лиссабон, Португалия", он дает мне "Авенида да Либердаде" в городе Синтра, а не в Лиссабоне (Лиссабон). Это примерно в 15 км от реального адреса. Авенида да Либердаде является одним из самых больших и известных проспектов в Лиссабоне. Эквивалент, скажем, 5-й авеню в Нью-Йорке. Это не какой-то туманный переулок.
Что-то я делаю не так, чтобы получить такую ужасную точность? У других есть похожие проблемы с точностью, особенно с адресами за пределами США?
В настоящее время, похоже, мне придется придерживаться API Карт Google. Кстати, я пользуюсь симулятором iOS 6, и там результаты не лучше. Помещение одной и той же строки поиска в поле поиска в приложении "Карты iOS 6" дает такие же совершенно неточные результаты.
РЕДАКТИРОВАТЬ: добавлено 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:
и передать в словарь адресов адрес, почтовый индекс (почтовый индекс) и как можно больше подробностей, чтобы получить достаточно точные координаты, но с радиусом точности более 400 м, что недопустимо.
1 ответ
Ну, похоже, что да, Apple, CLGeocoder
нет ничего более точного для прямого геокодирования (адрес -> координаты), чем API геокодирования Карт Google, особенно за пределами США. Использование словаря адресов со всеми полями, заполненными настолько полно, насколько это возможно, работает намного лучше, чем простая адресная строка, но все еще недостаточно хороша. Если Google (обычно) даст вам координаты в пределах 5-10 м от номера улицы, Apple, если вам повезет, даст вам координаты где-нибудь на нужной улице.
РЕДАКТИРОВАТЬ: Найдено Техническое примечание разработчика Apple TN2289, в котором подробно указаны CLGeocoder
, Похоже, что Португалия находится в списке частично поддерживаемых регионов, который она описывает как:
Ниже перечислены территории, которые не полностью поддерживаются, либо потому, что охват более ограничен, либо по другим причинам. Например, местоположение можно геокодировать только до уровня дороги, в отличие от конкретной точки адреса на этой дороге.
Что соответствует моим результатам с CLGeocoder
в Португалии. Думаю, мне просто нужно подождать, пока улучшится освещение.