алгоритм получения часового пояса из географических координат - PullRequest
11 голосов
/ 06 декабря 2009

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

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

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

Ответы [ 4 ]

13 голосов
/ 06 декабря 2009

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

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

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

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

5 голосов
/ 06 декабря 2009

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

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

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

3 голосов
/ 07 декабря 2009

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

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

Информация о многоугольнике может быть куплена по адресу http://www.worldtimeserver.com/time_zone_guide/, если вы заинтересованы. Отказ от ответственности - я не купил эту информацию, поэтому не знаю, насколько она хороша.

3 голосов
/ 06 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...