首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLPlacemark的“名称”

CLPlacemark的“名称”
EN

Stack Overflow用户
提问于 2012-09-13 12:01:02
回答 2查看 7.5K关注 0票数 2

我正在尝试理解CLPlacemark以及何时/如何为添加到地图中的管脚的标注创建信息。在我几年前读到更多iOS 3开发之前,他们对地址进行反向地理编码并构建地址(街道、邮政编码、州等)。首先,我需要自己构建这个字符串吗?我试着找出如何在下面的代码中获得某个位置的名称,比如搜索苹果商店:

代码语言:javascript
复制
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);
    }];
];

当我打印出描述时,我看到控制台显示:

代码语言:javascript
复制
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属性是如何创建的过程中,我发现:

代码语言:javascript
复制
        NSLog(@"%@", [aPlacemark.addressDictionary description]);

我得到了输出:

代码语言:javascript
复制
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键中,标题也在那里。

所以我想我的两个问题是:

1)如果有一个位置(即Apple Store),我如何获取该位置的名称?

2)既然地址字典已经为我做了这件事,我还需要构建我的字符串吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-14 12:33:00

要回答您的第一个问题,请使用CLPlacemark的areasOfInterest属性。

至于第二个问题,这完全取决于你,以及你想要如何格式化字符串。如果您想要使用addressDictionary属性中的字符串来构建它,那么一定要这样做。您可以选择各个部分,并在完成处理程序中创建一个字符串。

此外,您还提到要创建一个注释,以便在地图上显示。我个人将MKAnnotation子类化,并使用它快速创建要在地图上显示的注释。

MyAnnotation.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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:,这样就可以快速获得可以添加到地图中的注释数组。

代码语言:javascript
复制
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];
}];

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2013-04-09 20:59:06

您可以使用AddressBookUI框架中的ABCreateStringWithAddressDictionary函数从CLPlacemark的"addressDictionary“属性中获取地址字符串。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12399220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档