首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MKLocalSearch在地图上搜索位置

使用MKLocalSearch在地图上搜索位置
EN

Stack Overflow用户
提问于 2012-12-10 18:11:12
回答 3查看 15.9K关注 0票数 9

我想使用MKLocalSearch在地图中进行搜索。此功能在iOS 6.1+中可用。有人知道如何使用它吗?或者有人能举例说明如何使用MKLocalSearch吗?

MKLocalSearchResponse documentation

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-29 22:51:41

MKLocalSearch的应用编程接口非常容易理解。在最基本的情况下,

  1. alloc-init an MKLocalSearchRequest
  2. Set it naturalLanguageQuery to the search term
  3. search request to naturalLanguageQuery an MKLocalSearch object
  4. 告诉本地搜索开始,向其传递一个完成处理程序
  5. 处理响应中的MKMapItem对象数组<代码>H216<代码>G217

搜索咖啡馆:

代码语言:javascript
复制
// 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]);
    }
}];

您可以指定搜索区域,如下所示:

代码语言:javascript
复制
// 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中获取区域。这将提供更好的结果:

代码语言:javascript
复制
[searchRequest setRegion:self.mapView.region];

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

代码语言:javascript
复制
[self.mapView setRegion:response.boundingRegion];

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

代码语言:javascript
复制
[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]);
    }
}];

搜索Dublin会在地图视图和日志上放置一个图钉:

代码语言:javascript
复制
Name: Dublin, Co. Dublin, MKAnnotation title: Dublin, Co. Dublin, Ireland
Coordinate: 53.344104 -6.267494

在返回的对象中有很多额外的细节,特别是在你搜索商业的时候。下面是一些例子:

代码语言:javascript
复制
[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);
    }
票数 24
EN

Stack Overflow用户

发布于 2014-04-07 15:34:29

下面是一个搜索给定位置周围半径为1公里范围内咖啡馆的示例:

代码语言:javascript
复制
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);
    }
}];

请注意,当搜索不成功时,它不会返回一个空列表,而是返回一个域MKErrorDomain和代码4的错误。

票数 7
EN

Stack Overflow用户

发布于 2013-04-09 14:59:15

以下是Localsearch的教程

http://jeffreysambells.com/2013/01/28/mklocalsearch-example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13798804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档