2009-11-09 15 views
6

Come il titolo deduce ho bisogno di trovare un fuso orario (o forse solo l'offset UTC) basato su una coppia di coordinate. Ho cercato soluzioni diverse e ci sono un paio di servizi web, ma devo essere in grado di accedere all'applicazione offline. Dato che i fusi orari non sono completamente basati sulla longitudine, non sembra così facile ...TimeZone di Coordinate

Ho pensato di interrogare uno shapefile ESRI che contiene tutti i paesi del mondo e i loro fusi orari, ma sembra una specie di complesso. Se questa dovrebbe essere la soluzione, conosci qualche libreria .NET che fornisce questa funzionalità?

+1

Vedere anche, [questa community wiki] (http://stackoverflow.com/q/16086962/634824) –

risposta

0

Lei ha detto:

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

Sì, esattamente quello exists here.

2

Controllare il database tz. So che associa nomi a fusi orari (come città, paesi, EST, ecc.). Ma credo che ci sia un'estensione per le coordinate da qualche parte.

+0

Ho provato il database tz ma non sembra fornire la forma effettiva dei fusi orari .. Lo shapefile che ho è da http://www.manifold.net/download/freemaps.html anche se il link non funziona più. Qualcuno ha esperienza nell'individuare (interrogare) oggetti in uno shapefile con le coordinate? – Morten

0

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

Se qualcuno ha una soluzione migliore non esitate a postare!

0

Ho provato ad esportare la tabella ma non sembra possibile esportare i tipi geometry in testo .. tuttavia non è stato difficile farlo comunque .. Devi google lo shapefile Manifold prodotto da alcuni anni fa che mappa tutti i paesi del mondo e i loro fusi orari .. Quindi devi esportare quei dati in SQL Server 2008 usando un programma .. Ho usato Manifold (ricordati di usare Enterprise Edition o superiore). Poi interrogherò i dati usando la seguente stored procedure:

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 

C'è un problema nello shapefile perché le acque nazionali non sono mappate. Ho pensato di utilizzare forse g.STBuffer() per risolvere questo problema.

6

Ho risolto questo problema con un'applicazione client. La tecnica era quella di creare una mappa cilindrica con codice colore del mondo, ogni fuso orario ha un colore unico. Le Lat-Lons vengono convertite in coordinate dell'immagine e il colore della coordinata viene letto, quindi confrontato con il fuso orario di quel colore.

Questa breve spiegazione non è esattamente ciò che ho fatto, ma ci dà un'idea. In realtà ho compilato un paio di dizionari e ho cercato da loro. La prima versione ha richiesto 2 milioni di file di risorse da compilare (dopo aver elaborato la mia mappa e trasformata in dati binari). L'errore massimo teorico (per le latitudini vicino all'equatore) avrebbe dovuto essere di circa 15 miglia. Sfortunatamente la precisione della mia mappa iniziale era più simile a +/- 100 miglia.

Quindi sto rifacendo il progetto. Sono stato impegnato per diversi giorni a creare una mappa più accurata e più avanzata di rez. Ancora un paio di giorni e dovrebbe essere fatto. Il file delle risorse sarà di circa 20 milioni a meno che non scelga solo di utilizzare le "aree sciocche" e calcolare matematicamente il 90% del mondo che può essere calcolato direttamente (la maggior parte del mondo può essere ricavata matematicamente dalla longitudine). Non sono sicuro che molti si preoccuperebbero che un file di risorse fosse 20M, ma alcuni potrebbero. Ad ogni modo, se sembra esserci qualche interesse, proverò a postare il codice necessario per eseguirlo qui e il file di risorse uno dei siti di codice pubblico. Se non sembra esserci alcun interesse, non mi preoccuperò.

Solo per ripetere un po ', il codice necessario nella tua app è solo poche righe, ma il file di risorse è grande (senza ridurlo, il mio nuovo è in esecuzione 22M). È anche veloce (la prima resa ha corso 100M/sec). Richiede un caricamento di file e richiede un po 'di tempo. La versione 2M non ha avuto ritardi evidenti ma 22M potrebbero (non ancora arrivati).

+1

Grazie, sembra decisamente interessante. Ti sarei grato se potessi condividere con noi la tua soluzione. – Morten