6

由于 NodaTime 在 olson 数据库中已经有纬度/经度和国家/地区代码数据,我想知道我们是否可以指定任何纬度/经度(比如 Windows 商店应用程序中 GeoLocator.GetGeopositionAsync 返回的任何纬度/经度)并确定时区和国家代码从中?

与此类似的var zone = session.GetZoneForLocation(latitude, longitude);内容:来自https://github.com/mj1856/Raven.TimeZones

我专门研究像 NodaTime 这样的离线解决方案,而不是使用 Web 服务。

4

1 回答 1

7

NodaTime 中存在的 lat/lon 数据来自 Olson 数据中的zone.tab文件。这给出了该区域用作参考的地图上点的位置。

如果这是您唯一可用的数据,那么对于任意位置,您能做的最好的事情就是找到最近的点。在某些情况下,这将为您提供准确的时区,但在许多情况下不会。

考虑下面的例子(请原谅我糟糕的艺术作品)

                            时区示例艺术

这两个方块代表不同的时区,其中每个方块中的黑点是参考位置,例如您可以在 zone.tab 中找到的位置。蓝点表示您要传递给输入查询的位置。显然,这个位置在左侧的橙色区域内,但如果我们只看离参考点最近的距离,它将解析为右侧的绿色区域。

所以 zone.tab 数据(例如在 Noda Time 中找到的)不足以执行此操作。相反,我们需要根据定义区域边界的形状来描述区域,而不仅仅是单个点。幸运的是,Eric Muller 非常好心地提供了这些形状并将它们置于公共领域。您可以在此处找到此数据

您找到的我的Raven.TimeZones项目正是这样做的。它从 Eric 的 shapefile 导入数据,并使用 RavenDB 的地理空间特征来索引和查询该数据。

您当然可以直接使用我的实现,或者从中复制您需要的任何部分。它完全脱机工作,不进行网络服务调用。但它确实需要 RavenDB 的许可才能运行。

如果您无法使用 RavenDB,您可以使用任何其他支持复杂空间查询的数据库采取类似的方法。

特别是 - RavenDB 目前无法在纯 WinRT 环境中运行,因此您将无法直接在 Windows 应用商店应用程序中使用它。我不确定是否有任何可以执行地理空间查询的 WinRT 嵌入式数据库。如果有人知道的话,请告诉我们。

更新

可以在此处找到时区查找方法的综合列表。

于 2013-10-02T18:51:58.587 回答