Хорошо, чтобы ответить на свой вопрос:
Как упоминалось ранее, лучше всего использовать Google Maps API, он поддерживает множество форматов, но по нескольким причинам я выбрал JSON.
Итак, вот шаги, чтобы выполнить запрос JSON к Google Maps и получить координату запроса. Обратите внимание, что не все правильные проверки выполнены, это только подтверждение концепции.
1) Загрузите фреймворк / библиотеку JSON для iPhone, их несколько, я выбрал это one, он очень хорош и кажется активным проектом, плюс несколько коммерческих приложений, похоже, его используют. Поэтому добавьте его в свой проект (инструкции здесь).
2) Чтобы запросить адрес в Картах Google, нам нужно создать 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-запросы поступают по частям.)
person
Goles
schedule
18.02.2010