这个问题在这里已经有答案了:

正如标题所暗示的,我需要根据一对坐标找到一个时区(或者可能只是 UTC 偏移量)。我一直在寻找不同的解决方案,并且有一些网络服务,但我需要能够离线访问应用程序。由于时区并不完全基于经度,这似乎并不那么容易......

我想查询包含世界上所有国家及其时区的 ESRI shapefile,但它似乎有点复杂。如果这应该是解决方案,您知道有任何 .NET 库提供此功能吗?

有帮助吗?

其他提示

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

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

所以我正在重做这个项目。我已经花了几天时间来创建一个更准确、分辨率更高的地图来处理。再过几天,应该就可以完成了。资源文件将在 20M 左右,除非我选择只为“愚蠢的区域”提供资源,并通过数学计算可以直接计算的世界 90%(世界上的大部分可以从经度通过数学推导)。不确定很多人会关心资源文件有 20M,但有些人可能会关心。无论如何,如果似乎有一些兴趣,我将尝试在此处发布运行它所需的代码以及公共代码站点之一的资源文件。如果看起来没有兴趣,我就不会打扰。

重申一下,您的应用程序中所需的代码只有几行,但资源文件很大(不缩小它,我的新文件正在运行 22M)。它也很快(第一次再现运行了 100M/秒)。它确实需要文件加载,并且需要一些时间。2M 版本没有明显的延迟,但 22M 版本可能有(还没有)。

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

我尝试导出表,但似乎无法导出 geometry 类型为文本..但无论如何,这并不难做到。您需要谷歌搜索几年前生成的形状文件 Manifold,它绘制了世界上所有国家及其时区的地图。然后您需要使用某些程序将该数据导出到 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

shape 文件存在问题,因为未绘制国家水域地图。我想也许使用 @g.STBuffer() 来解决这个问题..

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top