У меня есть приложение, которое должно иметь подобную функцию поиска как приложение "Карт" Apple (включенный с iPhone, iPod Touch и iPad).
Рассматриваемой функцией не должна быть твердая вещь сделать, но я действительно невежествен о том, как ввести Конкретный адрес в панели поиска и затем получающие координаты для того адреса или чего-то, что может помочь мне на самом деле переместить карту и центр в том месте.
Я имею в виду, что я должен запросить, Apple обеспечивает "адрес, ищущий метод API"? или я должен использовать карты Google API непосредственно?
Я хотел бы услышать, как это должно быть сделано.
Хорошо, отвечу на свой вопрос:
Как уже было сказано, лучше всего использовать Google Maps API, он поддерживает множество форматов, но по нескольким причинам я выбрал JSON.
Итак, вот шаги для выполнения JSON-запроса к Google Maps и получения координат по этому запросу. Обратите внимание, что не все правильные проверки выполнены, это всего лишь доказательство концепции.
1) Скачайте JSON фреймворк/библиотеку для iPhone, их несколько, я выбрал этот, он очень хорош и кажется активным проектом, плюс несколько коммерческих приложений, кажется, используют его. Так что добавьте его в свой проект (инструкции здесь).
2) Чтобы запросить адрес на Google Maps, нам нужно создать URL запроса следующим образом: http://maps.google.com/maps/geo?q=Paris+France
Этот url, вернет JSON объект для запроса "Paris+France".
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 была настоящей болью для понимания, библиотека не очень хорошо документирована, на мой взгляд, но все же она очень хороша.
EDIT:
Изменил название одного метода на "searchCoordinatesForAddress:" из-за вопроса @Leo. Я должен сказать, что этот метод хорош в качестве доказательства концепции, но если вы планируете загружать большие JSON файлы, вам придется добавить к объекту NSMutableData, чтобы хранить все запросы к серверу google. (помните, что HTTP-запросы приходят по частям.)
Вы можете использовать службу API Google, чтобы получить координаты широты и долготы из текстовой поисковой строки. Обязательно передайте текущее местоположение пользователя, чтобы результаты были релевантными. Прочтите ответы на этот вопрос: Поиск и отображение офисов в MKMapView