Vous pouvez facilement stocker un nombre décimal de lat/lon dans un champ entier non signé, au lieu de les diviser en une partie entière et une partie décimale et de les stocker séparément comme cela est quelque peu suggéré ici en utilisant l'algorithme de conversion suivant :
comme une fonction mysql stockée :
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)
et retour
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
Cela doit être stocké dans un int non signé (10) Cela fonctionne aussi bien dans mysql que dans sqlite qui est sans typologie.
Par expérience, je trouve que cela fonctionne très rapidement, si tout ce dont vous avez besoin est de stocker des coordonnées et de les récupérer pour faire des calculs.
en php ces 2 fonctions ressemblent à
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
et retour :
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
Cela présente également un avantage supplémentaire en termes de création, par exemple, de clés uniques memcached avec des entiers. (ex : pour mettre en cache un résultat de géocode). J'espère que cela ajoutera de la valeur à la discussion.
Une autre application pourrait être lorsque vous n'avez pas d'extensions SIG et que vous voulez simplement conserver quelques millions de ces paires lat/lon, vous pouvez utiliser des partitions sur ces champs dans mysql pour bénéficier du fait qu'ils sont des entiers :
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 */