Хорошо, чтобы ответить на мой собственный вопрос:
Как уже упоминалось ранее, лучше всего использовать API Карт Google,
он поддерживает множество форматов, но по нескольким причинам я решил использовать JSON.
Итак, вот шаги, чтобы выполнить JSON-запрос к Google Maps и получить координату запроса. Обратите внимание, что не все правильные проверки сделаны, это только подтверждение концепции.
1) Скачайте фреймворк / библиотеку JSON для iPhone, их несколько, я выбрал этот , он очень хороший и кажется активным проектом, плюс несколько коммерческих приложений, кажется, используют Это. Поэтому добавьте его в свой проект (инструкции здесь ).
2) Чтобы запросить у Google Maps адрес, нам нужно создать URL-адрес запроса:
http://maps.google.com/maps/geo?q=Paris+France
Этот URL вернет объект JSON для запроса "Париж + Франция".
3) Код:
//Method to handle the UISearchBar "Search",
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar
{
//Perform the JSON query.
[self searchCoordinatesForAddress:[searchBar text]];
//Hide the keyboard.
[searchBar resignFirstResponder];
}
После того как мы обработаем поиск UISearchBar, мы должны сделать запрос к Google Maps:
- (void) searchCoordinatesForAddress:(NSString *)inAddress
{
//Build the string to Query Google Maps.
NSMutableString *urlString = [NSMutableString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@?output=json",inAddress];
//Replace Spaces with a '+' character.
[urlString setString:[urlString stringByReplacingOccurrencesOfString:@" " withString:@"+"]];
//Create NSURL string from a formate URL string.
NSURL *url = [NSURL URLWithString:urlString];
//Setup and start an async download.
//Note that we should test for reachability!.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];
[request release];
}
Затем мы должны обработать ответ сервера GoogleMaps (Примечание: пропущено много проверок)
//It's called when the results of [[NSURLConnection alloc] initWithRequest:request delegate:self] come back.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//The string received from google's servers
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//JSON Framework magic to obtain a dictionary from the jsonString.
NSDictionary *results = [jsonString JSONValue];
//Now we need to obtain our coordinates
NSArray *placemark = [results objectForKey:@"Placemark"];
NSArray *coordinates = [[placemark objectAtIndex:0] valueForKeyPath:@"Point.coordinates"];
//I put my coordinates in my array.
double longitude = [[coordinates objectAtIndex:0] doubleValue];
double latitude = [[coordinates objectAtIndex:1] doubleValue];
//Debug.
//NSLog(@"Latitude - Longitude: %f %f", latitude, longitude);
//I zoom my map to the area in question.
[self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude];
[jsonString release];
}
Наконец, функция увеличения моей карты, которая теперь должна быть тривиальной.
- (void) zoomMapAndCenterAtLatitude:(double) latitude andLongitude:(double) longitude
{
MKCoordinateRegion region;
region.center.latitude = latitude;
region.center.longitude = longitude;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = .005;
span.longitudeDelta = .005;
region.span = span;
//Move the map and zoom
[mapView setRegion:region animated:YES];
}
Надеюсь, это кому-нибудь поможет, потому что JSON-часть была очень трудной для понимания, библиотека, на мой взгляд, не очень хорошо документирована, но все же она очень хорошая.
РЕДАКТИРОВАТЬ:
Из-за вопроса @Leo одно имя метода изменено на "searchCoordinatesForAddress:". Я должен сказать, что этот метод является хорошим доказательством концепции, но если вы планируете загружать большие файлы JSON, вам нужно будет добавить объект NSMutableData, чтобы сохранить весь запрос на сервере Google. (помните, что HTTP-запросы приходят по частям.)