Вы можете легко сохранить десятичное число широты и долготы в поле беззнакового целого числа вместо того, чтобы разделять их на целую и десятичную части и хранить их отдельно, как это предлагается здесь, с использованием следующего алгоритма преобразования:
как сохраненная функция 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
Это необходимо сохранить в unsigned 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 */
person
Glenn Plas
schedule
18.09.2012