Десятичный или точечный тип данных для хранения данных о географическом местоположении в MySQL

8

Я хочу сохранить географическое местоположение для каждого адреса в моей таблице "tblAddress" MySQL (Innodb), и я думаю, что у меня есть 2 варианта:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Моя программа должна найти все адреса, которые подпадают под радиус 1 километр от текущего местоположения (мобильный клиент).

Также ниже команда не работает для меня, не уверен, что мне нужно для этого.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

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

Prabhat
источник

Ответы:

6

Вы можете использовать пространственные расширения MySQL с ГИС.

В примере кода от Google, отображающем точки на карте, они заявляют:

Когда вы создаете таблицу MySQL, вы хотите обратить особое внимание на атрибуты lat и lng. С текущими возможностями масштабирования Google Maps, вам нужно только 6 цифр точности после десятичной дроби.

Чтобы сохранить минимальное пространство для хранения нашей таблицы, вы можете указать, что атрибуты lat и lng являются числами с плавающей запятой (10,6). Это позволит полям хранить 6 цифр после десятичной запятой, плюс до 4 цифр перед десятичной, например, -123,456789 градусов. Я бы не стал беспокоиться о различиях производительности между числовыми типами. Достойные индексы будут иметь гораздо больший эффект.

Вы также можете попробовать, DECIMALкак @ gandaliter предложить.

DECIMALтип данных MySQL для точной арифметики В отличие от FLOATего точности является фиксированным для любого размера числа, поэтому, используя его, FLOATвы можете избежать ошибок точности при выполнении некоторых вычислений. Если вы просто сохраняете и извлекаете числа без расчета, то на практике FLOAT это будет безопасно, хотя в использовании нет никакого вреда DECIMAL. С расчетами FLOATпока в основном все нормально, но чтобы быть абсолютно уверенным в 8д.п. Точность, которую вы должны использовать DECIMAL.

Широта варьируется от -90 до +90 (градусы), так что DECIMAL(10,8)это нормально, но долгота варьируется от -180 до +180 (градусы), так что вам нужно DECIMAL(11,8). Первое число - это общее количество сохраненных цифр, а второе - число после десятичной точки. Вкратце: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL это объясняет, как MySQL работает с типами данных с плавающей точкой.

Связанная информация:

oNare
источник
Спасибо @oNare за ваше подробное объяснение и ссылки. Я видел предложение от gandaliter в вопросе ( stackoverflow.com/questions/12504208/… ). Я также видел предложение от ypercube здесь ( stackoverflow.com/questions/9560147/… ).
Прабхат