2012-12-10 5 views

Antwort

21

Die API für MKLocalSearch ist ziemlich einfach zu verstehen. Am einfachsten, Sie

  1. alloc-init ein MKLocalSearchRequest
  2. Legen Sie seine naturalLanguageQuery zu einem gewissen Suchbegriff
  3. Verwenden Sie die Suchanfrage ein MKLocalSearch Objekt
  4. Sagen Sie die lokale Suche zu initialisieren zu starten, ist es vorbei ein Vervollständigungshandler
  5. Machen Sie etwas mit dem Array MKMapItem Objekte in der Antwort

Suche nach Cafes:

// 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]; 

Sie können auch nehmen Sie die Region von einem MKMapView dass der Benutzer:

// 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]); 
    } 
}]; 

Sie einen Bereich für die Suche wie folgt angeben herangezoomt. Dies wird bessere Ergebnisse:

[searchRequest setRegion:self.mapView.region]; 

Antwortobjekt ein MKLocalSearchResponse, enthält ein Array von MKMapItem Objekten (mapItems) und einem MKCoordinateRegionboundingRegion genannt, die eine Region ist, dass alle Ergebnisse enthält.Sie können es verwenden eine Kartenansicht setzen alle Ergebnisse zeigen:

[self.mapView setRegion:response.boundingRegion]; 

Das Array von MKMapItem Objekte nicht auf der Karte platziert werden können (sie an die Maps-App für das Senden gewohnt sind), aber jedes enthält eine placemark Eigenschaft, die kann zu einer Karte hinzugefügt werden:

[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]); 
    } 
}]; 

Suche nach Dublin legt einen Stift auf der Karte anzeigen und Protokolle:

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

Es gibt eine Menge zusätzlicher Details in den zurückgegebenen Objekten, insbesondere wenn Sie nach Unternehmen suchen. Hier sind ein paar:

[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

Hier ist ein Beispiel, das für Cafe in einem Umkreis von 1 km um einen bestimmten Ort suchen:

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); 
    } 
}]; 

Bitte beachten Sie, dass bei fehlgeschlagener Suche keine leere Liste, sondern ein Fehler mit der Domäne MKErrorDomain zurückgegeben wird und Code 4.

Verwandte Themen