我想编写一个应用程序,用户可以在其中指向地图上的任何位置(不仅是城市)并获取该位置的时区。
我应该使用什么数据结构(应用程序没有互联网连接)和算法?我在哪里可以获得所需的数据(我想要比将地图分成 24 个矩形更精确的数据)?
我将用 Java ME 编写我的应用程序。
鉴于时区基于政治实体而不是简单的物理纬度/经度计算,我将创建一个数据结构,将纬度/经度坐标上的多边形映射到政治实体(国家和省/州),然后有一个单独的结构将政治实体和当前日期映射到时区偏移中。
这样您不仅可以避免冗余,还可以:
但是,考虑到某些边框的形状非常不规则,您需要相当大的数据结构才能保证准确性,具体取决于输入和/或显示的分辨率。
有许多 Web 服务可以为您执行此操作(例如 GeoNames 有一个 很棒的 API)。但如果您没有 Internet 连接,那么您将无法直接在 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 的答案。