Tipo de datos decimal o de punto para almacenar datos de ubicación geográfica en MySQL


8

Quiero almacenar la ubicación geográfica de cada dirección en mi tabla "tblAddress" de MySQL (Innodb) y creo que tengo 2 opciones:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Mi programa necesita encontrar todas las direcciones que se encuentran dentro de un radio de 1 kilómetro desde la ubicación actual (cliente móvil)

También el siguiente comando no funciona para mí, no estoy seguro de lo que necesito tener para esto.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Entonces, ¿cuál es el enfoque sugerido para almacenar datos para un cálculo y recuperación más rápidos aquí. Por favor avise.

Respuestas:


6

Puede usar las extensiones espaciales de MySQL con SIG.

En un ejemplo de código de Google que muestra puntos en un mapa, dicen:

Cuando crea la tabla MySQL, desea prestar especial atención a los atributos lat y lng. Con las capacidades de zoom actuales de Google Maps, solo debería necesitar 6 dígitos de precisión después del decimal.

Para mantener al mínimo el espacio de almacenamiento requerido para nuestra tabla, puede especificar que los atributos lat y lng sean flotantes de tamaño (10,6). Eso permitirá que los campos almacenen 6 dígitos después del decimal, más hasta 4 dígitos antes del decimal, por ejemplo, -123.456789 grados. No me preocuparía por las diferencias de rendimiento entre los tipos numéricos. Los índices decentes tendrán un efecto mucho mayor.

También puedes probar DECIMALcomo sugiere @ gandaliter .

DECIMALes el tipo de datos MySQL para aritmética exacta. A diferencia de FLOATsu precisión, se fija para cualquier tamaño de número, por lo que, al usarlo en lugar de FLOAT, puede evitar errores de precisión al hacer algunos cálculos. Si solo estuviera almacenando y recuperando los números sin calcular, en la práctica FLOAT sería seguro, aunque no hay ningún daño en el uso DECIMAL. Con los cálculos FLOATtodavía está bien, pero para estar absolutamente seguro de 8d.p. precisión que debes usar DECIMAL.

Las latitudes varían de -90 a +90 (grados), por lo que DECIMAL(10,8)está bien para eso, pero las longitudes varían de -180 a +180 (grados), por lo que necesita DECIMAL(11,8). El primer número es el número total de dígitos almacenados, y el segundo es el número después del punto decimal. En resumen: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL esto explica cómo funciona MySQL con los tipos de datos de punto flotante.

Información relacionada:


Gracias @oNare por su explicación detallada y referencias. Vi la sugerencia de gandaliter en la pregunta ( stackoverflow.com/questions/12504208/… ). También he visto la sugerencia de ypercube aquí ( stackoverflow.com/questions/9560147/… ).
Prabhat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.