4

我正在使用MKLocalSearch执行地图搜索。我的问题是响应中 MKMapItems 的排序。例如,搜索我目前所在的城市会首先返回一些与城市名称相关的企业,然后我必须向下滚动一段时间才能找到实际的城市。我正在使用 的region属性MKLocalSearchRequest将搜索集中在附近区域。

我的问题是:

  1. 您可以影响返回给您的响应的顺序吗?例如,地图应用程序会在输入第一个字母后将我的城市列在最上面。为什么没有 POI:s 或企业列在首位?
  2. 有没有办法从搜索中完全消除企业,只得到地址作为回应?

不确定是否相关,但这里是搜索代码:

-(void)issueLocalSearchLookup:(NSString *)searchString {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.location.coordinate, 30000, 30000);
    self.localSearchRequest = [[MKLocalSearchRequest alloc] init];
    self.localSearchRequest.region = region;
    self.localSearchRequest.naturalLanguageQuery = searchString;
    self.localSearch = [[MKLocalSearch alloc] initWithRequest:self.localSearchRequest];

    [self.localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
        if(error){
            NSLog(@"LocalSearch failed with error: %@", error);
            return;
        } else {
            for(MKMapItem *mapItem in response.mapItems){
                [self.data addObject:mapItem];
            }
            [self.searchDisplayController.searchResultsTableView reloadData];
        }
    }];
}
4

2 回答 2

5

MKLocalSearchRequest 只接受 naturalLanguageQuery 和 region 作为参数,所以你可以“执行只返回地址的搜索吗?” - 不。

但是,在请求完成后过滤列表非常容易。如果您想从列表中过滤掉企业,一个简单的 NSPredicate 就可以完成这项工作。

NSPredicate *noBusiness = [NSPredicate predicateWithFormat:@"business.uID == 0"];
NSMutableArray *itemsWithoutBusinesses = [response.mapItems mutableCopy];
[itemsWithoutBusinesses filterUsingPredicate:noBusiness];
于 2014-02-18T00:27:27.220 回答
0

您可以使用 CLGeocoder 并执行反向地理代码查询,而不是使用 MKLocalSearch:

CLGeocoder *geo = [[CLGeocoder alloc] init];

[geo reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
   // look at the placemarks and grab the locality out of them to get the city name

 }];
于 2014-10-25T01:39:42.950 回答