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

Posted

技术标签:

【中文标题】使用 CLGeocoder 反向地理编码查找当前位置【英文标题】:Find the current location using CLGeocoder Reverse Geocoding 【发布时间】:2013-03-15 06:30:45 【问题描述】:

我想根据经纬度找到用户的当前位置。以前我已经使用 MKReverseGeocoder 完成了它,但由于它在 ios5 中已被弃用,我使用 CLGeocoder。但无法获取当前位置。

- (void)viewDidLoad

 locationManager = [[CLLocationManager alloc] init];
        [locationManager setDelegate:self];
        [locationManager setDistanceFilter:kCLDistanceFilterNone];
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
        [locationManager startUpdatingLocation];


- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
    CLLocation *currentLocation = newLocation;

    locationLabelOne=newLocation.coordinate.latitude;


    locationLabelTwo=newLocation.coordinate.longitude;
    geocoder = [[CLGeocoder alloc] init];


    [locationManager stopUpdatingLocation];

    [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) 
        NSLog(@"Found placemarks: %@, error: %@", placemarks, error);
        if (error == nil && [placemarks count] > 0) 
            placemark = [placemarks lastObject];
           NSString *get = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                                 placemark.subThoroughfare, placemark.thoroughfare,
                                 placemark.postalCode, placemark.locality,
                                 placemark.administrativeArea,
                                 placemark.country];
         else 
            NSLog(@"%@", error.debugDescription);
        
     ];
    NSLog(@"%@",placemark);

当我 NSLog 地标返回 null。我哪里出错了?

【问题讨论】:

尝试在CLLocation *currentLocation = newLocation; 之后记录 currentLocation 以检查值是否已设置。您还可以调试每一行以查看值是否设置正确。 locationManager:didUpdateToLocation:fromLocation 已弃用 iOS 6.0,您应该改用 locationManager:didUpdateLocations: 是的,当我记录当前位置时,我得到这个: +/- 5.00m(速度 -1.00 mps / course -1.00)@ 3/15/13,12:33: 00 PM 印度标准时间 @rohan-patel 你能告诉我现在如何在这个中传递纬度和经度吗:? 是的。我想弄清楚。但首先你能告诉我你是如何在 NSlog 中提高速度(speed -1.00 mps / course -1.00) 的吗? 【参考方案1】:

可能的问题:

1) locationManager:didUpdateToLocation:fromLocation 已弃用 iOS 6.0,您应该改用 locationManager:didUpdateLocations:

 - (void)locationManager:(CLLocationManager *)manager
 didUpdateLocations:(NSArray *)locations

     currentLocation=[locations lastObject];
     // rest code will be same
 

2) [locationManager stopUpdatingLocation]; 听起来也很可疑。 IMO 你不应该在CLLocationManagerDelegatemethod 中使用它。

附言

i) 有关正向/反向地理编码的更多详细信息,您可以查看 Apple 的示例代码 GeocoderDemo

ii) 如果您使用 Google API 进行反向地理编码,它将拥有多年来可用的所有数据,但 CLGeocoder 将没有完整的数据,例如街道名称、印度等国家的密码。发生的情况是,当您执行反向地理编码请求时,您将坐标传递给核心位置,核心位置在后台连接到 Web 服务(开发人员不会知道)并返回一个用户可读的地址。因此,此网络服务可能无法像 GOOGLE API 那样返回准确的数据。

【讨论】:

嘿,我现在发现这个错误:Error Domain=kCLErrorDomain Code=8 "操作无法完成。(kCLErrorDomain error 8.)" 我该怎么办? 你在设备上试过了吗?尝试获取placemark.country 看看会发生什么。 嘿,我已经放置了另一个代码,它似乎可以工作。我正在使用这个 CLGeocoder 来显示从当前位置到目标地址的方向,我正在使用 GOogle API。我想知道 CLGeocoder 是否总是在所有情况下都返回 Street,City,State,Zip。因为我需要使用所有这些来显示方向...你能告诉我这一点吗..【参考方案2】:

我遇到了同样的问题,然后通过一些实验我解决了我的问题......

确保: -90

它似乎没有执行基本的 mod 功能。希望对您有所帮助...

【讨论】:

以上是关于使用 CLGeocoder 反向地理编码查找当前位置的主要内容,如果未能解决你的问题,请参考以下文章

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

对用于反向地理编码位置的 CLGeocoder 类方法感到困惑

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

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

iOS 6 中的本地化地理编码选项

使用 CLGeocoder 的正向地理编码示例