Вопрос

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

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

Это было полезно?

Другие советы

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

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

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

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

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

Я пытался экспортировать таблицу, но, похоже, экспортировать ее невозможно geometry преобразует в текст ..однако в любом случае это было не так уж трудно сделать..Вам нужно погуглить шейп-файл Manifold, созданный несколько лет назад, который отображает все страны мира и их часовые пояса..Затем вам нужно экспортировать эти данные в 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() для решения этой проблемы..

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top