2009-06-29 13 views
11

Esiste un modo per stimare l'offset da GMT (o fuso orario) da una latitudine/longitudine? Ho visto i geonames, ma questo avrebbe dovuto funzionare a lungo termine e non vogliamo davvero affidarci a un servizio web. Sarebbe stato usato solo per determinare se visualizzare "oggi" o "stasera" quando si forniscono informazioni a vari utenti, quindi non avrebbe bisogno di essere troppo accurato (un'ora o due non sarebbe male).stima approssimativa dell'offset orario da GMT da latitudine longitudine

risposta

23
offset = direction * longitude * 24/360 

cui direzione è 1 per est, -1 per ovest e la longitudine è a (-180.180)

+0

Questo è abbastanza bello, non pensavo che sarebbe stato così semplice, ma finora sembra piuttosto accurato. Grazie. – ravun

+1

@ravun, questo è corretto per defiizione dato che a) la terra ha 360 gradi di longitudine, e b) ruota attraverso quella 360 gradi in 24 ore. (-: –

+0

È * ragionevolmente * corretto dato che i confini dei fusi orari sono di solito messi ai confini nazionali, altrimenti dovrei impostare il mio orologio ogni giorno quando vado al lavoro, e di nuovo quando torno a casa :-) Inoltre, l'ora legale il tempo dipende dalla legislazione locale. Ma per la domanda di oggi/stanotte, dovrebbe bastare. – balpha

1

Basando il fuso orario da solo la longitudine è selvaggiamente imprecisa al di fuori delle acque internazionali. Visualizza la mappa su questa pagina:

http://askgeo.com/database/TimeZone

Le strisce verticali colorate nelle profondità dell'oceano sono i cosiddetti fusi orari naturali derivati ​​da longitudine da solo, ed i colori della terra sono i fusi orari effettivi per la leggi governanti. Puoi vedere che non si allineano molto bene.

In realtà mi sono imbattuto in questo problema mentre lavoravo su un progetto diverso e ho svolto ricerche e sviluppi sostanziali su di esso. In primo luogo la mia ricerca:

  • In primo luogo, i fusi orari non sono in genere codificato da solo un offset da GMT (aka UTC). Ciò non tiene in considerazione l'ora legale e le modifiche nei fusi orari nel corso degli anni. Invece, gli ID di fuso orario vengono usati per designare un'area geografica in cui il tempo di orologio ufficiale è stato lo stesso in tutta l'area per un dato periodo di tempo (ad esempio, dal 1970). Il sistema più importante di tali ID è il "Olson time zone ID" (questi ID e le loro regole di offset sono noti come "database tz"), che viene utilizzato da Linux e da altri sistemi operativi Unix. La maggior parte dei linguaggi di programmazione e dei sistemi operativi dispone del supporto nativo o di terze parti per gli ID dei fusi orari Olson.

In termini di soluzioni esistenti per convertire latitudine e longitudine di fuso orario:

  • GeoNames.org ha un vasto database di posizioni dei punti (i centri delle città, aeroporti, edifici pubblici, ecc) , ognuno dei quali è annotato con un gruppo di metadati utili, incluso l'ID del fuso orario di Olson. E hanno una buona API per permetterti di accedere a questi tramite il web. Il problema è che se, a meno che il punto che si sta interrogando sia proprio sopra un record nel proprio database, si potrebbe ottenere un risultato che si trova sull'altro lato di un bordo del fuso orario, oppure si potrebbe non ottenere alcuna risposta se la query è lontano dal loro punto più vicino. Il servizio web è anche dolorosamente lento e limita il numero di query che puoi fare in un giorno a un numero relativamente piccolo.

  • Earth Tools (http://www.earthtools.org/webservices.htm) ha anche un servizio per questo ed è molto più veloce di GeoNames, ma restituisce solo un offset da GMT, non un fuso orario ID e non gestisce correttamente l'ora legale per la maggior parte del mondo. Inoltre, sembra non essere mantenuto, quindi non sono sicuro che i dati siano più precisi (i fusi orari cambiano nel tempo).

Dopo aver esaminato le opzioni e la ricerca di altre possibilità senza successo, ho deciso di costruire la mia soluzione, e hanno rilasciato presso:

http://askgeo.com

AskGeo si basa su una mappa dei fusi orari del mondo, quindi restituisce un fuso orario valido per ogni latitudine e longitudine valide. Restituisce l'ID del fuso orario standard di Olson (ad es. "America/Los_Angeles") utilizzato su Linux e sulla maggior parte degli altri sistemi operativi e framework di programmazione. Restituisce anche l'offset corrente, tenendo pienamente conto dell'ora legale.

È estremamente facile da usare e l'utilizzo è documentato sulla pagina principale del sito. L'API supporta le query batch, quindi se hai bisogno di fare molte ricerche, usa l'interfaccia batch piuttosto che impantanare i nostri server con richieste seriali. Anche le query di massa sono molto più veloci, quindi tutti vincono.

Quando l'abbiamo lanciato, lo abbiamo creato su Google App Engine (GAE) e reso gratuito per tutti gli utenti. Ciò è stato possibile perché i prezzi di GAE erano così bassi in quel momento. Da allora, il carico del nostro server è aumentato notevolmente e i prezzi di GAE sono aumentati. Entrambi i fattori combinati ci hanno portato a passare ad Amazon Web Services per l'hosting e iniziare a fare pagare per l'uso commerciale, mantenendo il servizio gratuito per i progetti open source non commerciali e non commerciali e per i ricercatori. Per gli utenti commerciali, forniamo 1000 query gratuite per consentire ai potenziali clienti di valutare l'API per assicurarsi che soddisfi le loro esigenze. Vedi il sito web per prezzi e termini.

La libreria sottostante era scritta in Java e, a grande richiesta, abbiamo anche rilasciato la libreria con una licenza commerciale. La documentazione completa della biblioteca e i dettagli dei prezzi sono sul sito web.

Spero che questo sia utile. Sicuramente è stato utile per il progetto su cui stavo lavorando.

Problemi correlati