2009-11-09 45 views
6

由于标题推测我需要找到一个时区(或者可能只是UTC偏移)基于一对坐标。我一直在寻找不同的解决方案,并且有一些Web服务,但我需要能够离线访问应用程序。由于时区不是完全基于经度,它似乎并不容易...TimeZone坐标

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

+1

另请参阅[本社区wiki](http://stackoverflow.com/q/16086962/634824) –

回答

0

你说:

我虽然有关查询我有包含在世界和他们的时区所有国家的ESRI shape文件,但似乎有种复杂的。如果这应该是解决方案,你知道任何提供这种功能的.NET库吗?

是的 - 正是那exists here

2

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

+0

我试过了tz数据库,但它似乎没有提供时区的实际形状。 。我得到的shapefile来自http://www.manifold.net/download/freemaps.html,即使链接不工作了。有没有人有经验通过坐标识别(查询)shapefile中的对象? – Morten

0

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

如果有人有更好的解决方案随时张贴!

0

我试图导出表格,但似乎不可能将geometry类型导出到文本中..但是它不是那么难做到的。无论如何你都不需要这么做..你需要谷歌形状文件Manifold制作了几年之前它映射世界上的所有国家和他们的时区..然后,你需要导出数据到SQL Server 2008使用一些程序..我用歧管(记得使用企业版或以上)..然后我查询数据使用以下存储过程:

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(([email protected] + 7.5)/15) AS Offset, NULL AS AreaI 

有一个在shape文件的一个问题,因为全国海域未映射。我虽然也许使用@ g.STBuffer()来解决这个问题..

6

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

这段简短的解释并不完全是我所做的,但是它让人想到了。我居然填了一些字典,并从他们那里查找。第一次翻版花费了2M的资源文件(在我处理了我的地图并将其转换为二进制数据后)。理论上的最大误差(赤道附近的纬度)应该+/- +/- 15英里。不幸的是,我的起始地图的准确性更像+/- 100英里。

所以我正在重做该项目。我已经进入了几天,现在创建了一个更准确和更高的地图紧缩。再过几天,就应该完成了。资源文件将在20M左右,除非我只选择资源“愚蠢区域”,并以数学方式计算可直接计算的世界90%(世界上大部分数据可以从经度数学推导)。不知道许多人会关心一个资源文件是20M,但有些可能。无论如何,如果似乎有一些兴趣,我会尝试发布必要的代码在这里运行它和资源文件的公共代码网站之一。如果似乎没有兴趣,我不会打扰。

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

+1

谢谢,它绝对听起来很有趣。如果您能向我们分享您的解决方案,我将不胜感激。 – Morten