关于c#:Coordinate的TimeZone

TimeZone by Coordinate

由于标题推断我需要根据一对坐标找到时区(或者可能只是UTC偏移)。 我一直在寻找不同的解决方案,并且有一些Web服务,但我需要能够脱机访问应用程序。 由于时区并非完全基于经度,因此看起来并不容易......

我虽然要查询一个ESRI shapefile,但我已经包含了世界上所有的国家和它们的时区,但它看起来有点复杂。 如果这应该是解决方案,您知道任何提供此功能的.NET库吗?


我用客户端应用程序解决了这个问题。该技术是制作一个颜色编码的圆柱形世界地图,每个时区都有独特的颜色。 Lat-Lons被转换为图像坐标,并且读取坐标的颜色,然后交叉参考该颜色的时区。

这个简短的解释并不完全是我所做的,但它得到了这个想法。我实际上填充了一些词典并从中查找。第一次渲染需要2M的资源文件来填充(在我处理完地图并将其转换为二进制数据之后)。理论上的最大误差(对于赤道附近的纬度)应该是+/-大约15英里。不幸的是,我的起始地图的准确度更像是+/- 100英里。

所以我正在重做这个项目。我已经进入了几天,现在创建一个更准确和更高rez的地图来紧缩。再多几天,它应该完成。资源文件将大约为20M,除非我选择仅资源"愚蠢的区域"并在数学上计算可以直接计算的世界的90%(世界上大部分可以从数学上得出经度)。不确定很多人会关心资源文件是20M但有些可能。无论如何,如果似乎有一些兴趣,我会尝试发布在这里运行它所需的代码和资源文件中的一个公共代码站点。如果似乎没有兴趣,我不会打扰。

只是为了重新迭代一下,你的应用程序所需的代码只有几行,但是资源文件很大(不缩小它,我的新程序运行22M)。它也很快(第一次演出跑100M /秒)。它需要一个文件加载,这需要一点时间。 2M版本没有明显的延迟,但22M可能(还没有)。


检查tz数据库。我知道它将名称与时区(如城市,国家,美国东部时间等)联系起来。但我相信某处的坐标有一个扩展。


我试图导出表但是似乎不可能将geometry类型导出到文本..但是反正它并不难做..你需要google几年前生成的shapefile Manifold映射世界上所有的contries及其时区..然后你需要使用一些程序将该数据导出到SQL Server 2008 ..我使用Manifold(记得使用Enterprise Edition或更高版本)..然后我使用以下查询数据存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
USE [MyDb]
GO
/****** Object:  StoredProcedure [dbo].[GetTimeZone]    Script Date: 11/18/2009 21:23:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetTimeZone]
    @Latitude float,
    @Longitude float
AS
    /* SET NOCOUNT ON */

DECLARE @g geometry

/* Validation */
IF @Latitude > 90 OR @Latitude < -90 OR @Longitude > 180 OR @Longitude < -180
    RAISERROR('Latitude or longitude out of range', 16, 1)

IF @Latitude IS NULL OR @Longitude IS NULL
    RAISERROR('Latitude or longitude cannot be null', 16, 1)

SET @g = geometry::Point(@Longitude, @Latitude, 4326);

IF EXISTS(SELECT * From TimeZones WHERE Shape.STContains(@g) = 1)
    /* Point exists on map, get the info */
    SELECT Name, LocalSumme, Offset, AreaI FROM TimeZones WHERE Shape.STContains(@g) = 1
ELSE
    /* Point is an international water */
    IF(@Longitude >= 0)
        SELECT NULL AS Name, NULL AS LocalSumme, FLOOR((@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI
    ELSE
        SELECT NULL AS Name, NULL AS LocalSumme, -FLOOR((-@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI

shapefile中存在问题,因为未映射国家水域。我可能会使用@ g.STBuffer()来解决这个问题。


你说:

I though about querying an ESRI shapefile I've got containing all the countries in world and their timezones, but it seems kind of complex. If that should be the solution, do you know of any .NET library providing this functionality?

是的 - 这就是存在的。


解决方案是使用新的空间数据类型将ESRI shapefile导出到SQL Server 2008。

如果有人有更好的解决方案随时发布!