使用MKLocalSearchsearch地图上的位置

我想使用MKLocalSearch在地图中search。 此function在iOS 6.1+中可用。 有谁知道如何使用这个或任何人都可以举例说明如何使用MKLocalSearch

MKLocalSearchResponse文档

MKLocalSearch的API相当容易理解。 最基本的,你

  1. alloc-init一个MKLocalSearchRequest
  2. 将它的naturalLanguageQuery设置为某个search词
  3. 使用search请求来初始化MKLocalSearch对象
  4. 告诉本地search开始,传递一个完成处理程序
  5. 在响应中使用MKMapItem对象的数组做一些事情

search咖啡馆:

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

你可以像这样为search指定一个区域:

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

您也可以从用户放大的MKMapView中获取区域。 这会给出更好的结果:

 [searchRequest setRegion:self.mapView.region]; 

响应对象MKLocalSearchResponse包含一个MKMapItem对象( mapItems )数组和一个名为boundingRegionMKCoordinateRegion ,它是一个包含所有结果的区域。 您可以使用它来设置地图视图来显示所有结果:

 [self.mapView setRegion:response.boundingRegion]; 

MKMapItem对象数组不能放置在地图上(它们用于发送到地图应用程序),但每个对象都包含一个可以添加到地图的placemark属性:

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

search都柏林在地图视图和日志上放置一个别针:

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

返回的对象中有一些额外的细节,特别是如果您search业务。 这里有几个:

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

下面是一个例子,search一个给定位置周围半径1公里的咖啡馆:

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

请注意,比search不成功时,它不返回一个空列表,但与域MKErrorDomain和代码4的错误。

它的原油,但它是一个例子。 希望能帮助到你:

https://github.com/infolock/eLBeeMKLocalSearch