2009-11-09 5 views
6

Comme le titre l'indique, j'ai besoin de trouver un fuseau horaire (ou peut-être juste le décalage UTC) basé sur une paire de coordonnées. J'ai cherché différentes solutions, et il y a quelques services Web là-bas mais je dois pouvoir accéder à l'application hors ligne. Comme les fuseaux horaires ne sont pas complètement basés sur la longitude cela ne semble pas si facile ...TimeZone par Coordonnée

Je pensais à propos d'un fichier de formes ESRI contenant tous les pays du monde et leurs fuseaux horaires, mais il semble que complexe. Si cela devrait être la solution, connaissez-vous une bibliothèque .NET offrant cette fonctionnalité?

+1

Voir aussi, [ce wiki communautaire] (http://stackoverflow.com/q/16086962/634824) –

Répondre

0

Vous avez dit:

Je pensais au sujet d'une interrogation shapefile Esri J'ai contenant tous les pays dans le monde et leurs fuseaux horaires, mais il semble un peu complexe. Si cela devrait être la solution, connaissez-vous une bibliothèque .NET offrant cette fonctionnalité?

Oui - exactement cela exists here.

2

Vérifiez la base de données tz. Je sais qu'il associe des noms aux fuseaux horaires (comme la ville, les pays, EST, etc.). Mais je crois qu'il y a une extension pour les coordonnées quelque part.

+0

J'ai essayé la base de données tz mais elle ne semble pas fournir la forme réelle des fuseaux horaires. Le shapefile que j'ai provient de http://www.manifold.net/download/freemaps.html même si le lien ne marche plus. Est-ce que quelqu'un a de l'expérience avec l'identification (interrogation) des objets dans un shapefile par des coordonnées? – Morten

0

La solution consistait à exporter un fichier de formes ESRI vers SQL Server 2008 à l'aide des nouveaux types de données spatiaux.

Si quelqu'un a une meilleure solution, n'hésitez pas à poster!

0

J'ai essayé d'exporter la table mais il ne semble pas possible d'exporter les types geometry en texte .. mais ce n'était pas si difficile à faire de toute façon .. Vous devez google le fichier de formes produit quelques années Il faut donc exporter ces données vers SQL Server 2008 en utilisant un programme. J'ai utilisé Manifold (n'oubliez pas d'utiliser Enterprise Edition ou plus). Ensuite, je interroge les données en utilisant la procédure stockée suivante:

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 

Il existe un problème dans le fichier de formes car les eaux nationales ne sont pas mappées. Je pensais à peut-être utiliser @ g.STBuffer() pour résoudre ce problème ..

6

J'ai résolu cela avec une application cliente. La technique consistait à faire une carte cylindrique à code couleur du monde, chaque fuseau horaire ayant une couleur unique. Les Lat-Lons sont convertis en coordonnées d'image et la couleur de la coordonnée est lue puis référencée au fuseau horaire de cette couleur. Cette brève explication n'est pas exactement ce que j'ai fait, mais elle fait passer l'idée à travers. J'ai en fait peuplé quelques dictionnaires et je les ai consultés. Le premier rendu a pris 2M de fichier de ressources à remplir (après avoir traité ma carte et l'avoir transformée en données binaires). L'erreur maximale théorique (pour les latitudes proches de l'équateur) aurait dû être de +/- environ 15 milles. Malheureusement, la précision de ma carte de départ était plutôt de +/- 100 miles.

Donc je refais le projet. J'y ai été plusieurs jours maintenant en train de créer une carte à la fois plus précise et plus haute. Encore quelques jours et ça devrait être fait. Le fichier de ressources sera autour de 20M à moins que je choisisse seulement de fournir les "zones loufoques" et de calculer mathématiquement les 90% du monde qui peuvent être calculés directement (la plupart des mondes peuvent être mathématiquement dérivés de la longitude). Pas sûr que beaucoup se soucieraient d'un fichier de ressources de 20M, mais certains pourraient le faire. Quoi qu'il en soit, s'il semble y avoir un certain intérêt, je vais essayer d'afficher le code nécessaire pour l'exécuter ici et le fichier de ressources l'un des sites de code public. S'il semble n'y avoir aucun intérêt, je ne m'en soucierai pas. Pour ré-itérer un peu, le code nécessaire dans votre application est seulement quelques lignes, mais le fichier de ressources est grand (sans le rétrécir, mon nouveau fonctionne 22M). Il est également rapide (le premier rendu a couru 100M/sec). Il nécessite une charge de fichier et cela prend un peu de temps. La version 2M n'a pas de retard notable mais 22M pourrait (pas encore là).

+1

Merci, cela semble vraiment intéressant. J'apprécierais que vous puissiez nous partager votre solution. – Morten