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



9 Answers

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

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

mysql геоданные

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




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

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

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




Зависит от требуемой точности.

Datatype           Bytes       resolution
------------------ -----  --------------------------------
Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
SMALLINT scaled        4   682 m    0.4 mi  Cities
Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6   2.7 m    8.8 ft
FLOAT                  8   1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
DOUBLE                16   3.5nm     ...    Fleas on a dog

От: http://mysql.rjweb.org/doc.php/latlng

Чтобы подвести итог:

  • Самый точный доступный вариант - DOUBLE .
  • Наиболее распространенным видным типом является DECIMAL(8,6)/(9,6) .

Начиная с MySQL 5.7 , рассмотрите использование пространственных типов данных (SDT), в частности POINT для хранения одной координаты. До 5.7 SDT не поддерживает индексы (за исключением 5.6, когда тип таблицы - MyISAM).

Замечания:

  • При использовании класса POINT порядок аргументов для сохранения координат должен быть POINT(latitude, longitude) .
  • Существует специальный синтаксис для создания пространственного индекса .
  • Наибольшее преимущество использования SDT заключается в том, что у вас есть доступ к функциям пространственного анализа , например, расчет расстояния между двумя точками ( ST_Distance ) и определение того, содержится ли одна точка в другой области ( ST_Contains ).



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




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

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




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

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




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




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

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

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

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

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

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

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




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




Related