Геокодирование CLGeocoder безнадежно неточно

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

15
задан mluisbrown 25 July 2012 в 16:56
поделиться