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

问题描述 投票:0回答:4

我想编写一个应用程序,用户可以在其中指向地图上的任何位置(不仅是城市)并获取该位置的时区。

我应该使用什么数据结构(应用程序没有互联网连接)和算法?我在哪里可以获得所需的数据(我想要比将地图分成 24 个矩形更精确的数据)?

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

java timezone java-me
4个回答
13
投票

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

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

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

但是,考虑到某些边框的形状非常不规则,您需要相当大的数据结构才能保证准确性,具体取决于输入和/或显示的分辨率。


5
投票

有许多 Web 服务可以为您执行此操作(例如 GeoNames 有一个 很棒的 API)。但如果您没有 Internet 连接,那么您将无法直接在 Java ME 的标准库中找到这些内容。

不过,您可以做一些接近的事情:存储与每个时区对应的城市的坐标,然后进行 Voronoi 细分,以便获得距离每个城市最近的区域。然后,当您的用户单击特定地理区域时,您只需将该点映射到细分的正确部分,然后很快 - 您就得到了最近的城市,这反过来又确定了正确的时区。

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


3
投票

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

此外,如果您想使用时区信息来计算时间变化,事情会变得更加棘手,因为有关是否使用夏令时及其更改日期的决定只需提前 2 周通知即可更改。请参阅:http://www.timeanddate.com/news/time/argentina-dst-2009-2010.html

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


3
投票

好吧,如果精度不是要求,为什么还要费心数据结构呢? 编写一个函数,给定经度,返回距格林威治子午线的偏移量(以小时为单位)。

如果这对你不起作用,我会同意 Joel Neely 的答案。

© www.soinside.com 2019 - 2024. All rights reserved.