坐标时区

时间:2009-11-09 22:25:53

标签: c# .net timezone esri shapefile

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我试图导出表格,但似乎无法将geometry类型导出到文本中..但是反正这并不难做..你需要google shapefile Manifold出品几年前,它映射了世界上所有的contries和他们的时区..然后你需要使用一些程序将数据导出到SQL Server 2008 ..我使用Manifold(记得使用企业版或以上)..然后我查询使用以下存储过程的数据:

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()来解决这个问题..

答案 3 :(得分:0)

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

如果有人有更好的解决方案,请随时发帖!

答案 4 :(得分:0)

你说:

  

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

是的 - 完全是exists here