Часовой пояс по координатам

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

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


person Morten    schedule 09.11.2009    source источник


Ответы (5)


См.: Как получить часовой пояс из местоположения, используя координаты широты и долготы?

person Community    schedule 27.06.2013
comment
Обратите внимание, что этот проект был удален. Автор указывает на github.com/mj1856/GeoTimeZone, который предлагает аналогичную функциональность на C#. - person t9mike; 16.08.2019

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

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

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

Просто повторю еще раз: код, необходимый в вашем приложении, состоит всего из нескольких строк, но файл ресурсов большой (без его сжатия, мой новый работает 22M). Это также быстро (первая версия работала со скоростью 100 Мбит / с). Это ДЕЙСТВИТЕЛЬНО требует загрузки файла, и это занимает немного времени. Версия 2M не имела заметной задержки, но 22M могла бы (еще не было).

person shooky    schedule 15.11.2012
comment
Спасибо, звучит определенно интересно. Я был бы признателен, если бы вы могли поделиться с нами своим решением. - person Morten; 16.11.2012

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

person Nestor    schedule 09.11.2009
comment
Я попробовал базу данных tz, но, похоже, она не дает реальной формы часовых поясов... Шейп-файл, который у меня есть, взят из manifold.net/download/freemaps.html, хотя ссылка больше не работает. У кого-нибудь есть опыт идентификации (запроса) объектов в шейп-файле по координатам? - person Morten; 10.11.2009

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

person Morten    schedule 18.11.2009

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

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

person Morten    schedule 11.11.2009