2009-11-09 18 views
6

W tytule pojawia się potrzeba znalezienia strefy czasowej (lub może tylko przesunięcie UTC) na podstawie pary współrzędnych. Szukałem różnych rozwiązań i istnieje kilka usług internetowych, ale muszę mieć dostęp do aplikacji w trybie offline. Ponieważ strefy czasowe nie są w pełni oparte na długości geograficznej, nie wydaje się to takie proste ...Strefa czasowa według współrzędnych

Chociaż pytam o plik ESRI shapefile, który zawiera wszystkie kraje świata i ich strefy czasowe, ale wydaje się, że złożony. Jeśli to powinno być rozwiązanie, czy znasz jakąkolwiek bibliotekę .NET udostępniającą tę funkcjonalność?

+1

Zobacz także, [to wiki społeczności] (http://stackoverflow.com/q/16086962/634824) –

Odpowiedz

0

Mówiłeś:

I choć o zapytań o shapefile ESRI Mam zawierającą wszystkie kraje świata i ich stref czasowych, ale wydaje rodzaju kompleksu. Jeśli to powinno być rozwiązanie, czy znasz jakąkolwiek bibliotekę .NET udostępniającą tę funkcjonalność?

Tak - dokładnie to exists here.

2

Sprawdź bazę danych . Wiem, że kojarzy nazwy z strefami czasowymi (takimi jak miasto, kraje, EST itd.). Ale wierzę, że gdzieś jest miejsce na współrzędne.

+0

Próbowałem bazy danych tz, ale wydaje się, że nie zapewnia rzeczywisty kształt stref czasowych .. Plik shapefile, który mam, pochodzi z http://www.manifold.net/download/freemaps.html, mimo że link już nie działa. Czy ktokolwiek ma doświadczenie w identyfikowaniu (odpytywaniu) obiektów w pliku shape przez współrzędne? – Morten

0

Rozwiązaniem było wyeksportowanie pliku kształtu ESRI do programu SQL Server 2008 przy użyciu nowych typów danych przestrzennych.

Jeśli ktoś ma lepsze rozwiązanie, zapraszam!

0

Próbowałem wyeksportować tabelę, ale nie wydaje się możliwe wyeksportowanie typów geometry do tekstu .. jednak i tak nie było to trudne. Musisz google to shapefile Manifold wyprodukowany kilka lat temu, który odwzorowuje wszystkie kontrole na świecie i ich strefy czasowe. Następnie musisz wyeksportować te dane do SQL Server 2008 za pomocą jakiegoś programu. Użyłem Manifolda (pamiętaj, aby użyć Enterprise Edition lub wyżej). Następnie wysyłam zapytania do danych za pomocą poniższa procedura przechowywana:

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 

Jest problem w kształcie, ponieważ wody krajowe nie są mapowane. Być może używając @ g.STBuffer() do rozwiązania tego problemu ..

6

Rozwiązałem to za pomocą aplikacji klienckiej. Technika polegała na tym, aby stworzyć cylindryczną mapę świata oznaczoną kolorami, każda strefa czasowa ma niepowtarzalny kolor. Lat-Lons są konwertowane na współrzędne obrazu, a kolor współrzędnych jest odczytywany, a następnie odsyłany do strefy czasowej tego koloru.

To krótkie wyjaśnienie nie jest dokładnie tym, co zrobiłem, ale wpada na pomysł. Zapełniłem kilka słowników i sprawdziłem je. Pierwsze wykonanie zajęło zapełnienie 2M pliku zasobów (po przetworzeniu mojej mapy i przekształceniu jej w dane binarne). Teoretyczny błąd maksymalny (dla szerokości geograficznych w pobliżu równika) powinien wynosić +/- około 15 mil. Niestety dokładność mojej mapy początkowej była zbliżona do +/- 100 mil.

Realizuję projekt. Byłem w tym od kilku dni, tworząc teraz mapę bardziej dokładną i wyższą rezer- wową, żeby się schrupać. Jeszcze kilka dni i należy to zrobić. Plik zasobów będzie wynosił około 20 M, chyba że wybiorę tylko zasób "głupich obszarów" i matematycznie obliczyć 90% świata, który można obliczyć bezpośrednio (większość świata może być matematycznie wyprowadzona z długości geograficznej). Nie jestem pewny, czy wiele osób będzie się martwić, że plik zasobów ma 20M, ale niektóre mogą. W każdym razie, jeśli wydaje się, że istnieje jakieś zainteresowanie, postaram się opublikować kod niezbędny do uruchomienia go tutaj, a plik zasobów jedną z publicznych stron kodowych. Jeśli wydaje się, że nie ma zainteresowania, nie będę się tym przejmował.

Tylko po to, aby trochę powtórzyć, kod wymagany w aplikacji to tylko kilka wierszy, ale plik zasobów jest duży (bez zmniejszania go, mój nowy działa na 22M). Jest również szybki (pierwsze wydanie przebiegło 100 M/s). To wymaga załadowania pliku i zajmuje trochę czasu. Wersja 2M nie miała zauważalnego opóźnienia, ale 22M mogło (jeszcze nie było).

+1

Dzięki, to brzmi interesująco. Byłbym wdzięczny, gdybyś mógł podzielić się z nami swoim rozwiązaniem. – Morten

Powiązane problemy