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

我想编写应用,用户可以在地图上指向任何地方(不仅是城市),并在该地点获取时区。

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

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

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

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

  1. 您可以独立于特定的坐标集显示DST参考信息,以及
  2. 当某个国家/地区更改夏令时开始和结束时间的规则时,您可以在一个地方进行更新。

但是,考虑到某些边框的高度不规则形状,根据输入和/或显示的分辨率,您需要一个相当大的数据结构来保证准确性。

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

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

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

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

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

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

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

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

Interesting Posts