经纬度时区查询

83

是否有任何库(或更好的是Web服务)可以将经纬度转换为时区?


9
有没有非网络服务的解决方案?我有一个使用案例,在我偶尔断开网络连接的情况下,仍然需要在现场获取这些信息。一个包含API的时区地理数据库将会很有用。 - Simon Gillbee
Simon,参见:https://dev59.com/5W035IYBdhLWcg3wKsua - fjsj
是的,有一个商业可用的库可以在http://askgeo.com上完成这个任务。它是用Java编写的,是线程安全的,并且非常快(每秒10,000个查询)。 - James D
1
当一切都说完了,时间只是调度的一个维度。 "小时" 不是相对于当地的昼夜周期,因为即使在同一地点,这种变化也是年度性的。 如果每个人都使用以秒,千秒,兆秒等为单位的恒星时间,那么事情将变得非常简单。 1 kSec 约为 17 分钟,这是一个非常合理的时间段。 一天大约是 86.4kSec。 它并不是一个整数,但又怎样呢? 行星自转减速,因此没有一天的长度与前一天完全相同。 - Peter Wone
8个回答

65

我为了一个正在开发的项目深入研究了这个问题。GeoNames.org和EarthTools.com对于许多情况都是不错的选择,但存在以下严重缺陷:

  • GeoNames.org通过搜索其数据库中包含时区字段的最近点来查找时区。这往往会导致在边界附近得到错误的结果。它也非常缓慢,每个请求的查询时间长达几秒钟。如果查询点附近没有数据库中的项,它也不会返回有效的时区。GeoNames还限制每天可以进行的查询数量,使批量操作变得困难。
  • EarthTools.org使用地图并能够快速返回查询结果,但对于大多数位置,它不考虑夏令时,并返回原始偏移量而不是时区ID(即,它返回“GMT-7”而不是“America/Chicago”)。此外,在准备本帖子时,我刚刚查看了他们的页面,谷歌Chrome警告说他们的网站上有恶意软件。这对我来说是新的,可能会改变,但显然是令人担忧的一个原因。

这些缺陷意味着这些现有工具不适合我的需求,所以我自己开发了解决方案并发布了它供大家使用。您可以在这里找到它:

http://www.askgeo.com/

AskGeo基于世界时区地图,因此针对每个有效的纬度和经度返回一个有效的时区。它返回标准的时区ID(例如,“America/Los_Angeles”),用于Linux和大多数其他操作系统和编程框架。它还返回当前偏移量,充分考虑了夏令时。

它非常易于使用,并且使用方法记录在网站主页上。API支持批量查询,因此如果需要进行大量查找,请使用批量接口而不是使用串行请求使服务器负荷过大。批量查询也更快,所以每个人都能受益。

我们最初推出此服务时,使用了Google App Engine (GAE)作为开发平台,并向所有用户提供免费使用。这是因为当时GAE的价格非常低廉。然而,随着服务器负载的持续增加和GAE价格的大幅上涨,两个因素的共同作用导致我们开始使用Amazon Web Services进行托管,并对商业用途收费,同时仍然保持对非营利、非商业开源项目和研究人员免费。针对商业用户,我们会提供1000次免费查询以便潜在客户评估API是否符合其需求。有关定价和条款,请参阅网站。

底层库是用Java编写的,由于广受欢迎,我们还发布了商业许可下的库。完整的库文档和定价详情请参阅网站。

希望这对你有所帮助。对我正在开发的项目来说,这确实很有用。


有没有一种方法可以将您的时区ID(例如“America/Los_Angeles”)转换为.NET System.TimeZoneInfo? - Judah Gabriel Himango
此页面包含 tz 数据库 ID(也称为 Olson ID)和 Windows 时区 ID 之间的映射关系: http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html - James D
不错的工作。如果能够传入一个日期来获取不同时间点的夏令时调整偏移量就更好了。添加Windows时区名称将是额外的奖励。 - CodeGrue
1
你是否计划接受一个回调参数,以便可以使用JSONP? - Jon Nylander
8
除非我漏掉了什么,否则这个不再是免费的:API可以试用,并且对于非商业和个人使用是免费的。开源项目、学生和私人个体可以免费使用(受我们的使用准则约束)。任何希望将API用于商业目的的用户必须支付每年200美元的访问费。 - Arry
显示剩余4条评论

28

1
这将为您提供当前时间以及夏令时和标准时间的偏移量,但我在寻找将来日期是否处于夏令时方面遇到了困难。 - Scott Cowan
对于这个问题,Java日历可能更有用。 - Frederic Morin

12

这很棒,你知道如果我也在使用Google Maps API进行地理编码,那么这2500次限制是针对所有请求还是2500次用于地理编码和另外2500次用于时区? - Tesla

8

对于 PHP,我使用 unserialize(file_get_contents()) 在基本 URL 上使用 location=lat%20long&gflags=R&flags=PT 来获取一个包含时区的数组。 - Owen

5

Eric Muller为tz(Olson)数据库的时区制作了shapefile地图。然而,有一些小细节需要注意:

  1. 使用的边界通常不是官方的。
  2. 它没有像tz数据库本身那样经常更新,因此可能会缺少一些新形成或调整的时区。

除此之外,对于大多数目的来说,它似乎非常准确。


4

1
他们只提供了相对于GMT的原始偏移量,没有时区ID,并且在世界上大多数地区不考虑夏令时,这使得它在我看来相当难以使用。 - James D
他们似乎已经离开了。 - ligi

4

你需要多高的精度?将经度除以15几乎是正确的:p


6
当我回答这个问题时,我是非常戏谑的,但直到我再次看到这个问题并试图解决问题时,我才意识到这个想法是完全无用的:http://upload.wikimedia.org/wikipedia/commons/e/e7/Timezones2008.png(除非你在国际水域)。 - Tom
1
我看了一下地图,认为你提出的方法对于粗略估计来说实际上相当不错。例如,我需要的是相当粗略的东西(差几个小时都没关系),将经度除以15似乎是一个不错的解决方案。从地图上看,在国际日期变更线周围的地球上,有很少的有人居住的地方,除以15会导致严重错误的情况非常少。 - MB.
2
从政治角度来看,使用数学获取时区并不总是推荐的。但是如果需要知道是白天还是黑夜,这种方法可以通过编程方式解决,而无需任何网络服务。感谢这个想法。 - JackPearse
是的,http://askgeo.com(全面披露:我经营这个网站)。您可以购买一种Java库,在您自己的服务器上完成此操作。 - James D

0

DRT引擎接受一个纬度、经度和本地日期时间,并返回时区偏移量。这可以用于确定特定位置在未来日期的时区。


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