В каком типе данных лучше хранить географические координаты?
Хватит ли точности double - или всё-таки в тексте хранить? Я вот не могу этого в документации уловить. Подскажите.
Ответы (3 шт):
decimal(11,8) - Этого хватит для самых подробных координат, с которыми придётся работать.
Если над координатами будут вычисления, то лучше использовать расширения Spatial типы. Например point https://mariadb.com/kb/en/geometry-types/
https://dev.mysql.com/doc/refman/8.4/en/gis-data-formats.html
Исходя из моего опыта работы с координатами:
Для точности координат до одного метра на местности можно обрезать координаты до 6 знаков после запятой. До сантиметра - до 8 знаков.
Если необходимо будет искать точки в базе на совпадение координат при обрезке до 6 знаков, то можно хранить в DOUBLE. Если точность больше - надо будет уточнять.
В качестве альтернативного или дополнительного варианта можно использовать целочисленные координаты:
function LongitudeToX($longitude){
return intval((floatval($longitude) + 180) / 360 * 2147483648);
}
function LatitudeToY($latitude){
return intval((90 - floatval($latitude)) / 180 * 2147483648);
}
Такой вариант соответствует примерно 7 знакам после запятой. Поиск и выборка по целочисленным координатам идёт быстрее.