Frage

    

Diese Frage bereits eine Antwort hier:

         

Wie der Titel folgert Ich brauche eine Zeitzone zu finden (oder vielleicht nur die UTC-Offset), basierend auf einem Koordinatenpaar. Ich habe für verschiedene Lösungen gesucht, und es gibt ein paar Web-Dienste gibt, aber ich muss in der Lage sein, die Anwendung offline zugreifen. Da die Zeitzonen ist es nicht vollständig basierend auf Länge scheint nicht so einfach ...

ich aber über eine ESRI Shape-Datei Abfrage ich alle Länder in Welt und ihre Zeitzonen haben enthalten, aber es scheint Art komplexer. Wenn das sollte die Lösung sein, wissen Sie von jeder .NET-Bibliothek diese Funktionalität bereitstellt?

Andere Tipps

Ich habe dies mit einer Client-Anwendung gelöst. Die Technik war eine farbcodierte zylindrische Karte von der Welt zu machen, jede Zeitzone eine einzigartige Farbe. Lat-Lons umgewandelt werden koordiniert und die Farbe des Koordinaten Bild gelesen wird dann mit Querverweisen auf die Zeitzone dieser Farbe.

Die kurze explaination nicht genau das, was ich tat, aber es wird die über Idee. Ich bevölkerten tatsächlich ein paar Wörterbücher und tat Nachschlag von ihnen. Die erste Wiedergabe nahm 2M der Ressourcendatei zu füllen (nachdem ich meine Karte verarbeitet und verwandeln sie in binäre Daten). Die theoretischen maximalen Fehler (für Breiten in der Nähe des Äquators) sollen +/- etwa 15 Meilen gewesen sein. Leider Genauigkeit meiner Start-Karte war mehr wie +/- 100 Meilen.

So redoing ich das Projekt. Ich habe mehrere Tage jetzt in es gewesen, eine sowohl genauer und mit höherer rez Karte zu schaffen Knirschen. Noch ein paar Tage und es sollte getan werden. Die Ressourcendatei wird rund 20 Millionen sein, wenn ich nur wählen, berechnen die „goofy Bereiche“ Ressourcen- und mathematisch die 90% der Welt, die direkt berechnet werden kann (die meisten der Welt kann die mathematisch aus Länge abgeleitet werden). Nicht sicher viele sorgen würde, dass eine Ressource-Datei war 20M aber einige Macht. Jedenfalls, wenn es scheint ein gewisses Interesse zu sein, werde ich versuchen, den Code zu schreiben nötig es hier zu laufen und die Ressource-Datei ein einem der öffentlichen Code-Sites. Wenn es scheint kein Interesse zu sein, ich will nicht stören.

Just, erneut auf ein bisschen, ist den Gutscheincode notwendig in Ihrer Anwendung nur ein paar Zeilen, aber die Ressource-Datei ist groß (w / o schrumpfen, mein neues 22M läuft). Es ist auch schnell (die erste Wiedergabe lief 100M / s). Es spielt eine Datei Last erfordern und das braucht ein wenig Zeit. Die 2M-Version hatte keine merkliche Verzögerung aber 22M könnte (noch nicht da).

Überprüfen Sie die tz Datenbank. Ich weiß, dass es Namen zu Zeitzonen zuordnet (wie Stadt, Länder, EST, etc). Aber ich glaube, es ist eine Erweiterung für Koordinaten irgendwo.

Ich habe versucht, die Tabelle zu exportieren, aber es scheint nicht möglich geometry Typen zu exportieren .. aber in Text, es war nicht so schwer, trotzdem zu tun .. Sie müssen vor ein paar Jahren den Shape-Datei Manifold produzierten google die Karten aller contries in der Welt und ihre Zeitzonen .. Dann müssen Sie diese Daten in SQL Server 2008 exportieren einiges Programm .. ich benutzte Manifold (erinnert Enterprise Edition oder höher verwenden) .. Dann Abfrage ich die Daten der Verwendung von folgende gespeicherte Prozedur:

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

Es gibt ein Problem in der Shape-Datei, weil die nationalen Gewässer nicht abgebildet wird. Ich dachte, der vielleicht mit @ g.STBuffer (), um dieses Problem zu lösen ..

Die Lösung war eine ESRI Shape-Datei zu SQL Server 2008 mit den neuen räumlichen Datentypen zu exportieren.

Wenn jemand eine bessere Lösung fühlen Sie sich frei zu schreiben hat!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top