2

CLPlacemark と、マップに追加されたピンの吹き出しの情報をいつ/どのように作成するかを理解しようとしています。数年前に More iOS 3 development で読んだことよりも前に、彼らは住所をリバース ジオコーディングし、住所 (番地、郵便番号、州など) を作成していました。まず、この文字列を自分で作成する必要がありますか? 以下のコードでアップルストアを検索するなど、特定の既知のものの場所の名前を取得する方法を見つけようとしていました。

NSString *address = @"1 stockton, san francisco, ca";    
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {

    [placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj description: %@", [obj description]);

        CLPlacemark *aPlacemark = (CLPlacemark *)obj;
        NSLog(@"%@", [aPlacemark.addressDictionary description]);
        NSLog(@"name: %@", ((CLPlacemark *)obj).name);
    }];
];

説明を印刷すると、コンソールに次のように表示されます。

Apple Store, San Francisco, 1 Stockton St, San Francisco, CA  94108-5805, United States @ <+37.78584545,-122.40651752> +/- 100.00m, region (identifier <+37.78584545,-122.40652161> radius 18.96) <+37.78584545,-122.40652161> radius 18.96m

サンフランシスコの Apple Store という名前はどこから来たのですか? CLPlacemark.name プロパティだと思ったのですが、null です。したがって、 name プロパティがどのように作成されるかを理解しようとすると、次のことがわかりました。

        NSLog(@"%@", [aPlacemark.addressDictionary description]);

出力が得られます:

City = "San Francisco";
Country = "United States";
CountryCode = US;
FormattedAddressLines =     (
    "Apple Store, San Francisco",
    "1 Stockton St",
    "San Francisco, CA  94108-5805",
    "United States"
);
PostCodeExtension = 5805;
State = California;
Street = "1 Stockton St";
SubAdministrativeArea = "San Francisco";
SubLocality = "Union Square";
SubThoroughfare = 1;
Thoroughfare = "Stockton St";
ZIP = 94108;

ここからわかるのは、addressDictionary の FormattedAddressLines キーにタイトルもあるということだけです。

だから私は私の2つの質問は次のとおりだと思います:

1) 場所 (Apple Store など) がある場合、その場所の名前を取得するにはどうすればよいですか?

2) アドレス ディクショナリがすでにそれを行っているように見えるので、もう文字列を作成する必要がありますか?

ありがとう!

4

2 に答える 2

3

AddressBookUI フレームワークの ABCreateStringWithAddressDictionary 関数を使用して、CLPlacemark の「addressDictionary」プロパティからアドレス文字列を取得できます。

于 2013-04-09T12:59:05.510 に答える
1

最初の質問に答えるにareasOfInterestは、CLPlacemark のプロパティを使用します。

2 番目の質問については、文字列をどのようにフォーマットするかはあなた次第です。addressDictionaryプロパティの文字列を使用してビルドする場合は、必ずそうしてください。パーツを選択して選択し、すべて完了ハンドラーで文字列を作成できます。

また、地図上に表示するための注釈を作成したいとおっしゃいました。私は個人的に MKAnnotation をサブクラス化し、それを使用して、地図上に表示する注釈をすばやく作成します。

MyAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject <MKAnnotation> {
    NSString *_name;
    NSString *_address;
    CLLocationCoordinate2D _coordinate;
}

@property (copy) NSString *name;
@property (copy) NSString *address;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate;

@end

MyAnnotation.m

#import "MyAnnotation.h"

@implementation MyAnnotation
@synthesize name = _name;
@synthesize address = _address;
@synthesize coordinate = _coordinate;

- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate
{
    if ((self = [super init])) {
        _name = [name copy];
        _address = [address copy];
        _coordinate = coordinate;
    }
    return self;
}

- (NSString *)title
{
    return _name;
}

- (NSString *)subtitle
{
    return _address;
}

@end

すべての注釈を保持するために NSMutableArray を宣言しinitWithName:address:coordinate:、完了ハンドラで をスローすると、マップに追加できる注釈の配列をすばやく取得できます。

NSString *address = @"1 stockton, san francisco, ca";    
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) 
{
   NSMutableArray *annotationArray = [NSMutableArray array];
   for (CLPlacemark *aPlacemark in placemarks)
   {
      NSString *nameString = // Get your name from an array created by aPlacemark.areasOfInterest;
      NSString *addressString = // Put your address string info you get from the placemark here.
      CLLocationCoordinate2D coordinate = aPlacemark.location.coordinate;
      MyAnnotation *annotation = [[MyAnnotation alloc] initWithName:nameString address:addressString coordinate:coordinate];
      [annotationArray addObject:annotation];
   }
   // Now save annotationArray if you want to use it later
   // Add it to your MapView with [myMapView addAnnotations:annotationArray];
}];

それが役立つことを願っています!

于 2012-09-14T04:33:00.360 に答える