Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

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. A medida que las zonas horarias no está completamente basado en la longitud no parece tan fácil ...

I sin embargo sobre cómo consultar 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 eso debería ser la solución, sabes de cualquier biblioteca de .NET que proporciona esta funcionalidad?

Otros consejos

He resuelto esto 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.

Eso corta explicación no es exactamente lo que hice, pero tiene la idea de diámetro. De hecho, me pobladas un par de diccionarios e hice de búsqueda 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 +/- cerca de 15 millas. Desafortunadamente exactitud de mi mapa de partida era más como +/- 100 millas.

Así que estoy haciendo de nuevo el proyecto. He estado en ella varios días la creación de un mapa a la vez más precisa y más alto-rez para crujir. Un par de días más y se debe hacer. El archivo de recursos será de alrededor de 20M a menos que sólo podrán optar a las "áreas de recursos tontas" y matemáticamente calcular el 90% del mundo que se puede calcular directamente (la mayor parte se puede derivar matemáticamente del mundo de longitud). No es seguro que muchos le importaría que un archivo de recursos era 20M pero algunas fuerzas. En cualquier caso, si parece que hay cierto interés, voy a tratar de publicar el código necesario para ejecutarlo aquí y el archivo de recursos uno uno de los sitios de códigos públicos. Si no parece haber ningún interés, no me molestaré.

Sólo para reiterar un poco, el código necesario en su aplicación está a sólo unas pocas líneas, pero el archivo de recursos es grande (w / o reduciéndolo, mi nuevo se está ejecutando 22M). También es rápido (la primera versión corrió 100M / seg). Se requiere una carga de archivos y que lleva un poco de tiempo. La versión 2 M tenido un retraso significativo, pero podría 22M (no existe aún).

He tratado de exportar la tabla pero no parece posible exportar tipos geometry al texto .. sin embargo, no era tan difícil de hacer de todos modos .. Es necesario google el archivo de forma colector producido hace unos años 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 procedimiento almacenado siguiente:

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

Hay un problema en el archivo de forma debido a las aguas nacionales, no es asignada. I, aunque tal vez de usar @ g.STBuffer () para abordar este problema ..

La solución era 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 enviar!

scroll top