алгоритм получения часового пояса из геокоординат

Я хочу написать приложение, в котором пользователь может указать любое место на карте (не только города) и получить часовой пояс в этом месте.

Какую структуру данных (у приложения не будет подключения к Интернету) и алгоритм следует использовать? Где я могу получить необходимые данные (я не буду более точным, чем деление карты на 24 прямоугольника)?

Я напишу свое приложение на Java ME.


person Maciek Sawicki    schedule 06.12.2009    source источник
comment
См. также вики сообщества по этой теме   -  person Matt Johnson-Pint    schedule 22.05.2013


Ответы (4)


Учитывая, что часовые пояса основаны на политических объектах, а не просто на физическом вычислении широты/долготы, я бы создал структуру данных, которая отображает многоугольники по координатам широты/долготы в политические объекты (страну и провинцию/штат), а затем создал бы отдельную структуру, которая сопоставлены политические объекты и текущая дата со смещением часового пояса.

Таким образом, вы не только избегаете избыточности, но и:

  1. Вы можете отображать справочную информацию о переходе на летнее время независимо от определенного набора координат и
  2. Когда в какой-либо стране изменяются правила начала и окончания перехода на летнее время, у вас есть одно место для внесения изменений.

Однако, учитывая очень неправильную форму некоторых границ, вам потребуется довольно большая структура данных для точности, в зависимости от разрешения вашего ввода и/или отображения.

person joel.neely    schedule 06.12.2009
comment
Большое спасибо. Я думаю, это правильное направление. Я думаю, что самым сложным элементом будет извлечение данных о часовых поясах из какой-либо системы GiS и преобразование их в пригодный для использования формат. - person Maciek Sawicki; 06.12.2009
comment
Просто убедитесь, что вы разрешаете несколько часовых поясов для данного местоположения. Некоторые места в мире имеют очень нечеткие границы. - person Trejkaz; 11.09.2012

Существует ряд веб-служб, которые могут сделать это за вас (например, GeoNames имеет отличный API). Но если у вас нет подключения к Интернету, то это не то, что вы найдете непосредственно в стандартных библиотеках Java ME.

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

Возможны и более сложные подходы, но они также требуют значительно больших структур памяти, что, как я полагаю, является ограничением, если вы используете Java ME. Это хороший компромисс между пространством и скоростью.

person John Feminella    schedule 06.12.2009
comment
Но будьте немного осторожны, например, на севере Франции есть места ближе к Лондону, чем к Парижу, и места в Шотландии ближе к Ставангеру, чем к Эдинбургу, поэтому приближение к ближайшему городу не гарантирует правильного ответа. - person High Performance Mark; 06.12.2009
comment
Верно. Ключевым моментом было бы наличие репрезентативного города для каждой страны/часового пояса. Например, вам не нужно шесть городов для представления Франции, достаточно одного (например, Парижа) для часового пояса, в котором он находится (центральноевропейское время). Это увеличивает размер каждой области Вороного и повышает вероятность правильного ответа. - person John Feminella; 06.12.2009
comment
Но полигон, содержащий Париж и остальную Францию, не будет районом Вороного Парижа. Конечно, используйте полигональное представление для каждого часового пояса (или каждой страны), но это не будут регионы Вороного. - person High Performance Mark; 06.12.2009

Ответ Джоэла Нили хорош, но имейте в виду, что это действительно сложная проблема по политическим причинам. Таким образом, в спорных районах, таких как Кашмир или Тибет, вы можете оскорбить людей своим решением.

Кроме того, если вы хотите затем использовать информацию о часовом поясе для вычисления изменений времени, это становится еще сложнее, поскольку решения о том, используется ли летнее время, и дата его изменения могут быть изменены с уведомлением всего за 2 недели. См.: http://www.timeanddate.com/news/time/argentina-dst-2009-2010.html

Если вы заинтересованы. Отказ от ответственности - я не покупал эту информацию, поэтому не знаю, насколько она хороша.

person Nick Fortescue    schedule 07.12.2009

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

И если это не сработает для вас, я бы согласился с ответом Джоэла Нили.

person High Performance Mark    schedule 06.12.2009
comment
Я рассмеялся, но это, наверное, самый безопасный ответ, так как он всех одинаково расстраивает. :D - person Trejkaz; 11.09.2012
comment
например abs(долгота / 15), поэтому для Лос-Анджелеса, который составляет -118,44, вы получите -7,88, а у нас GMT-8. - person Rob; 21.05.2013