【问题标题】:Programmatically/Manually create a MKPlacemark/CLPlacemark以编程方式/手动创建 MKPlacemark/CLPlacemark
【发布时间】:2012-02-23 18:55:31
【问题描述】:

问题

我有一组地标信息(国家、城市等)和一个纬度/经度对。我想用它来创建一个 MKPlacemark 对象。


讨论

看来这个类只能由

创建
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary

谁的文档声明了

您可以为已拥有地址信息的实体(例如地址簿中的联系人)手动创建地标对象。创建地标对象显式避免了查询反向地理编码器对象以获取相同信息的需要。

完美!我已经进行了反向地理编码,并希望避免这样的查询。我可以在字典中添加什么?

有关可用于此字典键的字符串列表,请参阅 ABPerson 参考中的“地址属性”常量。中的所有键都应位于字典的顶层。

显示相关键

const ABPropertyID kABPersonAddressProperty;
const CFStringRef kABPersonAddressStreetKey;
const CFStringRef kABPersonAddressCityKey;
const CFStringRef kABPersonAddressStateKey;
const CFStringRef kABPersonAddressZIPKey;
const CFStringRef kABPersonAddressCountryKey;
const CFStringRef kABPersonAddressCountryCodeKey;

这与 MKPlacemark 的基本特征相差甚远:

访问位置数据

  • 位置属性

访问地标属性

  • 命名属性
  • addressDictionary 属性
  • ISOcountryCode 属性
  • 国家财产
  • postalCode 属性
  • administrativeArea 属性
  • subAdministrativeArea 属性
  • 位置属性
  • subLocality 属性
  • 街道物业
  • subThoroughfare 属性
  • 区域属性

访问地理信息

  • 内陆水产
  • 海洋地产

访问地标信息

  • areasOfInterest 属性

幸运的是,MKPlacemark 超类的实际头文件说明了地址字典:

// address dictionary properties

@property (nonatomic, readonly) NSString *name; // eg. Apple Inc.

@property (nonatomic, readonly) NSString *thoroughfare; // street address, eg. 1 Infinite Loop

@property (nonatomic, readonly) NSString *subThoroughfare; // eg. 1

@property (nonatomic, readonly) NSString *locality; // city, eg. Cupertino

@property (nonatomic, readonly) NSString *subLocality; // neighborhood, common name, eg. Mission District

@property (nonatomic, readonly) NSString *administrativeArea; // state, eg. CA

@property (nonatomic, readonly) NSString *subAdministrativeArea; // county, eg. Santa Clara

@property (nonatomic, readonly) NSString *postalCode; // zip code, eg. 95014

@property (nonatomic, readonly) NSString *ISOcountryCode; // eg. US

@property (nonatomic, readonly) NSString *country; // eg. United States

@property (nonatomic, readonly) NSString *inlandWater; // eg. Lake Tahoe

@property (nonatomic, readonly) NSString *ocean; // eg. Pacific Ocean

@property (nonatomic, readonly) NSArray *areasOfInterest; // eg. Golden Gate Park

所以,我创建了一个字典,然后像这样传递它:

return [[[MKPlacemark alloc] initWithCoordinate:aLocation.coordinate addressDictionary:addressDictionary] autorelease];

不幸的是,毕竟,自省表明信息没有坚持:

NSLog(@"placemark %@ from %@", placemark, addressDictionary);
NSLog(@"has %@", placemark.thoroughfare);

打印

2012-01-31 20:14:22.545 [15450:1403] placemark <+___,-___> +/- 0.00m from {
administrativeArea = __;
postalCode = _____;
subAdministrativeArea = ___;
subThoroughfare = __;
thoroughfare = "_____";
}
2012-01-31 20:14:22.545[15450:1403] has (null)

结论

所以,我快到最后了。有没有人想出如何创建自己的 MKPlacemark?谢谢。

【问题讨论】:

  • 您的地址字典看起来是空的。如果你在你的 return 语句之前 NSLog 呢? (Fwiw,我一般不会在同一个语句中分配、初始化、自动释放和返回。如果将它们分成单独的语句,调试起来会更容易。)
  • 再次查看调试输出 - 字典肯定显示 5 个值(我编辑了这些值)。如何将值放入 M​​KPlacemark 是核心问题。谢谢!
  • 啊,我明白了。您是否还编辑了地标?从方法中返回它之前在调试器中是什么样子的?
  • 只是 GPS 坐标。什么是有意义的应该是显而易见的:创建了一个地标。字典有值。结果地标为空。也许字典需要特殊的键?还是有其他方法来创建地标?
  • 哇,我只是想做同样的事情并遇到同样的问题!就我而言,我有一个 BSKmlResult(由优秀的 BSForwardGeocoder 提供,因为我仍然需要支持 iOS 4,否则我会使用 CLGeocoder)。我在 MKPlacemark 上做了一个类扩展,并尝试做基本相同的事情,但无济于事。 :(

标签: ios cocoa-touch core-location


【解决方案1】:

你可以继承MKPlacemark:

在 MyPlacemark.h

@interface MyPlacemark : MKPlacemark

extern NSString * const kCustomPlacemarkAddressThoroughfareKey;
extern NSString * const kCustomPlacemarkAddressSubThoroughfareKey;
extern NSString * const kCustomPlacemarkAddressLocalityKey;
extern NSString * const kCustomPlacemarkAddressSubLocalityKey;
extern NSString * const kCustomPlacemarkAddressAdministrativeAreaKey;
extern NSString * const kCustomPlacemarkAddressSubAdministrativeAreaKey;
extern NSString * const kCustomPlacemarkAddressPostalCodeKey;
extern NSString * const kCustomPlacemarkAddressCountryKey;
extern NSString * const kCustomPlacemarkAddressCountryCodeKey;

@end

在 MyPlacemark.m:

#import "MyPlacemark.h"

@implementation MyPlacemark

NSString * const kCustomPlacemarkAddressThoroughfareKey = @"thoroughfare";
NSString * const kCustomPlacemarkAddressSubThoroughfareKey = @"subThoroughfare";
NSString * const kCustomPlacemarkAddressLocalityKey = @"locality";
NSString * const kCustomPlacemarkAddressSubLocalityKey = @"subLocality";
NSString * const kCustomPlacemarkAddressAdministrativeAreaKey = @"administrativeArea";
NSString * const kCustomPlacemarkAddressSubAdministrativeAreaKey = @"subAdministrativeArea";
NSString * const kCustomPlacemarkAddressPostalCodeKey = @"postalCode";
NSString * const kCustomPlacemarkAddressCountryKey = @"country";
NSString * const kCustomPlacemarkAddressCountryCodeKey = @"countryCode";

- (NSString *)thoroughfare
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressThoroughfareKey];
}

- (NSString *)subThoroughfare
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressSubThoroughfareKey];
}

- (NSString *)locality
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressLocalityKey];
}

- (NSString *)subLocality
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressSubLocalityKey];
}

- (NSString *)administrativeArea
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressAdministrativeAreaKey];
}

- (NSString *)subAdministrativeArea
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressSubAdministrativeAreaKey];
}

- (NSString *)postalCode
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressPostalCodeKey];
}

- (NSString *)country
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressCountryKey];    
}

- (NSString *)countryCode
{
    return [self.addressDictionary objectForKey:kCustomPlacemarkAddressCountryCodeKey];
}

@end

它看起来很难看,但这是迄今为止我发现的唯一可行的方法。

【讨论】:

  • 丑陋,同意,但如果这是唯一理智的方法......你会怎么做?在我的情况下,它可以按原样正常工作,这取决于我是否真的在后台使用 BSKmlResult(来自 BSForwardGeocoder),所以我只需将我的类扩展转换为子类并在未设置 BSKmlResult 时回调超类在我的子类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多