Я работаю с данными карты, и Latitude/Longitude
расширяется до 8 десятичных знаков. Например:
Latitude 40.71727401
Longitude -74.00898606
Я видел в документе Google, который использует:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
однако их десятичные разряды идут только к 6.
Должен ли я использовать FLOAT(10, 8)
или есть другой метод для хранения этих данных, чтобы он был точным. Он будет использоваться с расчетами карты. Спасибо!
mysql
types
floating-point
Эдвард
источник
источник
float
тип - он имеет только 7 цифр точности. Вам нужно как минимум 9. Вам не нужно 10 - документы по какой-то странной причине считают знак минус цифрой. Делай или:double(9,6)
илиdecimal(9,6)
.FLOAT
различает два элемента на расстоянии 1,7 м (5,6 фута) друг от друга. Все это смехотворно излишне для приложений «карты»!Ответы:
DECIMAL - это тип данных MySQL для точной арифметики. В отличие от FLOAT его точность фиксирована для любого размера числа, поэтому, используя его вместо FLOAT, вы можете избежать ошибок точности при выполнении некоторых вычислений. Если вы просто сохраняете и извлекаете числа без расчета, то на практике FLOAT будет безопасным, хотя использование DECIMAL не повредит. С расчетами FLOAT все еще в основном нормально, но чтобы быть абсолютно уверенным в 8d.p. Точность вы должны использовать DECIMAL.
Широты варьируются от -90 до +90 (градусов), поэтому для этого вполне подойдет DECIMAL (10, 8), а для долгот - от -180 до +180 (градусов), поэтому вам нужно DECIMAL (11, 8). Первое число - это общее количество сохраненных цифр, а второе - число после десятичной точки.
Коротко:
lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
Это объясняет, как MySQL работает с типами данных с плавающей точкой.
ОБНОВЛЕНИЕ: MySQL поддерживает пространственные типы данных и
Point
является типом с одним значением, который можно использовать. Пример:источник
Кроме того, вы увидите, что
float
значения округлены.источник
double
тип данных, который имеет необходимую точность.в laravel для переноса используется тип десятичного столбца
для получения дополнительной информации см. доступный тип столбца
источник
Вы можете установить свой тип данных как целое число со знаком. Когда вы сохраняете координаты в SQL, вы можете установить значения lat * 10000000 и long * 10000000. И когда вы выбираете с расстоянием / радиусом, вы разделите координаты хранилища на 10000000. Я тестировал его с 300К строк, время ответа на запрос хорошее (2 x 2,67 ГГц ЦП, 2 ГБ ОЗУ, MySQL 5.5.49)
источник
Не используйте float ... Он будет округлять ваши координаты, что приведет к некоторым странным событиям.
Используйте десятичную
источник
MySQL теперь поддерживает пространственные типы данных, так как этот вопрос был задан. Таким образом, текущий принятый ответ не является неправильным, но если вы ищете дополнительные функциональные возможности, такие как поиск всех точек в данном многоугольнике, используйте тип данных POINT.
Ознакомьтесь с документами Mysql о типах геопространственных данных и функциях пространственного анализа
источник
Я считаю, что лучший способ хранить Lat / Lng в MySQL - это иметь столбец POINT (2D-тип данных) с индексом SPATIAL.
источник
Использование миграционного рубина на рельсах
источник
(20,18)
также достигает максимума в +/- 99.Код для использования / подтверждения точности ответа Oğuzhan KURNUÇ .
РЕЗЮМЕ:
Большая точность (~ 1 см) в небольшом размере (4B).
Точность составляет (очень близко к) 7 десятичных цифр для значений в диапазоне [-180, 180].
Это 7 цифр справа от десятичного числа (~ 1 см) , в общей сложности 9 цифр (или 10 цифр, если считать начальные "1" или "180") около + -180.
Сравните это с 4-байтовым числом с плавающей точкой , которое имеет всего ~ 7 цифр, так что ~ 5 цифр справа от десятичной точки около + = 180 (~ 1 м) .
Методы использования этого подхода:
Тесты точности:
Вспомогательные методы, используемые тестами:
источник