Se pueden almacenar una latitud/longitud número decimal en un campo entero sin signo, en lugar de dividirlos en una entera y parte decimal y el almacenamiento de los separado como algo que aquí se sugiere el uso de el siguiente algoritmo de conversión:
como una función mysql almacenado:
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)
y la espalda
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
que necesita ser almacenado en un unsigned int (10), esto funciona en MySQL, así como en sqlite que es sin tipo.
a través de la experiencia, creo que esto funciona muy rápido, si todo lo que necesita es almacenar las coordenadas y recuperarlas para hacer algunas operaciones matemáticas.
en php esos 2 funciones parecen
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
y vuelta a empezar:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
Esto tiene cierta ventaja añadida, así en términos de la creación, por ejemplo, claves únicas memcached con números enteros. (por ejemplo, para almacenar en caché un resultado de geocodificación). Espero que esto agregue valor a la discusión.
Otra aplicación podría ser cuando se está sin extensiones de SIG y simplemente quiere mantener unos pocos millones de esos pares latitud/longitud, puede utilizar particiones en aquellos campos en MySQL para beneficiarse del hecho de que son números enteros:
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 */
¿Cómo es esta pregunta duplicada? Claramente está preguntando sobre la simple base de datos SQL vainilla cuando la otra pregunta (y las respuestas allí también) discuten MySQL específicamente. – Atul
Atul tiene razón, no es la misma pregunta porque el otro especifica que los cálculos se realizarán en lat/lng. Me acabo de dar cuenta de que mi respuesta del otro es la más adecuada aquí, así que por favor échele un vistazo: http://stackoverflow.com/a/25120203/1226018 – Simon
Voy a tocar el timbre, años más tarde. Atul y Simon tienen razón. Estas son preguntas funcionalmente diferentes. Marcar esto como duplicado podría ser equivalente a afirmar que preguntar cómo mantener un registro en una base de datos usando C# y Python son duplicados. –