2010-03-05 5 views
10

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

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

ответ

5

API API Карт Google 3 больше не требует ключа API.

Прочитайте это: http://blog.sallarp.com/ipad-iphone-forward-geocoding-api-google/

+0

Спасибо вам большое! никогда не знал бы, что новая версия вышла. Наконец-то я нашел хорошее решение. – conradev

+0

Есть ли какой-либо геокодирование нескольких адресов в одном запросе? У меня есть массив мест, которые мне нужно сопоставить, и количество мест может залезть в 50. Я продолжаю получать ошибку для «слишком много запросов» после e около десятого – conradev

+0

Я не уверен в этом. Я думаю, вам нужно изучить API Карт в отношении нескольких запросов. Я сомневаюсь, что они будут принимать последующие запросы. Но у них может быть метод приема нескольких адресов. Я предлагаю обратиться к Google за вашей проблемой. –

1

Я использую «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

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

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

+0

Это не совсем верно с мобильными операторами, они часто используют шлюз/прокси, которые в конечном счете приносит * * тот же IP ** для тысяч пользователей, который в очень переполненных городских районах, например, где я, Париж, Франция, выходит за пределы Google ... и около 5 вечера, 503 ошибки для многих пользователей ... –

0

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

4

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

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

«The CLGeocoder класса предоставляет услуги для преобразования координат (определяются как широта и долгота) и удобный для пользователя представления, что координаты. А пользователь Дружественное представление координаты обычно состоит из информации об улицах, городах, штатах и ​​стране, соответствующих данному местоположению, но также может содержать соответствующую интересующую точку, ориентиры или другую идентифицирующую информацию. Объект геокодирования - который работает с сетевым сервисом для поиска метки памяти для заданной координаты val уе.

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

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

Спасибо за подсказку, мне гораздо удобнее использовать CLGeoCoder вместо подхода сторонних разработчиков Google Maps! – Raffael

Смежные вопросы