2012-12-10 5 views

risposta

21

L'API per MKLocalSearch è abbastanza semplice da comprendere. Nella sua forma più semplice, è

  1. alloc-init un MKLocalSearchRequest
  2. impostare il suo naturalLanguageQuery a qualche termine di ricerca
  3. Usa la richiesta di ricerca per inizializzare un oggetto MKLocalSearch
  4. Dillo la ricerca locale per avviare, passandogli un handler completamento
  5. fare qualcosa con l'array di oggetti MKMapItem nella risposta

Cerca Caffè:

// Create a search request with a string 
MKLocalSearchRequest *searchRequest = [[MKLocalSearchRequest alloc] init]; 
[searchRequest setNaturalLanguageQuery:@"Cafe"]; 

// Create the local search to perform the search 
MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:searchRequest]; 
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
    if (!error) { 
     for (MKMapItem *mapItem in [response mapItems]) { 
      NSLog(@"Name: %@, Placemark title: %@", [mapItem name], [[mapItem placemark] title]); 
     } 
    } else { 
     NSLog(@"Search Request Error: %@", [error localizedDescription]); 
    } 
}]; 

È possibile specificare una regione per la ricerca in questo modo:

// Search for Cafes in Paris 
MKLocalSearchRequest *searchRequest = [[MKLocalSearchRequest alloc] init]; 
[searchRequest setNaturalLanguageQuery:@"Cafe"]; 
CLLocationCoordinate2D parisCenter = CLLocationCoordinate2DMake(48.8566667, 2.3509871); 
MKCoordinateRegion parisRegion = MKCoordinateRegionMakeWithDistance(parisCenter, 15000, 15000); 
[searchRequest setRegion:parisRegion]; 

Si può anche prendere la regione da un MKMapView che l'utente ha ingrandito. Questo darà risultati migliori:

[searchRequest setRegion:self.mapView.region]; 

L'oggetto risposta, un MKLocalSearchResponse, contiene un array di oggetti (MKMapItemmapItems) e un MKCoordinateRegion chiamato boundingRegion, che è una regione che contiene tutti i risultati.Si può usare per impostare una visualizzazione della mappa per mostrare tutti i risultati:

[self.mapView setRegion:response.boundingRegion]; 

L'array di oggetti MKMapItem non può essere collocato su una mappa (sono utilizzati per l'invio per l'applicazione Maps), ma ognuno contiene una proprietà che placemarkpuò essere aggiunti a una mappa:

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
    if (!error) { 
     for (MKMapItem *mapItem in [response mapItems]) { 
      NSLog(@"Name: %@, MKAnnotation title: %@", [mapItem name], [[mapItem placemark] title]); 
      NSLog(@"Coordinate: %f %f", [[mapItem placemark] coordinate].latitude, [[mapItem placemark] coordinate].longitude); 
      // Should use a weak copy of self 
      [self.mapView addAnnotation:[mapItem placemark]]; 
     } 
    } else { 
     NSLog(@"Search Request Error: %@", [error localizedDescription]); 
    } 
}]; 

Ricerca di Dublino pone un perno sulla guarda la mappa e tronchi:

Name: Dublin, Co. Dublin, MKAnnotation title: Dublin, Co. Dublin, Ireland 
Coordinate: 53.344104 -6.267494 

Ci sono un sacco di ulteriori dettagli negli oggetti restituiti, soprattutto se si cercano aziende. Eccone alcuni:

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
    if (!error) { 
     NSLog(@"Results: %@", [response mapItems]); 
     MKMapItem *mapItem = [[response mapItems] objectAtIndex:0]; 
     NSLog(@"Name:%@ Phone:%@ URL:%@", [mapItem name], [mapItem phoneNumber], [mapItem url]); 
     NSLog(@"Placemark: %@", [mapItem placemark]); 
     MKPlacemark *placemark = [mapItem placemark]; 
     NSLog(@"Placemark Address: %@", [placemark addressDictionary]); 
     MKCoordinateRegion boundingRegion = [response boundingRegion]; 
     NSLog(@"Bounds: %f %f", boundingRegion.span.latitudeDelta, boundingRegion.span.longitudeDelta); 
    } 
6

Ecco un esempio che la ricerca di caffè in un raggio di 1 km intorno ad un determinato luogo:

MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; 
CLLocationCoordinate2D location = CLLocationCoordinate2DMake(11.567898, 104.894430); 
request.naturalLanguageQuery = @"cafe"; 
request.region = MKCoordinateRegionMakeWithDistance(location, 1000, 1000); 
MKLocalSearch *search = [[MKLocalSearch alloc] initWithRequest:request]; 
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){ 
    for (MKMapItem *item in response.mapItems) { 
     NSLog(@"%@", item.name); 
    } 
}]; 

Si prega di notare che quando la ricerca non ha successo, non restituisce una lista vuota, ma un errore con dominio MKErrorDomain e codice 4.

Problemi correlati