Я хочу сохранить значения широты и долготы из Google Maps GeoCoding API в базе данных MySQL. Значения находятся в поплавком формате.
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 ;
Вам нужно использовать десятичное число, если вы не хотите, чтобы цифры были приблизительными.
Типы с фиксированной точкой (точные значения)
Типы DECIMAL и NUMERIC сохраняют точные значения числовых данных. Эти типы используются, когда важно сохранять точную точность, например, с денежными данными.
И теперь ответ «вот ты»:
Используйте DECIMAL(10,7)
. Где 10
– общее количество цифр в числе, а 7
– количество цифр после .
, (Это означает, что перед точкой будет 3
цифры.)
При необходимости отрегулируйте эти цифры. Также, пожалуйста, взгляните на ручную запись, которую я связал ранее в ответе.
У 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
использовать double
float
не имеет необходимой точности, чтобы сохранить это число цифр после десятичной точки. double
, хотя и не всегда гарантированно имеет 7 знаков после запятой для всех чисел, будет иметь место, где слева от десятичного разряда должно быть не более 8 цифр, поэтому оно должно соответствовать вашим потребностям.
Оптимальная настройка в моем опыте – DOUBLE (11,8), имейте в виду, что lat / lng может быть> 99
Измените таблицу таким образом, чтобы вместо float с одиночной точностью плавать с двойной точностью :
alter table properties modify latitude double, modify longitude double;
Десятичного числа (10,8) более чем достаточно. Некоторые устройства GPS обеспечивают более точное положение.
Использование 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 ;