c# - 使用NodaTime按经纬度获取国家代码

标签 c# nodatime

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

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

我特别关注像 NodaTime 这样的离线解决方案,而不是使用网络服务。

最佳答案

NodaTime 中存在的纬度/经度数据来自 zone.tab奥尔森数据中的文件。这给出了区域用作引用的 map 上的位置。

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

考虑以下示例(请原谅我糟糕的作品)

Time Zone Example Art

两个方 block 代表不同的时区,其中每个方 block 中的黑点是引用位置,例如您在 zone.tab 中找到的内容。蓝点代表您要传递给输入查询的位置。很明显,这个位置在左边的橙色区域内,但如果我们只看离引用点最近的距离,它会解析到右边的绿色区域。

因此 zone.tab 数据(例如在 Noda Time 中找到的数据)不足以执行此操作。相反,我们需要根据定义区域边界的形状来描述区域,而不仅仅是一个点。幸运的是,Eric Muller 非常友好地提供了这些形状并将它们放在公共(public)领域。 You can find this data here .

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

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

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

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

更新

A consolidated list of time zone lookup methods can be found here.

关于c# - 使用NodaTime按经纬度获取国家代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911033/

相关文章:

c# - 保存到数据库需要太长时间

asp.net-core - NodaTime 与 NetCoreApp 1.0 兼容吗?

c# - Etc/UTC 到 Windows 时区的 noda 时间 iana 映射

timezone - 将时区 ID 存储在数据库中是否安全,或者它们可以更改吗?

c# - 如何使属性知道它所在的属性的名称?

c# - ASP MVC3 - 将选项标记为选中

c# - 通过复选框以编程方式为 MVC 4 中的用户分配角色

c# - ASP.NET Core 3 MVC 端点路由和路由本地化

c# - 如何使用NodaTime FakeClock进行时间旅行并测试不同的虚拟时间实例

nodatime - 使用 `Period.Between` 和减去两个本地日期之间的区别