从纬度经度查找时区 [关闭]

Posted

技术标签:

【中文标题】从纬度经度查找时区 [关闭]【英文标题】:Timezone lookup from latitude longitude [closed] 【发布时间】:2010-09-07 16:14:38 【问题描述】:

是否有可以将纬度/经度转换为时区的库(甚至更好的网络服务)?

【问题讨论】:

是否有针对此的非 Web 服务解决方案?我有一个用例,我有零星的互联网连接,但仍然需要在现场获取这些信息。顶部带有 API 的时区地理数据库会很有用。 西蒙,见:***.com/questions/5584602/… 是的,askgeo.com 上有一个商业可用的库可以做到这一点。它是用 Java 编写的,是线程安全的,而且速度非常快(每秒 10,000 次查询)。 说到底,时间只是调度的一个维度。 “小时”相对于当地的昼夜周期,因为即使对于给定的位置,它也会每年变化。如果每个人都以秒、千秒、兆秒等为单位使用恒星时间,事情会变得非常简单。一个 kSec 大约是 17 分钟,这是一个非常人性化的时间。一天大约是 86.4kSec。这不是偶数,但那又怎样?因为地球的自转速度正在减慢,所以没有一天的长度与前一天完全相同。 另见:How to get a time zone from a location using latitude and longitude coordinates? 【参考方案1】:

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

GeoNames.org 通过在其数据库中搜索包含时区字段的最近点来查找时区。这通常会导致边界附近的错误结果。它也非常缓慢,导致每个请求的查询时间大约为几秒钟。如果查询点附近的数据库中没有项目,它也不会返回有效的时区。 GeoNames 还限制了每天可以进行的查询数量,使得批量操作变得困难。 EarthTools.org 使用地图并且能够快速返回查询,但它不考虑大多数位置的夏令时,它返回原始偏移量而不是时区 ID(即,它们返回“ GMT-7”而不是“美国/芝加哥”)。此外,我在准备这篇文章时只是查看了他们的页面,谷歌浏览器警告他们网站上存在恶意软件。这对我来说是新的,它可能会改变,但显然值得关注。

这些缺陷意味着这些现有工具不适合我的需求,因此我推出了自己的解决方案并将其发布以供一般使用。你可以在这里找到它:

http://www.askgeo.com/

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

它非常易于使用,并且在网站主页上记录了使用情况。该 API 支持批量查询,因此如果您需要进行大量查找,请使用批量接口,而不是让我们的服务器因串行请求而陷入困境。批量查询也快得多,所以每个人都赢了。

当我们第一次发布它时,我们在 Google App Engine (GAE) 上构建它,并向所有用户免费提供。这是可能的,因为当时 GAE 的价格非常低。从那时起,我们的服务器负载大幅增加,GAE 的价格也一路上涨。这两个因素相结合,导致我们转向 Amazon Web Services 进行托管并开始对商业用途收费,同时为非营利、非商业开源项目和研究人员提供免费服务。对于商业用户,我们提供 1000 个免费查询,让潜在客户评估 API 以确保其满足他们的需求。有关价格和条款,请参阅网站。

底层库是用 Java 编写的,由于受欢迎的需求,我们还在商业许可下发布了该库。图书馆的完整文档和定价详情都在网站上。

我希望这是有用的。这对我正在从事的项目当然很有用。

【讨论】:

有没有办法将您的时区 ID(例如“America/Los_Angeles”)转换为 .NET System.TimeZoneInfo? 此页面包含 tz 数据库 id(也称为 Olson id)和 Windows 时区 id 之间的映射:unicode.org/repos/cldr-tmp/trunk/diff/supplemental/… 干得好。如果可以传入一个日期以获得不同时间点的日光调整偏移量,那就太好了。添加 Windows 时区名称将是一个额外的好处。 您是否打算接受回调参数以便 JSONP 工作? 除非我错过了什么,否则这不再是免费的:该 API 可以免费试用,并且免费供非商业和个人使用。开源项目、学生和个人可以免费使用它(根据我们的使用指南)。任何希望将 API 用于商业目的的用户都必须每年支付 200 美元的访问费。【参考方案2】:

看看Geonames.org

这是一项免费的网络服务,可让您从长/纬度获取大量信息

They also provide a free (and open source) Java Client for GeoNames Webservices library (library for other language also provided: ruby, python, perl, lisp...)

以下是您可以从 long/lat 获得的一些信息:(complete list of webservices here)

查找最近的地址 查找最近的交叉口 查找附近的街道 海拔 时区

【讨论】:

这将为您提供当前时间以及夏令时和标准的偏移量,但我无法确定未来的日期是否在夏令时 为此,Java 日历可能会更有用【参考方案3】:

时区现在可通过 Google API 获得

https://developers.google.com/maps/documentation/timezone/

【讨论】:

这太好了,你知道我是否也在使用 Google Maps API 进行地理编码,如果 2,500 限制适用于所有请求,还是 2,500 用于地理编码,另外 2,500 用于时区? 【参考方案4】:

Yahoo Places API 通过反向地理定位提供时区信息。

检查一下。

http://developer.yahoo.com/geo/placefinder/guide/requests.html

【讨论】:

对于 php,我在基本 URL 上使用 unserialize(file_get_contents()) 并使用 location=lat%20long&gflags=R&flags=PT 来获取包含时区的数组。 查询网址如下所示:where.yahooapis.com/…【参考方案5】:

您需要多少准确度?将经度除以 15 几乎是正确的:p

【讨论】:

当我做出这个答案时,我很搞笑,但直到我自己尝试解决问题时再次遇到这个问题,我才意识到这个想法是多么无用:upload.wikimedia.org/wikipedia/commons/e/e7/Timezones2008.png(除非你在国际水域) 我看了那张地图,认为您建议的方法实际上是相当不错的粗略估计。例如,我需要一些非常近似的东西(几个小时就可以了),将经度除以 15 看起来是一个很好的解决方案。从地图上看,地球上几乎没有有人居住的地方,在国际日期变更线附近,除以 15 会导致严重错误。 并不总是建议使用数学从政治角度获取时区。但是如果需要知道是白天还是黑夜,这种方法可以在没有任何 Web 服务的情况下以编程方式解决。感谢这个想法。 是的,askgeo.com(完全披露:我经营该网站)。您可以购买在您自己的服务器上执行此操作的 Java 库。【参考方案6】:

Eric Muller 为 tz (Olson) 数据库的时区创建了 shapefile maps。不过,有一些小警告:

    使用的边界通常是非官方的。 它没有像 tz 数据库本身那样定期更新,因此可能会丢失一些新形成或调整的区域。

不过,除此之外,它似乎对于大多数用途来说都非常准确。

【讨论】:

【参考方案7】:

项目死了:-/

这些看起来很有希望-

存档链接:

https://web.archive.org/web/20150503145203/http://www.earthtools.org/webservices.htm

【讨论】:

它们只提供与 GMT 的原始偏移量,而不是时区 ID,而且它们没有考虑世界上大部分地区的 DST,这使得它在我看来非常不可用。 他们好像走了【参考方案8】:

DRT Engine 采用纬度、经度和本地日期时间并返回时区偏移量。这可用于在未来日期确定特定位置的时区。

【讨论】:

以上是关于从纬度经度查找时区 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

查找与给定经度/纬度最近的城市[关闭]

如何使用纬度和经度坐标从某个位置获取时区?

如何使用纬度和经度坐标从某个位置获取时区?

如何使用纬度和经度坐标从某个位置获取时区?

如何使用纬度和经度坐标从某个位置获取时区?

如何使用纬度和经度坐标从某个位置获取时区?