правильный / лучший тип для хранения широты и долготы - PullRequest
61 голосов
/ 22 декабря 2008

В языке программирования системного уровня, таком как C, C ++ или D, каков наилучший тип / кодировка для хранения широты и долготы?

Опции, которые я вижу:

  • IEEE-754 FP в градусах или радианах
  • градусов или радиан, хранимых в виде значения с фиксированной точкой в ​​32 или 64-битном формате int
  • отображение целочисленного диапазона в диапазон градусов: -> deg = (360/2^32)*val
  • градусы, минуты, секунды и доли секунды, хранящиеся в виде битовых полей в int
  • структура какого-то рода.

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

Одним интересным вариантом является тип с плавающей точностью, который, когда широта увеличивается, она получает больше битов, а долгота уменьшается (когда они сближаются в направлении полюсов).

Смежные вопросы, которые не совсем охватывают это:


Кстати: 32 бита дают разрешение E / W на экваторе около 0,3 дюйма. Это близко к шкале, на которой могут работать высококлассные GPS-установки (в некоторых режимах IIRC они могут снижаться до 0,5 в) .

OTOH, если 32 бита равномерно распределены по поверхности земли, вы можете индексировать квадраты размером около 344 м на стороне, 5 байтов дают 21 м, 6B-> 1,3 м и 8B-> 5 мм.

У меня сейчас нет особого смысла, но я работал с такими вещами раньше и ожидаю снова, в какой-то момент.

Ответы [ 12 ]

1 голос
/ 01 октября 2009

Если под «хранением» вы подразумеваете «держать в памяти», то реальный вопрос: что вы собираетесь с ними делать?

Я подозреваю, что прежде чем эти координаты сделают что-нибудь интересное, они будут направлены как радианы через функции в math.h. Если вы не планируете реализовать довольно много трансцендентных функций, которые работают на градусах / мин / сек, упакованных в битовое поле.

Так почему бы не сделать вещи простыми и просто хранить их в градусах IEEE-754 или радианах с точностью, соответствующей вашим требованиям?

0 голосов
/ 17 апреля 2014

Вы можете использовать decimal тип данных:

CREATE TABLE IF NOT EXISTS `map` (
  `latitude` decimal(18,15) DEFAULT NULL,
  `longitude` decimal(18,15) DEFAULT NULL 
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...