Вы можете легко хранить широта/долгота десятичное число в целое число без знака поля, вместо того, разделив их в целой и дробной части и хранить их отдельно, как несколько предложено здесь, используя следующий алгоритм преобразования:
в качестве сохраненной функции MySQL:
CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT)
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if(((s > 0) && (s >> 31)) , (-(0x7FFFFFFF -
(s & 0x7FFFFFFF)))/600000, s/600000)
и обратно
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
Это должно быть сохранено в неподписанных INT (10), это работает в MySQL, а также в SQLite, которая Бестиповое.
через опыт, я нахожу, что это работает очень быстро, если все, что вам нужно, это хранить координаты и извлекать их для выполнения некоторой математики.
в PHP эти 2 функции выглядят как
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
и обратно:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
Это некоторые дополнительные преимущества, а также в перспективе создания, например, Memcached уникальных ключей с целыми числами. (например: кеширование результата геокода). Надеюсь, что это добавит ценности для обсуждения.
Другое приложение может быть, когда вы без расширений ГИС и просто хотите сохранить несколько миллионов этих Lat/Lon пар, вы можете использовать разделы на этих полей в MySQL, чтобы извлечь выгоду из того факта, что они являются целыми числами:
Create Table: CREATE TABLE `Locations` (
`lat` int(10) unsigned NOT NULL,
`lon` int(10) unsigned NOT NULL,
`location` text,
PRIMARY KEY (`lat`,`lon`) USING BTREE,
KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY()
PARTITIONS 100 */
Как этот дублирующий вопрос? Он явно задает абажую обычную базу данных базы данных ванили, когда другой вопрос (и ответы там тоже) обсуждает MySQL конкретно. – Atul
Атул прав, это не тот же вопрос, потому что другой указывает, что вычисления будут производиться на lat/lng. Я только понял, что мой ответ от другого лучше всего подходит здесь, поэтому, пожалуйста, посмотрите: http://stackoverflow.com/a/25120203/1226018 – Simon
Я собираюсь перезвонить, спустя годы. Атул и Саймон правы. Это функционально разные вопросы. Пометка этого как дубликата может быть эквивалентом того, что запрос о том, как сохранить запись в базе данных с использованием C# и Python, является дубликатом. –