Проблема Сохранение значений широты и долготы в базе данных MySQL
Я хочу сохранить значения широты и долготы, полученные из API Google Maps GeoCoding в базе данных MySQL. Значения находятся в формате float.
12.9274529
77.5905970
И когда я хочу сохранить его в базе данных (это float типа datatype), он округляет float и сохраняет его в следующем формате:
12,9275
77,5906
Я использую неправильный тип данных? Если да, то какой тип данных следует использовать для хранения значений широты и долготы?
Обновление:
вот CREATE TABLE, как запрошено Allin
CREATE TABLE `properties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`description` text,
`latitude` float DEFAULT NULL,
`longitude` float DEFAULT NULL,
`landmark` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Ответы
Ответ 1
Вам нужно использовать decimal, если вы не хотите, чтобы цифры были аппроксимированы.
Типы с фиксированной точкой (точные значения)
Хранилища DECIMAL и NUMERIC точные значения числовых данных. Эти типы используются, когда важно сохранить точную точность, например с денежными данными.
И теперь ответ "here you go":
Используйте DECIMAL(10,7)
. Где 10
- общее количество цифр в числе, а 7
- количество цифр после .
. (Это означает, что перед точкой будет 3
цифр.)
Настройте эти цифры по мере необходимости. Также пожалуйста взгляните на ручную запись, которую я связал ранее в ответе.
Ответ 2
У MySQL есть специальные типы для ГИС-приложений.
Используйте тип point
и посмотрите:
http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html
Для общей дискуссии см. http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html
Некоторые ребята сделали специальный UDF для вычисления расстояний между точками на сфере (т.е. земля)
См.: http://www.lenzg.net/archives/220-New-UDF-for-MySQL-5.1-provides-GIS-functions-distance_sphere-and-distance_spheroid.html
Вот как: http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html
Ответ 3
использовать double
float
не хватает необходимой точности, чтобы сохранить это число цифр после десятичной точки. double
, хотя не всегда гарантированно имеет 7 знаков после запятой для всех чисел, будет иметь место, где слева от десятичного разряда должно быть не более 8 цифр, поэтому оно должно соответствовать вашим потребностям.
Ответ 4
Оптимальная настройка в моем опыте - DOUBLE (11,8), имейте в виду, что lat/lng может быть > 99
Ответ 5
Десятичное число (10,8) более чем достаточно. Некоторые GPS-устройства обеспечивают более точное положение.
Ответ 6
Измените таблицу таким образом, чтобы double precision плавать вместо одного поплавка точности:
alter table properties modify latitude double, modify longitude double;
Ответ 7
Используйте Double
CREATE TABLE `properties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`description` text,
`latitude` Double DEFAULT NULL,
`longitude` Double DEFAULT NULL,
`landmark` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `serial` (`serial`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;