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