Проблема хранения значений широты и долготы в базе данных MySQL - PullRequest
17 голосов
/ 31 мая 2011

Я хочу сохранить значения широты и долготы, полученные из Google Maps GeoCoding API, в базе данных MySQL.Значения в формате с плавающей запятой.

12.9274529

77.5905970

И когда я хочу сохранить его в базе данных (это тип данных с плавающей запятой), он округляетсяup 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 ;

Ответы [ 7 ]

40 голосов
/ 31 мая 2011

Вам нужно использовать десятичное , если вы не хотите, чтобы числа были приближены.

Типы с фиксированной точкой (точное значение)

Магазин типов DECIMAL и NUMERIC точные числовые значения данных. Эти типы используются, когда важно сохранить точную точность, например с денежными данными.

А теперь ответ "вот, пожалуйста":

Используйте DECIMAL(10,7). Где 10 - общее количество цифр в номере, а 7 - количество цифр после .. (Это означает, что перед точкой будет 3 цифр.)

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

8 голосов
/ 31 мая 2011

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 / с использованием кругового участок selection.html * * тысячи двадцать-одина

7 голосов
/ 31 мая 2011

использование double

float не хватает необходимой точности, чтобы сохранить это количество цифр после десятичной точки. double, хотя не всегда гарантируется наличие 7 десятичных разрядов для всех чисел, где слева от десятичного знака будет не более 8 цифр, поэтому они должны соответствовать вашим потребностям.

2 голосов
/ 15 мая 2012

Оптимальная настройка в моем опыте - ДВОЙНАЯ (11,8), имейте в виду, что широта / долгота может быть> 99

0 голосов
/ 14 сентября 2014

Используйте 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 ;
0 голосов
/ 31 мая 2011

Измените таблицу так, чтобы она составляла двойную точность с плавающей точкой вместо одинарной точности:

alter table properties modify latitude double, modify longitude double;
0 голосов
/ 31 мая 2011

Десятичное число (10,8) более чем достаточно.Некоторые устройства GPS обеспечивают более точное положение.

...