Лучшая служба геокодирования для разработчиков iPhone

Я создал приложение, которое получает массив адресов из веб-службы, и я хочу их сопоставить. Я знаю, что Apple оставила это в MapKit, включая только обратный геокодер. Мне было интересно, как лучше всего подойти к этой проблеме. Веб-сервис? API Карт Google (как работают ключи API?)? CloudMade?

Каково ваше мнение о том, какая услуга самая быстрая, простая в использовании и дешевая (надеюсь, бесплатная)?

Ответ 2

IANAL, но если приложение, которое вы строите, будет бесплатным, то я считаю, что вы можете использовать API Карт Google бесплатно. Он ограничивается 15 000 запросов на геокодирование в день, но в соответствии с документами, связанными с IP, а не с ключом API. Вы можете сразу получить ключ API - никакого утверждения не требуется. (Если ваше приложение не будет свободно доступно, вам придется зарегистрироваться в Google Maps Premier.)

В GMaps теперь есть API геокодирования по HTTP (обычно вам приходилось использовать их JavaScript API, что было больно на iPhone). Он может вернуться в JSON, что тривиально анализировать с помощью TouchJSON, если вам нужны дополнительные данные или CSV, что будет еще проще, если все, что вам нужно, это lat/lon. Таким образом, вы можете просто создать объект, который соответствует протоколу MKAnnotation, который будет извлекать JSON/CSV из API с помощью NSURLConnection или ASIHTTPRequest, анализировать it и вернуть переменную Point в качестве свойства coordinate и построить необходимый MapView по мере необходимости.

Ответ 3

Используйте API геокодирования Apple для этого

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/UsingGeocoders/UsingGeocoders.html

"Класс CLGeocoder предоставляет услуги для преобразования между координатой (заданной как широта и долгота) и удобным для пользователя представлением этой координаты. Удобное представление координаты обычно состоит из улицы, города, штата, и информацию о стране, соответствующую данному местоположению, но она также может содержать соответствующую достопримечательность, ориентиры или другую идентифицирующую информацию. Объект геокодирования является объектом с одним выстрелом, который работает с сетевым сервисом для поиска метки для его заданное значение координаты.

Чтобы использовать объект геокодера, создайте его и вызовите один из методов прямого или обратного геокодирования, чтобы начать запрос. Запросы обратного геокодирования принимают значение широты и долготы и находят читаемый пользователем адрес. Запросы вперед-геокодирования принимают читаемый пользователем адрес и определяют соответствующее значение широты и долготы. Запросы вперед-геокодирования могут также возвращать дополнительную информацию о указанном местоположении, например, о точке интереса или здании в этом месте. Для обоих типов запросов результаты возвращаются с использованием объекта CLPlacemark. В случае запросов вперед-геокодирования может быть возвращено несколько объектов метки, если предоставленная информация дает несколько возможных местоположений. "

CLGeoCoder geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"1 Infinite Loop"
     completionHandler:^(NSArray* placemarks, NSError* error){
         for (CLPlacemark* aPlacemark in placemarks)
         {
             // Process the placemark.
         }
}];

Ответ 4

Я использую "Restful WebService" для обратного геокодирования с помощью Google Maps, и как только я получу координаты, я их храню в SQLite для последующего использования. Служба возвращает строку JSON, которую я позже разбираю в iPhone.

Что-то вроде:

// Initialize call to REST Webservice
- (void) initCall
{
    // Service
    RESTClient *client = [[[RESTClient alloc] initWithDelegate:self] autorelease];
    NSString *serviceHost = @"http://www.site.com/service/maps";
    [client get:serviceHost];
    [serviceHost release];
}

- (void)RESTRequestDidSucceed:(RESTClient*)sender
{

        // Search
   NSString *data = [[[NSString alloc] init] autorelease];
   data = [[NSString alloc] initWithData:sender.receivedData encoding:NSUTF8StringEncoding];

   // Now you have the DATA in and NSString which you can pass as an argument to a method
   // something like

}

Ответ 5

Согласно Google и Yahoo, их соответствующие услуги по геокодированию НЕ допускают "хранение для будущего использования". Если я не понял, вы не можете хранить результаты запроса в любой форме базы данных. В противном случае было бы просто просто Google (теперь 50 000 запросов в день).