una tipo longitud latitud guardar dato coordenada sql database geocoding latitude-longitude

guardar - ¿Qué tipo de datos usar cuando se almacenan datos de latitud y longitud en bases de datos SQL?



longitud y latitud mysql (8)

Al almacenar datos de latitud o longitud en una base de datos compatible con ANSI SQL, ¿qué tipo de datos sería el más apropiado? ¿Debería usarse float , o decimal , o ...?

Soy consciente de que Oracle, MySql y SQL Server han agregado algunos tipos de datos especiales específicamente para el manejo de datos geográficos, pero estoy interesado en cómo almacenaría la información en una base de datos SQL "simple".


Bueno, usted preguntó cómo almacenar la latitud / longitud y mi respuesta es: No, puede considerar usar el WGS 84 (en Europa ETRS 89 ) como es el estándar para las referencias Geo.

Pero aparte de ese detalle, utilicé un tipo definido por el usuario en los días previos a que SQL 2008 incluyera finalmente el soporte geográfico.


Creo que depende de las operaciones que necesitará hacer con más frecuencia.

Si necesita el valor completo como un número decimal, use el decimal con la escala y la precisión adecuadas. Flotar está más allá de tus necesidades, creo.

Si va a convertir a / desde la notación de fracción degºmin''sec "a menudo, consideraría almacenar cada valor como un tipo entero (smallint, tinyint, tinyint, smallint?).



En Oracle de vainilla, la función denominada LOCATOR (una versión paralizada de Spatial) requiere que los datos de coordenadas se almacenen utilizando el tipo de datos NUMBER (sin precisión). Cuando intente crear índices basados ​​en funciones para admitir consultas espaciales, se atragantará de lo contrario.


Puede almacenar fácilmente un número decimal lat / lon en un campo entero sin signo, en lugar de dividirlos en una parte entera y decimal y almacenarlos por separado como se sugiere aquí usando el siguiente algoritmo de conversión:

como una función mysql almacenada:

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 de vuelta

CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7)) RETURNS int(10) DETERMINISTIC RETURN s * 600000

Eso debe almacenarse en un int sin signo (10) , esto funciona en mysql, así como en sqlite, que no tiene tipo.

a través de la experiencia, encuentro que esto funciona muy rápido, si todo lo que necesitas es almacenar las coordenadas y recuperarlas para hacer algunos cálculos matemáticos.

en PHP esas 2 funciones parecen

function LatitudeSmallToFloat($LatitudeSmall){ if(($LatitudeSmall>0)&&($LatitudeSmall>>31)) $LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1; return (float)$LatitudeSmall/(float)600000; }

y de regreso:

function LatitudeFloatToSmall($LatitudeFloat){ $Latitude=round((float)$LatitudeFloat*(float)600000); if($Latitude<0) $Latitude+=0xFFFFFFFF; return $Latitude; }

Esto tiene una ventaja adicional, además de crear, por ejemplo, claves únicas de memcached con enteros. (por ejemplo: para cachear un resultado de geocodificación). Espero que esto agregue valor a la discusión.

Otra aplicación podría ser cuando no tiene extensiones GIS y simplemente desea conservar algunos millones de esos pares lat / lon, puede usar particiones en esos campos en mysql para beneficiarse del hecho de que son 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 */


Usamos float, pero cualquier sabor numérico con 6 decimales también debería funcionar.


Yo usaría un decimal con la precisión adecuada para sus datos.


Decimal(9,6)

Si no estás acostumbrado a los parámetros de precisión y escala, aquí hay una cadena de formato visual:

###.######