[database] Какой идеальный тип данных используется при хранении широты / долготы в базе данных MySQL?



Answers

Google предоставляет начало для завершения PHP / MySQL-решения для примера приложения «Локатор магазина» с Google Maps. В этом примере они сохраняют значения lat / lng как «Float» с длиной «10,6»,

http://code.google.com/apis/maps/articles/phpsqlsearch.html

Question

Принимая во внимание, что я буду выполнять вычисления на партах lat / long, какой тип данных лучше всего подходит для использования с базой данных MySQL?




Используйте DECIMAL(8,6) для широты (от 90 до -90 градусов) и DECIMAL(9,6) для долготы (от 180 до -180 градусов). 6 десятичных знаков отлично подходят для большинства приложений. Оба должны быть «подписаны», чтобы допускать отрицательные значения.




в зависимости от вашего приложения, я предлагаю использовать FLOAT (9,6)

пространственные ключи предоставят вам больше возможностей, но по производственным эталонам поплавки намного быстрее, чем пространственные ключи. (0,01 VS 0,001 в AVG)




Основываясь на этой статье wiki http://en.wikipedia.org/wiki/Decimal_degrees#Accuracy соответствующий тип данных в MySQL является десятичным (9,6) для хранения долготы и широты в отдельных полях.




Мы храним широту / долготу X 1,000,000 в нашей базе данных оракула как ЧИСЛО, чтобы избежать ошибок округления с удвоениями.

Учитывая, что широта / долгота до шестого десятичного знака была 10-сантиметровой точностью, это было все, что нам нужно. Многие другие базы данных также хранят lat / long до шестого знака после запятой.




Я очень удивлен некоторыми ответами / комментариями.

Почему же кто-нибудь захочет добровольно «преуменьшить» точность, а затем выполнить вычисления по худшим цифрам? Звучит глупо.

Если источник имеет 64-битную точность, то, конечно, было бы немым, чтобы вовремя исправить масштаб, например. 6 десятичных знаков и ограничить точность до максимум 9 значащих цифр (что происходит с обычно предлагаемым десятичным 9.6 форматом).

Естественно, один хранит данные с точностью, которую имеет исходный материал. Единственной причиной снижения точности было бы ограниченное пространство для хранения.

  • Храните исходные данные с оригинальной точностью
  • Сохраняйте цифры, рассчитываемые из источника, в точности, которую выполняет расчет (например, если код приложения использует удвоение, сохраняйте результаты как удвоенные значения)

Десятичный 9.6-формат вызывает феномен привязки к сетке. Это должен быть последний шаг, если это вообще произойдет.

Я не приглашал бы накопленные ошибки в свое гнездо.




Для расчетов Lat Long требуется точность, поэтому используйте тип десятичного типа и сделайте точность по крайней мере на 2 выше, чем номер, который вы будете хранить, чтобы выполнять математические вычисления. Я не знаю о моих типах данных sql, но в SQL-сервере люди часто используют float или real вместо десятичного числа и попадают в неприятности, потому что это оценочные числа, которые не являются реальными. Поэтому просто убедитесь, что тип данных, который вы используете, является истинным десятичным типом, а не плавающим десятичным типом, и все должно быть в порядке.




Пространственные функции в PostGIS гораздо более функциональны (т. Е. Не ограничены операциями BBOX), чем функции пространственных функций MySQL. Проверьте это: текст ссылки




Пространственные расширения MySQL - лучший вариант, потому что у вас есть полный список пространственных операторов и индексов в вашем распоряжении. Пространственный индекс позволит вам выполнять дистанционные вычисления очень быстро. Имейте в виду, что с 6,0 Пространственное расширение еще не завершено. Я не откладываю MySQL Spatial, давая вам знать о подводных камнях, прежде чем вы заходите слишком далеко вперед.

Если вы имеете дело только с точками и только функцией DISTANCE, это нормально. Если вам нужно делать какие-либо вычисления с помощью полигонов, линий или буферизованных точек, пространственные операторы не дают точных результатов, если вы не используете оператор «связать». См. Предупреждение в верхней части 21.5.6 . Отношения, такие как содержит, внутри или пересекаются, используют MBR, а не точную форму геометрии (т. Е. Ellipse обрабатывается как прямоугольник).

Кроме того, расстояния в MySQL Spatial находятся в тех же единицах, что и ваша первая геометрия. Это означает, что если вы используете десятичные градусы, то ваши измерения расстояния находятся в десятичных градусах. Это очень затруднит получение точных результатов, когда вы получите фуфур с экватора.




Related