Question

    

Cette question a déjà une réponse ici:

         

Comme le titre infère Je dois trouver un fuseau horaire (ou peut-être l'UTC offset) sur la base d'une paire de coordonnées. J'ai cherché différentes solutions, et il y a quelques services web là-bas, mais je dois être en mesure d'accéder hors ligne d'application. Comme les fuseaux horaires ne sont pas tout à fait sur la base de longitude il ne semble pas aussi simple que cela ...

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, savez-vous d'une bibliothèque .NET fournissant cette fonctionnalité?

Autres conseils

Je l'ai résolu ce avec une application cliente. La technique était de faire une carte cylindrique code couleur du monde, chaque fuseau horaire a une couleur unique. Lat-Lons sont converties en image les coordonnées et la couleur de la coordonnée est ensuite lue recoupées au fuseau horaire de cette couleur.

Ce court est explaination pas exactement ce que je l'ai fait, mais il a l'idée à travers. En fait, je peuplaient un dictionnaires de couple et a fait d'eux recherche. La première interprétation a 2M de fichier de ressources pour remplir (après j'ai traité ma carte et l'a transformé en données binaires). L'erreur maximum théorique (pour les latitudes près de l'équateur) aurait dû être +/- environ 15 miles. Malheureusement, la précision de ma carte de départ était plus comme +/- 100 miles.

Je refais le projet. Je suis en elle plusieurs jours maintenant la création d'un à la fois plus précis et plus carte-crunch rez. Quelques jours plus et cela devrait être fait. Le fichier de ressources sera autour de 20M à moins que je ne choisis pour les ressources « zones loufoques » et calculer mathématiquement les 90% du monde qui peut être calculé directement (la plupart du monde peut être dérivée mathématiquement de la longitude). Pas sûr que beaucoup se soucierait qu'un fichier de ressources était 20M, mais certains pourraient. En tout cas, s'il semble y avoir un certain intérêt, je vais essayer de poster le code nécessaire pour l'exécuter ici et le fichier de ressources l'un l'un des sites de code public. S'il semble y avoir aucun intérêt, je ne vais pas.

Juste pour re-itérer un peu, le code nécessaire dans votre application est seulement quelques lignes, mais le fichier de ressources est grande (w / o en réduire la taille, mon nouveau est en cours d'exécution 22M). Il est également rapide (la première interprétation a couru 100M / sec). Il nécessite une charge de fichier et qui prend un peu de temps. La version 2M avait pas de retard notable mais 22M peut (pas encore là).

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

J'ai essayé d'exporter la table, mais il ne semble pas possible d'exporter les types de geometry au texte .. mais il n'a pas été difficile à faire de toute façon .. Vous devez google le collecteur shapefile produit il y a quelques années qui associe toutes les contries dans le monde et leurs fuseaux horaires .. Ensuite, vous devez exporter ces données vers SQL Server 2008 en utilisant un certain programme .. je Manifold (rappelez-vous d'utiliser Enterprise Edition ou plus) .. Ensuite, j'interroger les données à l'aide de 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((-@Longitude + 7.5) / 15) AS Offset, NULL AS AreaI

Il y a un problème dans le shapefile parce que les eaux nationales ne sont pas mises en correspondance. Je pensais d'utiliser peut-être @ g.STBuffer () pour résoudre ce problème ..

La solution était d'exporter un fichier de forme ESRI vers SQL Server 2008 en utilisant les nouveaux types de données spatiales.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top