Domanda

    

Questa domanda ha già una risposta qui:

         

Come il titolo deduce ho bisogno di trovare un fuso orario (o forse solo l'offset UTC) sulla base di una coppia di coordinate. Sono stato alla ricerca di soluzioni diverse, e c'è un paio di servizi web là fuori, ma ho bisogno di essere in grado di accedere alla linea di applicazione. Mentre i fusi orari non è completamente a base di longitudine non sembra così facile ...

I se circa l'interrogazione di uno shapefile ESRI ho contenente tutti i paesi nel mondo e le loro fusi orari, ma sembra tipo di complesso. Se che dovrebbe essere la soluzione, ne sai tu di qualsiasi libreria NET fornisce questa funzionalità?

Altri suggerimenti

ho risolto questo con un'applicazione client. La tecnica era quella di fare una mappa cilindrica color-coded del mondo, ogni fuso orario ha un colore unico. Lat-Lons vengono convertiti immaginare coordinate e il colore del co-ordinata viene letta quindi con riferimenti incrociati per il fuso orario di quel colore.

Questa breve spiegazione non è esattamente quello che ho fatto, ma si ottiene l'idea attraverso. Io in realtà popolato un paio di dizionari e ha fatto di ricerca da loro. Il primo ha preso resa 2M di file di risorse per popolare (dopo che ho elaborato la mia mappa e lo ha trasformato in dati binari). L'errore massimo teorico (per le latitudini vicino all'equatore) avrebbe dovuto essere +/- circa 15 miglia. Purtroppo la precisione della mia mappa di partenza era più simile a +/- 100 miglia.

Così sto rifacendo il progetto. Sono stato in esso diversi giorni ormai la creazione di una mappa sia più accurata e più alto-rez di crunch. Un altro paio di giorni e dovrebbe essere fatto. Il file di risorse sarà di circa 20M meno che io scelga solo a risorsa "aree Pippo" e matematicamente computo il 90% della popolazione mondiale che può essere calcolato direttamente (la maggior parte del mondo può essere matematicamente derivato da longitudine). Non sono sicuro molti sarebbero cura che un file di risorse era 20M, ma alcuni potrebbero. In ogni caso, se sembra che ci sia un certo interesse, cercherò di inserire il codice necessario per farlo funzionare qui e il file di risorse uno uno dei siti di codice pubblico. Se non sembra esserci alcun interesse, non mi dilungherò.

Giusto per ribadire un po ', il codice necessario nella vostra app è solo poche righe, ma il file di risorse è grande (w / o contrazione, il mio nuovo è in esecuzione 22M). E 'anche veloce (la prima resa corse 100M / sec). Si richiede un carico di file e che prende un po 'di tempo. La versione 2M avuto alcun ritardo percepibile ma 22M potrebbe (non c'è ancora).

Controllare il href="http://www.twinsun.com/tz/tz-link.htm" rel="nofollow noreferrer"> tz database di . So che associa nomi ai fusi orari (come città, paesi, EST, ecc). Ma credo che ci sia un'estensione per le coordinate da qualche parte.

Ho cercato di esportare la tabella, ma non sembra possibile esportare tipi geometry al testo .. tuttavia non era così difficile da fare comunque .. È necessario google il collettore shapefile prodotta a pochi anni fa che mappa tutti i contries nel mondo e le loro fusi orari .. Poi è necessario esportare i dati per SQL Server 2008 utilizzando qualche programma .. ho usato Manifold (ricordarsi di usare Enterprise Edition o superiore) .. Poi interrogo i dati utilizzando la stored procedure seguente:

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

C'è un problema nel shapefile perché le acque nazionali non è mappato. Ho pensato di magari usando @ g.STBuffer () per affrontare questo problema ..

La soluzione era quella di esportare uno shapefile ESRI a SQL Server 2008 utilizzando i nuovi tipi di dati spaziali.

Se qualcuno ha una soluzione migliore non esitate a postare!

scroll top