Проблема Сохранение значений широты и долготы в базе данных 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 ;