1

アイテムの住所を取得する方法を見つけようとしていMKPlacemarkます。thoroughfareコンソールでアイテムを印刷すると、そこに情報が表示されますが、住所番号のない情報しか取得できません。

これが私のコードです:

- (void)performSearch {
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc]init];
    request.naturalLanguageQuery = _searchText.text;
    request.region = _mapView.region;

    _matchingItems = [[NSMutableArray alloc]init];

    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];
    NSLog(@"MKLocalSearch array created");

    [search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
        if (response.mapItems.count == 0) {
            NSLog(@"No Matches Found");
        } else {
            for (MKMapItem *item in response.mapItems) {
                [_matchingItems addObject:item];
                MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init];
                annotation.coordinate = item.placemark.coordinate;

                // Pull out address info from MKMapItem
                MKPlacemark *placemark = item.placemark;
                NSLog(@"Placemark info: %@", item.placemark);
                // Address details
                NSDictionary *address = placemark.addressDictionary;
                NSString *titleString = @"";
                NSString *subtitleString = @"";
                NSString *name = @"";
                NSString *thoroughfare = @"";
                NSString *state = @"";
                NSString *city = @"";
                NSString *country = @"";

                name = [address objectForKey:@"Name"] ? [address objectForKey:@"Name"] : @"";
                thoroughfare = [address objectForKey:@"Thoroughfare"] ? [address objectForKey:@"Thoroughfare"] : @"";
                state = [address objectForKey:@"State"] ? [address objectForKey:@"State"] : @"";
                city = [address objectForKey:@"City"] ? [address objectForKey:@"City"] : @"";
                country = [address objectForKey:@"Country"] ? [address objectForKey:@"Country"] : @"";

                titleString = [NSString stringWithFormat:@"%@ %@", name, thoroughfare];
                subtitleString = [NSString stringWithFormat:@"%@ %@ %@ %@", thoroughfare, state, city, country];

                // Strings for annotation
                annotation.title = item.name;
                annotation.subtitle = subtitleString;

                [_mapView addAnnotation:annotation];
            }
        }
    }];
}
4

2 に答える 2

3

次のようにアドレスを見つけることができます。

        geocoder.reverseGeocodeLocation(location, completionHandler: {(placemarks, error)->Void in
        var placemark:CLPlacemark!

        if error == nil && placemarks!.count > 0 {
            placemark = placemarks![0] as CLPlacemark


            var addressString : String = ""
            if placemark.ISOcountryCode == "TW" /*Address Format in Chinese*/ {
                if placemark.country != nil {
                    addressString = placemark.country!
                }
                if placemark.subAdministrativeArea != nil {
                    addressString = addressString + placemark.subAdministrativeArea! + ", "
                }
                if placemark.postalCode != nil {
                    addressString = addressString + placemark.postalCode! + " "
                }
                if placemark.locality != nil {
                    addressString = addressString + placemark.locality!
                }
                if placemark.thoroughfare != nil {
                    addressString = addressString + placemark.thoroughfare!
                }
                if placemark.subThoroughfare != nil {
                    addressString = addressString + placemark.subThoroughfare!
                }
            } else {
                if placemark.subThoroughfare != nil {
                    addressString = placemark.subThoroughfare! + " "
                }
                if placemark.thoroughfare != nil {
                    addressString = addressString + placemark.thoroughfare! + ", "
                }
                if placemark.postalCode != nil {
                    addressString = addressString + placemark.postalCode! + " "
                }
                if placemark.locality != nil {
                    addressString = addressString + placemark.locality! + ", "
                }
                if placemark.administrativeArea != nil {
                    addressString = addressString + placemark.administrativeArea! + " "
                }
                if placemark.country != nil {
                    addressString = addressString + placemark.country!
                }

                print (placemark.postalCode)

                let new_placemark: MKPlacemark = MKPlacemark (placemark: placemark)

            print(placemark.description)    

            }


        }
    })
于 2017-01-18T12:34:35.473 に答える
0

MKPlacemarkのサブクラスですCLPlacemark

CLPlacemark各アドレス要素に対して便利なプロパティが定義されているため、キー名で辞書に直接アクセスする必要はありません。(ディクショナリに直接アクセスする必要がある場合は、ABPersonここに記載されている定義済みのアドレス プロパティ キー名定数を使用してみてください。)

便利なプロパティ アクセサーを使用すると、番地は にあるはずですplacemark.subThoroughfare

ただし、指定された座標の精度と国によっては、すべての住所要素が設定されるとは限らないことに注意してください。

于 2015-03-09T12:53:48.297 に答える