-->

一个CLPlacemark的“名称”(“Name” of a CLPlacemark)

2019-06-28 07:50发布

我想了解CLPlacemark以及何时/如何为添加到地图的销的标注创建信息。 之前,我在几年前阅读更多的iOS 3的发展,他们反向地理编码地址和内置的地址(街道,邮编,州等)。 首先,我需要建立这个字符串自己? 我试图找出如何获得,比如搜索在下面的代码苹果专卖店某些已知的东西位置的名称:

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

它从哪里获得苹果商店,旧金山,叫什么名字? 我认为这将是CLPlacemark.name财产,但为空。 所以在试图找出如何创建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)我如何获得一个位置的名称(如果有)(即苹果商店)?

2)我需要建立我串了,因为它看起来像地址字典确实为我了吗?

谢谢!

Answer 1:

要回答你的第一个问题,使用areasOfInterest的CLPlacemark的财产。

至于第二个问题,那真的给你了,你怎么想格式化字符串。 如果你想使用它的字符串从建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];
}];

希望帮助了!



Answer 2:

您可以使用ABCreateStringWithAddressDictionary功能从AddressBookUI框架摆脱CLPlacemark的“addressDictionary”属性中的地址字符串。



文章来源: “Name” of a CLPlacemark