Estoy trabajando con datos de mapas, y se Latitude/Longitude
extiende a 8 decimales. Por ejemplo:
Latitude 40.71727401
Longitude -74.00898606
Vi en el documento de Google que usa:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
sin embargo, sus lugares decimales solo van a 6.
¿Debo usar FLOAT(10, 8)
o hay otro método a considerar para almacenar estos datos para que sea preciso? Se usará con los cálculos del mapa. ¡Gracias!
mysql
types
floating-point
Eduardo
fuente
fuente
float
tipo, que solo tiene 7 dígitos de precisión. Necesita al menos 9. No necesita 10: los documentos por alguna extraña razón cuentan el signo menos como un dígito. Hacer ya sea:double(9,6)
odecimal(9,6)
.FLOAT
distingue dos elementos separados 1.7m (5.6ft). ¡Todos estos son ridículamente excesivos para las aplicaciones de "mapas"!Respuestas:
DECIMAL es el tipo de datos MySQL para la aritmética exacta. A diferencia de FLOAT, su 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 cálculo, en la práctica FLOAT sería seguro, aunque no hay ningún daño en usar DECIMAL. Con los cálculos, FLOAT todavía está bien, pero para estar absolutamente seguro de 8d.p. precisión debe 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 breve:
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.
ACTUALIZACIÓN: MySQL admite tipos de datos espaciales y
Point
es un tipo de valor único que se puede utilizar. Ejemplo:fuente
Además, verá que los
float
valores son redondeados.fuente
double
tipo de datos, que tiene la precisión necesaria.en laravel utiliza el tipo de columna decimal para la migración
para más información ver tipo de columna disponible
fuente
Puede establecer su tipo de datos como entero con signo. Cuando almacena coordenadas en SQL, puede establecerlas como lat * 10000000 y long * 10000000. Y cuando selecciona con distancia / radio, dividirá las coordenadas de almacenamiento en 10000000. Lo probé con 300K filas, el tiempo de respuesta de la consulta es bueno. (2 x 2.67GHz CPU, 2 GB de RAM, MySQL 5.5.49)
fuente
No use flotador ... Redondeará sus coordenadas, dando como resultado algunos sucesos extraños.
Usar decimal
fuente
MySQL ahora tiene soporte para tipos de datos espaciales ya que se hizo esta pregunta. Por lo tanto, la respuesta aceptada actual no es incorrecta, pero si está buscando una funcionalidad adicional como encontrar todos los puntos dentro de un polígono dado, use el tipo de datos POINT.
Consulte los documentos de Mysql sobre tipos de datos geoespaciales y las funciones de análisis espacial
fuente
Creo que la mejor manera de almacenar Lat / Lng en MySQL es tener una columna POINT (tipo de datos 2D) con un índice ESPACIAL.
fuente
Usando migrate ruby on rails
fuente
(20,18)
también supera en +/- 99.Código para usar / probar la precisión de la respuesta de Oğuzhan KURNUÇ .
RESUMEN:
Gran precisión (~ 1 cm) en un tamaño pequeño (4B).
La precisión es (muy cercana a) 7 dígitos decimales para valores superiores al rango [-180, 180].
Eso es 7 dígitos a la derecha del decimal (~ 1 cm) , para un total de 9 dígitos (o 10 dígitos, si se cuenta el "1" inicial de "180") cerca de + -180.
Contraste esto con un flotante de 4 bytes , que tiene solo ~ 7 dígitos en total, por lo que ~ 5 dígitos a la derecha del decimal cerca de + = 180 (~ 1m) .
Métodos para usar este enfoque:
Pruebas de precisión:
Métodos auxiliares utilizados por las pruebas:
fuente