Часовой пояс по координатам - PullRequest
7 голосов
/ 10 ноября 2009

Как следует из названия, мне нужно найти часовой пояс (или, возможно, только смещение UTC) на основе пары координат. Я искал различные решения, и есть несколько веб-сервисов, но мне нужно иметь возможность доступа к приложению в автономном режиме. Поскольку часовые пояса не полностью основаны на долготе, это не кажется легким ...

Я думал о шейп-файле ESRI, содержащем все страны мира и их часовые пояса, но он кажется сложным. Если это должно быть решением, знаете ли вы какую-либо библиотеку .NET, предоставляющую такую ​​функциональность?

Ответы [ 5 ]

6 голосов
/ 16 ноября 2012

Я решил это с помощью клиентского приложения. Техника заключалась в том, чтобы сделать цилиндрическую карту мира с цветовой кодировкой, каждый часовой пояс имеет уникальный цвет. Lat-Lons преобразуются в координаты изображения, и цвет координаты считывается, затем перекрестно привязывается к часовому поясу этого цвета.

Это короткое объяснение не совсем то, что я сделал, но оно передает идею. Я фактически заполнил пару словарей и сделал поиск от них. Первое представление заняло 2M файла ресурсов для заполнения (после того, как я обработал свою карту и превратил ее в двоичные данные). Теоретическая максимальная ошибка (для широт вблизи экватора) должна была составлять +/- около 15 миль. К сожалению, точность моей стартовой карты была больше +/- 100 миль.

Итак, я переделываю проект. Я занимаюсь этим уже несколько дней, создавая как более точную, так и более высокую рез-карту, чтобы ее можно было обработать. Еще пара дней, и это должно быть сделано. Файл ресурсов будет около 20M, если я не выберу только ресурсы для «тупых областей» и математически вычислю 90% мира, который можно вычислить напрямую (большая часть мира может быть математически получена из долготы). Не уверен, что многие позаботятся о том, чтобы файл ресурсов был 20M, но некоторые могли бы. В любом случае, если есть какой-то интерес, я постараюсь опубликовать здесь код, необходимый для его запуска, и файл ресурсов на одном из сайтов с открытым кодом. Если, кажется, нет никакого интереса, я не буду беспокоиться.

Просто, чтобы повторить немного, код, необходимый в вашем приложении, занимает всего несколько строк, но файл ресурсов большой (без его сжатия, мой новый работает с 22M). Это также быстро (первая передача работала со скоростью 100 м / с). Это требует загрузки файла, и это занимает немного времени. Версия 2M не имела заметной задержки, но 22M могла бы (пока нет).

2 голосов
/ 10 ноября 2009

Проверьте базу данных tz . Я знаю, что это связывает имена с часовыми поясами (например, город, страны, EST и т. Д.). Но я считаю, что где-то есть расширение для координат.

1 голос
/ 18 ноября 2009

Я пытался экспортировать таблицу, но не представляется возможным экспортировать geometry типы в текст ... однако это было не так сложно, в любом случае ... Вам нужно зайти в Google. лет назад, который отображает все страны мира и их часовые пояса. Затем вам нужно экспортировать эти данные в SQL Server 2008 с помощью некоторой программы. Я использовал Manifold (не забудьте использовать Enterprise Edition или выше). Затем я запрашиваю данные используя следующую хранимую процедуру:

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

В шейп-файле есть проблема, потому что национальные воды не отображаются. Возможно, я использовал @ g.STBuffer () для решения этой проблемы.

0 голосов
/ 27 июня 2013

Вы сказали:

Я думал о запросе шейп-файла ESRI, который содержит все страны мира и их часовые пояса, но он кажется довольно сложным.Если это должно быть решением, знаете ли вы какую-либо библиотеку .NET, предоставляющую такую ​​функциональность?

Да - именно здесь существует *1008*.

0 голосов
/ 11 ноября 2009

Решением было экспортировать шейп-файл ESRI в SQL Server 2008 с использованием новых пространственных типов данных.

Если у кого-то есть лучшее решение, пишите!

...