从地理坐标获取时区的算法

时间:2009-12-06 13:29:01

标签: java algorithm language-agnostic java-me timezone

我想写一个应用,用户可以在地图上指出任何地方(不仅是城市),并在那个地方获得时区。

我应该使用哪种数据结构(应用程序不具备互联网连接)和算法?在哪里我可以获得所需的数据(我不会更精确,然后将地图分成24个矩形)?

我将在Java ME中编写我的应用程序。

4 个答案:

答案 0 :(得分:13)

鉴于时区是基于政治实体而不是简单的物理纬度/经度计算,我将创建一个数据结构,将多边形从纬度/经度坐标映射到政治实体(国家和省/州),然后有一个将政治实体和当前日期映射到时区的单独结构。

这样你不仅可以避免冗余,还可以:

  1. 您可以独立于一组特定坐标显示DST参考信息,
  2. 当某个国家/地区更改夏令时开始和结束时间的规则时,您可以在一个地方进行更新。
  3. 但是,考虑到某些边框的高度不规则形状,根据输入和/或显示的分辨率,您需要相当大的数据结构才能获得准确性。

答案 1 :(得分:5)

有许多网络服务可以为您执行此操作(例如 GeoNames great API)。但是如果你没有互联网连接,那么你不会直接在Java ME的标准库中找到它。

您可以做一些接近的事情:存储与每个时区对应的城市的坐标,然后执行 Voronoi tessellation ,以便您拥有最接近每个城市的区域。然后,当您的用户点击某个特定地理区域时,您只需将该点映射到曲面细分的右侧部分,然后 - 您就拥有了最近的城市,而这个城市又决定了正确的时区。

更复杂的方法是可行的,但它们也需要更大的内存结构,如果您运行Java ME,我认为这是一个约束。这是空间和速度之间的良好折衷。

答案 2 :(得分:3)

那么,如果不要求准确性,为什么还要为数据结构烦恼呢?编写一个函数,给定经度,返回格林威治子午线的偏移量,以小时为单位。

如果这对你不起作用,我会选择Joel Neely的回答。

答案 3 :(得分:3)

Joel Neely的回答很好,但请注意,出于政治原因,这是一个非常棘手的问题。因此,对于像克什米尔或西藏这样的争议地区,你可能会因为你做出的决定而冒犯别人。

此外,如果您想使用时区信息来计算时间变化,那么它会变得更加棘手,因为关于是否使用夏令时的决定以及更改的日期可能会在2周后发生变化。请参阅:http://www.timeanddate.com/news/time/argentina-dst-2009-2010.html

如果您有兴趣,可以在http://www.worldtimeserver.com/time_zone_guide/购买多边形信息。免责声明 - 我没有购买这些信息,所以不知道它有多好。