iphone - 使用 CLGeocoder 将 NSString 纬度/经度坐标转换为城市、州和时区

标签 iphone ios objective-c xcode

我有一个 View Controller ,它从应用委托(delegate)中提取用户的纬度和经度坐标。这很有效,但我还需要用户的城市、州和时区。我知道我应该为此使用 CLGeocoder(请参阅最后一段代码),但不知道如何将它们组合在一起。我只需要城市、州和时区的 NSStrings。有人有任何指示或例子吗?谢谢!

在我的 App Delegate 中,我使用 CCLocationManager 来获取这样的坐标:

- (NSString *)getUserCoordinates
{
    NSString *userCoordinates = [NSString stringWithFormat:@"latitude: %f longitude: %f", 
    locationManager.location.coordinate.latitude, 
    locationManager.location.coordinate.longitude];
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
    return userCoordinates;
}

- (NSString *)getUserLatitude
{
    NSString *userLatitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.latitude];
    return userLatitude;
}

- (NSString *)getUserLongitude
{
    NSString *userLongitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.longitude];
    return userLongitude;
}

在我的 View Controller 中,我将用户的纬度和经度作为 NSString 获取:

NSString *userLatitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLatitude];

NSString *userLongitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLongitude];

我想要获取城市、州和时区。我知道我需要 CLGeocoder,但不知道如何将它融合在一起:

CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, 
NSError *error) {
    for (CLPlacemark * placemark in placemarks) {
        NSString *locality = [placemark locality];
    }
}

最佳答案

有几件事,布兰登:

1) CLLocationManager 可能不会立即响应您的坐标请求。你应该将你的 View Controller 设置为 CLLocationManager 委托(delegate),然后当位置更新出现时(这将在 locationManager:didUpdateLocations: 方法中),然后你可以运行你的 CLGeocoder 方法。

2)

我写的是这样的:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog( @"didUpdateLocation!");
    NSLog( @"latitude is %@ and longitude is %@", [self getUserLatitude], [self getUserLongitude]);

    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
        for (CLPlacemark * placemark in placemarks) {
            NSString * addressName = [placemark name];
            NSString * city = [placemark locality]; // locality means "city"
            NSString * administrativeArea = [placemark administrativeArea]; // which is "state" in the U.S.A.

            NSLog( @"name is %@ and locality is %@ and administrative area is %@", addressName, city, administrativeArea );
        }
    }];
}

获取位置的时区有点棘手。我敢打赌有一个 API 或一些示例代码可以在 iOS 中获取它,但它不是 CLPlacemark API 的一部分。

关于iphone - 使用 CLGeocoder 将 NSString 纬度/经度坐标转换为城市、州和时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308225/

相关文章:

ios - 使用Unity3D在iPhone上弹出SMS ViewController

ios - 如何使用 NSFetchedResultsController 来停止已解除的 View Controller 以监听 coredata 更改?

iphone - 核心数据是否实现了数据映射器模式?

javascript - 如何在 webapp 中执行此拉动刷新?

ios - 1 个 UIviewcontroller 中的 2 个 UIcollectionview 具有 2 个不同的 UIcollectionflowlayout?

ios - -[UIThreadSafeNode canPerformAction :withSender:]: unrecognized selector sent to instance

ios - 2个IOS App之间的自动连接

iphone - 在没有导航菜单的情况下使用 ECSliding 切换 View

ios - 您可以将 AutoLayout 与 UISplitViewController 结合使用吗?

ios - 无法加载 bundle “CheckoutTests”,因为它已损坏或缺少必要的资源。尝试重新安装 bundle