Pergunta

Como os infere título eu preciso encontrar um fuso horário (ou talvez apenas o deslocamento UTC) com base em um par de coordenadas. Eu estive procurando por soluções diferentes, e há um par de serviços web lá fora, mas eu preciso ser capaz de acessar o aplicativo offline. Como os fusos horários não está completamente baseadas em longitude não parece tão fácil ...

Eu pensei sobre como consultar um shapefile ESRI Tenho contendo todos os países no mundo e seus fusos horários, mas parece tipo de complexo. Se isso deve ser a solução, você sabe de qualquer biblioteca .NET fornecendo essa funcionalidade?

Outras dicas

Eu ter resolvido isso com um aplicativo cliente. A técnica foi para fazer um mapa cilíndrico codificado por cores do mundo, cada zona de tempo tem uma cor única. Lat-Lons são convertidas em imagem coordenadas e a cor do co-ordenada é lido, em seguida, com referências cruzadas para o fuso horário do que a cor.

Isso curta explicação não é exatamente o que eu fiz, mas ele começa a idéia do outro lado. Na verdade, eu povoada alguns dicionários e fez pesquisa deles. A primeira versão levou 2M de arquivo de recurso para preencher (após I processados ??meu mapa e transformou-o em dados binários). O erro máximo teórico (para latitudes próximas ao equador) deveria ter sido +/- cerca de 15 milhas. Infelizmente a precisão do meu mapa de partida foi mais como +/- 100 milhas.

Então, eu estou refazendo o projeto. Eu fui para ele vários dias agora criar um mapa-rez superior, tanto mais preciso e para triturar. Mais alguns dias e isso deve ser feito. O arquivo de recurso será de cerca de 20M a menos que eu escolher apenas para recurso "áreas patetas" e matematicamente calcular a 90% do mundo que pode ser calculado diretamente (a maior parte do mundo pode ser matematicamente derivada de longitude). Não tenho certeza muitos se importam que um arquivo de recurso foi 20M mas alguns podem. De qualquer forma, se parece haver algum interesse, vou tentar postar o código necessário para executá-lo aqui e o arquivo de recursos um um dos sites de código públicas. Se parece haver nenhum interesse, não vou incomodar.

Apenas para reiterar um pouco, o código necessário em seu aplicativo é apenas algumas linhas, mas o arquivo de recursos é grande (w / o encolhê-lo, o meu novo está sendo executado 22M). Ele também é rápido (a primeira versão correu 100M / seg). Ele requer uma carga de arquivo e que leva um pouco de tempo. A versão 2M teve nenhum atraso perceptível, mas poder 22M (não existe ainda).

Verifique a tz banco de dados . Eu sei que associa nomes a fusos horários (como cidade, países, EST, etc). Mas eu acredito que há uma extensão para coordenadas em algum lugar.

Eu tentei exportar a tabela, mas isso não parece possível tipos de exportação geometry ao texto .. no entanto, não foi tão difícil de fazer qualquer forma .. Você precisa google o shapefile Manifold produzido alguns anos atrás que mapeia todos os contries no mundo e os seus fusos horários .. em seguida, você precisa exportar os dados para o SQL Server 2008 usando algum programa .. Eu costumava Manifold (lembre-se de usar Enterprise Edition ou superior) .. Então eu consultar os dados usando o procedimento armazenado seguinte:

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

Há um problema no shapefile porque águas nacionais não está mapeada. I embora, talvez usando @ g.STBuffer () para resolver este problema ..

A solução foi para exportar um shapefile ESRI para o SQL Server 2008 usando os novos tipos de dados espaciais.

Se alguém tiver uma solução melhor sensação livre para postar!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top