如何查找任何地方的纬度、经度和时区?

3

我正在开发一个iPhone应用程序,希望能够找到任何地方的纬度、经度和时区信息。

如何同时获取所有这些详细信息呢?

我们可以很容易地找到纬度和经度,但是如何获取该地点的精确时区呢?

请问有人能指导我吗?

谢谢。

7个回答

3
看起来您需要这个:-
NSString *timeZoneName = [[NSTimeZone localTimeZone] name];

下面的代码会返回 "Asia/Kolkata"

如果你使用systemTimeZone,那么它表示设备本身所使用的时区。 localTimeZone返回一个代表应用程序当前默认时区的对象。

使用此API获取数据并传递经纬度值。

获取时区的API


是的,但我想找到世界上任何时区的名称。我该怎么做? - Nithin S
@Nithin S:你得到答案了吗? - Balu
@NithinS 这是正确的答案,但没有详细解释。Sunny 的意思是,你应该先获取目标地点的纬度和经度,然后发送一个调用到那个谷歌 API 网站,它会返回时区(就像示例中给出的链接)。忘了提一下,一些谷歌服务对你可以向它们发出的调用数量和目的有限制。请务必阅读此特定 API 的详细信息。 - Pochi
抱歉。我明白你们说的话了。非常感谢你们的建议。我已经在几天前尝试过了,但问题是对于某些纬度和经度值,网络服务没有提供正确的时区值。因此,我不太愿意使用网络服务。还有其他替代方案吗? - Nithin S
@NithinS 不,获取时区是基于位置的,而且因国家而异(例如夏令时)。因此,您需要调用一个知道这一点的数据库。但为什么您说它不起作用?谷歌API应该返回各种参数,您可以使用这些参数来计算任何您想要的东西。 - Pochi

1
你可以使用CoreLocation获取经度和纬度。
在需要获取经纬度的.h类中添加以下内容。
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface CoreLocationViewController : UIViewController <CLLocationManagerDelegate> {
    CLLocationManager *locationManager;
}
@property (retain, nonatomic) CLLocationManager *locationManager;
@end

而在你的 .m 文件中

#import "CoreLocationViewController.h"

@implementation CoreLocationViewController
@synthesize locationManager; 

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [self setLocationManager:[[CLLocationManager alloc] init]];
    [locationManager setDelegate:self];
    [locationManager setDistanceFilter:kCLDistanceFilterNone]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

 NSLog(@"My Latitude %f",newLocation.coordinate.latitude);
 NSLog(@"My Latitude %f",newLocation.coordinate.longitude);

}

而对于当前的时区,则可以使用

NSTimeZone* currentTimeZone = [NSTimeZone systemTimeZone];
NSDateFormatter *dateFormatter = [dateFormat setTimeZone:currentTimeZone];
NSDate *rightNow = [NSDate date];
NSString *dateString = [dateFormatter  stringFromDate:rightNow];

Z:我想找到世界上任何地方的时区,而不是当前的时区。或者至少找到任何地方的时区名称。有没有办法找到这个? - Nithin S
当你的应用程序运行在伦敦,英格兰时,它将提供该特定地点的时区信息。 - Ahmed Z.
还是你想做一个类似于世界时钟中的时区查找器?就像这个 http://www.timeanddate.com/time/map/ - Ahmed Z.
兄弟,我明白你的意思了。你在谈论当前或本地时间。我想要的是任何地方的时区。比如说,我在印度,我想找到伦敦或其他地方的时区。希望现在我的问题清楚了。 - Nithin S
你想在你的应用程序中加入类似于http://www.timeanddate.com/time/map/这样的东西吗? - Ahmed Z.

1

0
您可以通过使用以下代码从任何设备获取时区:

NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];


或者,如果您只想显示时区名称 [destinationTimeZone name] - Deepesh Gairola
是的,但我如何获取世界上任何地方的时区? - Nithin S
1
如果你有该地点的经纬度,为了实现这个目的,你将不得不使用一些Web服务。请参考这个链接:https://dev59.com/d3VD5IYBdhLWcg3wQJKT - Deepesh Gairola

0

你正在从CLLocationManager获取位置,并且你也在查看Geonames.org

这是一个免费的网络服务,可以让你从经度/纬度获取大量信息

他们还提供了一个免费(并且开源)的Java客户端GeoNames Webservices库(也提供其他语言的库:ruby、python、perl、lisp...)

以下是一些你可以从经度/纬度获取的信息:(完整的网络服务列表在此处)

查找最近的地址

查找最近的交叉路口

查找附近的街道

高程时区


0

0
iOS 5增加了CLGeocoder类,可以执行您想要的查找。它是异步操作的(我假设它在某个服务器上查询),但您提供一个位置,它会返回大量信息,包括时区。问题是针对Objective C提出的,但我将使用Swift进行回答。由于API相同,因此应该很容易推导出Objective C版本。
这是一个在英国查找位置的Swift Playground片段:
import CoreLocation

let location = CLLocation(latitude: 51, longitude: -0.1)
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
    if let error = error {
        print(error.localizedDescription)
        return
    }
    
    if let placemarks = placemarks {
        for placemark in placemarks {
            print(placemark.name ?? "no name")
            print(placemark.locality ?? "no city")
            print(placemark.administrativeArea ?? "no state/province")
            print(placemark.country ?? "no country")
            print(placemark.timeZone?.abbreviation() ?? "no time zone")
        }
    }
}

这是输出结果:

1234 A Street Address
Haywards Heath
England
United Kingdom
GMT+1

我故意更改了上面输出的地址行,以便垃圾邮件机器人不会爬取它并开始向我随意选择的坐标所代表的可怜灵魂发送推销信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接