GPS定位到时区



我想知道用户发送请求的当地时间。基本上,有没有这样一个函数

var localTime = getLocalTime( lat, long );

我不确定一个简单的划分是否可行,因为大多数国家都没有完美的几何形状。

任何帮助都太好了。任何语言都被接受。我想避免调用远程api。

谷歌时区API似乎是你所追求的。但是,它没有任何免费层。

Time Zone API提供地球表面位置的时间偏移数据。请求特定纬度/经度对的时区信息将返回该时区的名称、与UTC的时间偏移量和夏令时偏移量。

不再维护用于计算时区的shapefile

我今天刚刚遇到了同样的问题,我不确定我的答案有多相关,但我基本上只是写了一个Python函数来做你想做的事情。你可以在这里找到。

https://github.com/cstich/gpstotz

编辑:

正如在评论中提到的,我也应该邮政编码。代码基于Eric Muller的时区shapefile,您可以在这里获得- http://efele.net/maps/tz/world/。

编辑2:

事实证明,shapefiles对外部环和内部环的定义有些过时(基本上外部环使用右手定则,而内部环使用左手定则)。无论如何,fiona似乎负责这一点,我相应地更新了代码。

from rtree import index  # requires libspatialindex-c3.deb
from shapely.geometry import Polygon
from shapely.geometry import Point
import os
import fiona
''' Read the world timezone shapefile '''
tzshpFN = os.path.join(os.path.dirname(__file__),
                   'resources/world/tz_world.shp')
''' Build the geo-index '''
idx = index.Index()
with fiona.open(tzshpFN) as shapes:
    for i, shape in enumerate(shapes):
        assert shape['geometry']['type'] == 'Polygon'
        exterior = shape['geometry']['coordinates'][0]
        interior = shape['geometry']['coordinates'][1:]
        record = shape['properties']['TZID']
        poly = Polygon(exterior, interior)
        idx.insert(i, poly.bounds, obj=(i, record, poly))

def gpsToTimezone(lat, lon):
    '''
    For a pair of lat, lon coordiantes returns the appropriate timezone info.
    If a point is on a timezone boundary, then this point is not within the
    timezone as it is on the boundary. Does not deal with maritime points.
    For a discussion of those see here:
    http://efele.net/maps/tz/world/
    @lat: latitude
    @lon: longitude
    @return: Timezone info string
    '''
    query = [n.object for n in idx.intersection((lon, lat, lon, lat),
                                                objects=True)]
    queryPoint = Point(lon, lat)
    result = [q[1] for q in query
              if q[2].contains(queryPoint)]
    if len(result) > 0:
        return result[0]
    else:
        return None
if __name__ == "__main__":
    ''' Tests '''
    assert gpsToTimezone(0, 0) is None  # In the ocean somewhere
    assert gpsToTimezone(51.50, 0.12) == 'Europe/London'

几天前我在寻找同样的事情,不幸的是我找不到一个API或一个简单的函数来做它。原因就像你说的,国家没有完美的几何形状。你必须创建一个表示每个时区的区域,看看你的点在哪里。我认为这将是一个痛苦,我不知道这是否能做到。

我发现的唯一一个如下所述:从纬度/经度确定时区,而不使用像Geonames.org这样的web服务。基本上,您需要一个包含时区信息的数据库,并且您正在尝试查看哪个最接近您感兴趣的点。

然而,我正在寻找静态解决方案(不使用互联网),所以如果你可以使用互联网连接,你可以使用:http://www.earthtools.org/webservices.htm它提供了一个web服务,给你给定的时区经度/纬度坐标。

截至2019年,谷歌API没有任何免费层,@cstich答案的数据源不再维护。

如果你想要一个API, timezonedb.com提供了一个免费的分级速率,限制为1请求/秒。

@cstich使用的数据的原始维护者链接到这个从OpenStreetMap检索数据的项目。自述文件包含查找各种语言库的链接。

难道不能简单地使用用户IP来确定他们所在的位置吗?然后使用一个数组(Countries | Difference with GMT)来获得本地时间。

相关内容

  • 没有找到相关文章

最新更新