У меня есть приложение, которое выполняет прямое геокодирование (и получает координаты по адресу )для отображения набора контактов на MKMapView
. Приложение было разработано задолго до того, как iOS стала поддерживать прямое геокодирование с использованием CLGeocoder
(. впервые доступно в iOS 5 ). Таким образом, мое приложение использует Google Maps Geocoding API , который, как правило, очень точен. Учитывая полный адрес с номером улицы, он, как правило, дает вам точное местоположение этого адреса в пределах пары метров.
Я делаю некоторые обновления для своего приложения для поддержки iOS 6 и решил перейти от использования API Google к использованию CLGeocoder
при условии, что приложение работает на iOS 5 или выше. Однако в моих тестах (все с адресами в Португалии, где я живу ), это настолько неточно, что совершенно непригодно для использования.
Я использую– geocodeAddressString:completionHandler:
и, например, учитывая адрес «Avenida da Liberdade 195, Lisboa, Portugal», он дает мне «Avenida da Liberdade» в городе Синтра, а не в Лиссабоне (Лиссабоне ). Это примерно в 15 км от реального адреса. Авенида да Либердаде — одна из самых больших и известных улиц Лиссабона. Эквивалент, скажем, 5-й авеню в Нью-Йорке. Это не какой-то безвестный переулок.
Есть ли что-то, что я делаю неправильно, чтобы получить такую ужасную точность? Есть ли у других аналогичные проблемы с точностью, особенно с адресами за пределами США?
На данный момент, похоже, мне придется придерживаться Google Maps API. Кстати,Я использовал симулятор 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 м, который неприемлемый.