L'API per MKLocalSearch
è abbastanza semplice da comprendere. Nella sua forma più semplice, è
alloc-init
un MKLocalSearchRequest
- impostare il suo
naturalLanguageQuery
a qualche termine di ricerca
- Usa la richiesta di ricerca per inizializzare un oggetto
MKLocalSearch
- Dillo la ricerca locale per avviare, passandogli un handler completamento
- 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 (MKMapItem
mapItems
) 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 placemark
può 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);
}