我有一个 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/