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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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