Как искать MKMapView с UISearchBar?

У меня есть приложение, которое должно иметь подобную функцию поиска как приложение "Карт" Apple (включенный с iPhone, iPod Touch и iPad).

Рассматриваемой функцией не должна быть твердая вещь сделать, но я действительно невежествен о том, как ввести Конкретный адрес в панели поиска и затем получающие координаты для того адреса или чего-то, что может помочь мне на самом деле переместить карту и центр в том месте.

Я имею в виду, что я должен запросить, Apple обеспечивает "адрес, ищущий метод API"? или я должен использовать карты Google API непосредственно?

Я хотел бы услышать, как это должно быть сделано.

42
задан Goles 3 November 2012 в 14:20
поделиться

2 ответа

Хорошо, отвечу на свой вопрос:

Как уже было сказано, лучше всего использовать 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-запросы приходят по частям.)

39
ответ дан 26 November 2019 в 23:30
поделиться

Вы можете использовать службу API Google, чтобы получить координаты широты и долготы из текстовой поисковой строки. Обязательно передайте текущее местоположение пользователя, чтобы результаты были релевантными. Прочтите ответы на этот вопрос: Поиск и отображение офисов в MKMapView

1
ответ дан 26 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: