2009-11-09 34 views
6

Como el título infiere que necesito encontrar una zona horaria (o tal vez sólo el desplazamiento de UTC) en base a un par de coordenadas. He estado buscando diferentes soluciones, y hay un par de servicios web por ahí, pero tengo que ser capaz de acceder a la aplicación sin conexión. Como las zonas horarias no se basan completamente en la longitud, no parece tan fácil ...zona horaria por Coordinar

Pensé en consultar un archivo de formas de ESRI que contenía todos los países del mundo y sus zonas horarias, pero parece una especie de complejo. Si esa es la solución, ¿sabe de alguna biblioteca .NET que proporcione esta funcionalidad?

+1

Ver también, [esta comunidad wiki] (http://stackoverflow.com/q/16086962/634824) –

Respuesta

0

Usted dijo:

pensé en la consulta de un archivo de forma ESRI Tengo que contiene todos los países en el mundo y sus zonas horarias, pero parece tipo de complejo. Si esa es la solución, ¿sabe de alguna biblioteca .NET que proporcione esta funcionalidad?

Sí - exactamente eso exists here.

2

Compruebe la base de datos tz. Sé que asocia nombres a zonas horarias (como ciudad, países, EST, etc.). Pero creo que hay una extensión para las coordenadas en alguna parte.

+0

He intentado la base de datos tz, pero no parece proporcionar la forma real de las zonas horarias .. El shapefile que tengo es de http://www.manifold.net/download/freemaps.html aunque el enlace ya no funciona. ¿Alguien tiene experiencia con la identificación (consulta) de objetos en un shapefile por coordenadas? – Morten

0

La solución fue exportar un archivo de forma ESRI a SQL Server 2008 utilizando los nuevos tipos de datos espaciales.

Si alguien tiene una mejor solución, ¡no dude en publicarla!

0

He intentado exportar la tabla, pero no parece posible exportar geometry tipos al texto ... sin embargo, no fue tan difícil de hacer de todas formas .. Necesita googlear el archivo de formas que Manifold produjo hace unos años hace que mapea todas las contries en el mundo y sus zonas horarias .. Luego hay que exportar los datos a SQL Server 2008 mediante algún programa .. solía Múltiple (recuerde utilizar Enterprise Edition o superior) .. Entonces consultar los datos utilizando el siguiente procedimiento almacenado:

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 

Hay un problema en el archivo de forma debido a las aguas nacionales no está asignada. Pensé en quizás usar @g.STBuffer() para solucionar este problema.

6

Lo he resuelto con una aplicación cliente. La técnica era hacer un mapa cilíndrico con código de color del mundo, cada zona de tiempo tiene un color único. Lat-Lons se convierten a la imagen coordina y el color de la coordenada se lee a continuación, con referencias cruzadas a la zona horaria de ese color.

Esa breve explicación no es exactamente lo que hice, pero transmite la idea. En realidad llené un par de diccionarios y busqué de ellos. La primera versión se 2M de archivo de recursos para poblar (después Procesé mi mapa y la convirtieron en datos binarios). El error máximo teórico (para latitudes cercanas al ecuador) debería haber sido +/- aproximadamente 15 millas. Lamentablemente, la precisión de mi mapa inicial era más de +/- 100 millas.

Así que estoy rehaciendo el proyecto. Llevo varios días creando un mapa más exacto y de mayor valor de reescritura. Un par de días más y debería hacerse. El archivo de recursos será de alrededor de 20M a menos que elija solo el recurso de las "áreas tontas" y matemáticamente calcule el 90% del mundo que se puede calcular directamente (la mayoría de los del mundo pueden derivarse matemáticamente de la longitud). No estoy seguro de que a muchos les importe que un archivo de recursos sea 20M pero que algunos lo hagan. En cualquier caso, si parece que hay interés, intentaré publicar el código necesario para ejecutarlo aquí y el archivo de recursos uno de los sitios de código público. Si parece que no hay interés, no me molestaré.

Solo para reiterar un poco, el código necesario en su aplicación es de solo unas pocas líneas, pero el archivo de recursos es grande (sin reducirlo, mi nuevo está ejecutando 22M). También es rápido (la primera versión ejecutó 100M/seg). SOLICITA una carga de archivos y eso lleva un poco de tiempo. La versión de 2M no tuvo un retraso notable, pero 22M podría (todavía no).

+1

Gracias, definitivamente parece interesante. Agradecería que nos pudieras compartir tu solución. – Morten

Cuestiones relacionadas