CLGeocoder 反向地理编码位置。第一次在 [placemarks count = 0]?

Posted

技术标签:

【中文标题】CLGeocoder 反向地理编码位置。第一次在 [placemarks count = 0]?【英文标题】:CLGeocoder reverseGeocodeLocation. First time in [placemarks count = 0]? 【发布时间】:2012-07-02 04:18:12 【问题描述】:

我是 ObjC 的新手,我正在努力使用 CLGeocoder。我希望能够使用reverseGeocodeLocation 来获取一个字符串,该字符串包含我在用户按下完成按钮时传递给我的委托的用户位置。

所以用户触发了 MapViewController 的显示,我在 viewDidLoad 中调用了 reverseGeocodeLocation,但这是第一次调用 [placemarks count = 0],我没有地标来获取我需要的信息。用户第二次触发 MapViewController 的显示时,placemarks 数组已被填充并且一切正常。

我怀疑这与 reverseGeocodeLocation 是一个异步调用有关 - 但我不知道如何解决这个问题。我尝试过在线搜索,但似乎没有任何东西可以帮助我理解我做错了什么以及如何解决这个问题。提前致谢。

@interface MapViewController ()
@property (strong, nonatomic) CLGeocoder *geocoder;
@property (readwrite, nonatomic) NSString *theLocationName;
@end

@implementation MapViewController
@synthesize mapView, geocoder, delegate = _delegate, theLocationName = _theLocationName;

- (void)viewDidLoad

[super viewDidLoad];

self.mapView.delegate=self;
self.mapView.showsUserLocation = YES;

[self theUserLocation];


-(void)theUserLocation

if (!geocoder)

    geocoder = [[CLGeocoder alloc] init];


MKUserLocation *theLocation;
theLocation = [self.mapView userLocation];

[geocoder reverseGeocodeLocation:theLocation.location 
               completionHandler:^(NSArray* placemarks, NSError* error)
 
     if ([placemarks count] > 0)
     
         CLPlacemark *placemark = [placemarks objectAtIndex:0];

         [self setTheLocationName: placemark.locality];

     
 ];

- (IBAction)done:(id)sender 


[[self delegate] mapViewControllerDidFinish:self locationName:[self theLocationName]];



@end

【问题讨论】:

【参考方案1】:

这不是您问题的确切答案,但是,如果您可以切换到除 CLGeocoder 之外的其他解决方案,那么以下功能可以帮助您从给定的纬度、经度获取地址

#define kGeoCodingString @"http://maps.google.com/maps/geo?q=%f,%f&output=csv" //define this at top

-(NSString *)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude

    NSString *urlString = [NSString stringWithFormat:kGeoCodingString,pdblLatitude, pdblLongitude];
    NSError* error;
    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error];
    locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    return [locationString substringFromIndex:6];

信用:Selected Answer to this question

【讨论】:

感谢您的回复。我会记住这一点,但我真的很想了解 CLGeocoder 的工作原理:-)【参考方案2】:

所以用户触发了 MapViewController 的显示,我在 viewDidLoad 中调用了 reverseGeocodeLocation,但是第一次调用了 [placemarks count = 0],并且我没有地标来获取我需要的信息。用户第二次触发 MapViewController 的显示时,placemarks 数组已被填充并且一切正常。

这不是因为调用是异步的,而是因为您第一次调用 theUserLocation 时实际位置不可用。获取用户的位置不是即时的——它需要时间。但是,您在地图加载后立即询问用户的位置,这在大多数情况下是行不通的。

您需要做的是挂钩MKMapViewDelegate 方法,这些方法会在位置更新时为您提供回调。您可以使用它来检查位置的准确性,并确定它是否足够准确以进行反向地理定位。

【讨论】:

感谢您的回复。接受我的道歉,因为我仍在拼命地试图了解它是如何工作的。鉴于我没有留出足够的时间来了解用户的位置,我认为我会将对 [self theUserLocation] 的调用转移到完成按钮的实现上。我的理由是,此时地图已经显示出来,并且正在显示一个带有用户放大位置的图钉 - 所以到那时必须知道用户位置 - 但这也不起作用。 啊,我才恍然大悟,因为地理编码器需要时间进行经纬度查找,所以在地理编码器提供答案之前,完成的其余代码正在执行。 我已经实现了 didUpdateUserLocation: 方法,我在其中放置了所有用于放大用户位置的代码。我刚刚将 [self theUserLocation] 方法移到了这里 - 现在它可以工作了!!!我不是 100% 确定这是无懈可击的,因为我担心如果地理编码器需要一段时间来进行纬度/经度查找,用户仍然可以在得到答案之前点击完成按钮?

以上是关于CLGeocoder 反向地理编码位置。第一次在 [placemarks count = 0]?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CLGeocoder 反向地理编码查找当前位置

CLGeocoder 反向地理编码失败,错误域=NSURLErrorDomain 代码=-1000 -

如何在 iOS 中使用反向谷歌地理编码?

在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null

CLLocationManager 和 CLGeoCoder

在 iPhone 上进行反向地理编码 - 获取准确的街道号码