8

ユーザーが通りの名前を検索して、結果を UITableView に表示できるようにしたいと考えています。現時点では地域は重要ではありません。どの地域からでもかまいません。

検索で関連する例を見つけることができず、CLLocation と MKLocalSearch のどちらを使用すべきかわかりません。

ドキュメントに基づいて、MKLocalSearch を使用する必要があります。

ローカル検索とジオコーディングは似ていますが、サポートされるユース ケースは異なります。マップ座標とアドレス帳の住所などの構造化された住所との間で変換する場合は、ジオコーディングを使用します。ユーザーの入力に一致する一連の場所を検索する場合は、ローカル検索を使用します。

しかし、私は両方の方法を試しましたが、返される NSArray があるにもかかわらず、1 つの結果しか得られません。

これは CLGeocoder のアプローチです。

CLGeocoder *geocoding = [[CLGeocoder alloc] init];
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
    if (error) {
        NSLog(@"%@", error);
    } else {
        NSLog(@"%i", [placemarks count]);
        for(CLPlacemark *myStr in placemarks) {
            NSLog(@"%@", myStr);
    }
    }
}];

そして、これは私の MKLocalSearch の試みです:

MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = theTextField.text;
request.region = self.region;

localSearch = [[MKLocalSearch alloc] initWithRequest:request];

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){

    if (error != nil) {
        [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil)
                                    message:[error localizedDescription]
                                   delegate:nil
                          cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
        return;
    }

    if ([response.mapItems count] == 0) {
        [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil)
                                    message:nil
                                   delegate:nil
                          cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
        return;
    }
    self.streets = response;
    [self.streetsTableView reloadData];
}];

MKLocalSearch は場合によっては複数の応答を返すようですが、これらは通りの名前の検索ではなく、場所に関連しています。

前もって感謝します。

4

3 に答える 3

4

これは私が得ることができる最も近いものです。これには、Google Places API Web Service の使用が含まれます。

注:おそらく Google Maps API などを使用できます。さまざまな Google API からこの情報を取得する方法が他にもあると確信しています。

 NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&location=%f,%f&sensor=true&key=API_KEY", formattedSearchText, location.coordinate.latitude,
                                                   location.coordinate.longitude]];

応答は JSON オブジェクトです。それを辞書に変換します。

 NSDictionary *response = [NSJSONSerialization JSONObjectWithData:_googlePlacesResponse
                                                                    options:NSJSONReadingMutableContainers error:&error];

if([[response objectForKey:@"status"] isEqualToString:@"OK"])
{
    NSArray *predictions = [response objectForKey:@"predictions"];
    for(NSDictionary *prediction in predictions)
    {
        NSArray *addressTypes = [prediction objectForKey:@"types"];
        if([addressTypes containsObject:@"route"])
        {
            //This search result contains a street name. 
            //Now get the street name.
            NSArray *terms = [prediction objectForKey:@"terms"];
            NSDictionary *streetNameKeyValuePair = [terms objectAtIndex:0];
            NSLog(@"%@",[streetNameKeyValuePair objectForKey@"value"]);
        }
    }
}

可能なtypesようです

  • ルート -> 通り名
  • 地域 -> 都市/場所の名前
  • 政治 -> 国家など
  • Geocode -> lat/long available
  • You could populate the table view with those predictions that ONLY contain route as an address type. This could work.

    于 2015-06-04T20:01:52.180 に答える
    1

    返される配列には が含まれていmapItemsます。配列を反復処理して、次のようにすべての mapItem を引き出すことができます。

    myMatchingItems = [[NSMutableArray alloc] init];
    for (MKMapItem *item in response.mapItems){
                        [myMatchingItems addObject:item];
        }
    

    それぞれmapItem.placemark.thoroughfareには、見つかった場所の番地が含まれています。

    于 2015-06-04T20:22:01.887 に答える