¿Qué tipo de datos MySQL debería usarse para Latitud / Longitud con 8 lugares decimales?

Estoy trabajando con datos de mapas, y la Latitude/Longitude extiende a 8 lugares 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 posiciones decimales solo van a 6.
¿Debo usar FLOAT(10, 8) o hay otro método a considerar para almacenar estos datos por lo que es preciso. Se usará con cálculos de mapas. ¡Gracias!

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 estuvieras almacenando y recuperando los números sin cálculo, entonces, en la práctica, FLOAT estaría a salvo, aunque no hay daño al usar DECIMAL. Con los cálculos, FLOAT aún está bien, pero estar absolutamente seguro de 8d.p. precisión debes usar DECIMAL.

Las latitudes oscilan entre -90 y +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 la cantidad 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 MySQL funciona con tipos de datos de coma flotante.

Además, verá que los valores float se redondean.

 // eg: valores dados 41.0473112,29.0077011

 flotar (11,7) |  decimal (11,7)
 ---------------------------
 41.0473099 |  41.0473112
 29.0077019 |  29.0077011

Puede configurar su tipo de datos como un entero con signo. Cuando las coordenadas de almacenamiento a SQL pueden establecerse como lat * 10000000 y long * 10000000. Y al seleccionar con distancia / radio, dividirá las coordenadas de almacenamiento en 10000000. Lo probé con 300K filas, el tiempo de respuesta de la consulta es bueno. (CPU 2 x 2.67 GHz, 2 GB de RAM, MySQL 5.5.49)

La mejor manera en mi caso fue guardar coordenadas como DOBLE.

 lat DOUBLE NOT NULL, lng DOUBLE NOT NULL 

Guardará el valor completo sin ningún redondeo.

Si necesita redondear el valor, mi consejo es que este tratamiento se realiza en el origen de los datos, por ejemplo, en la IU.

Usando migrar ruby ​​en los Rails

 class CreateNeighborhoods < ActiveRecord::Migration[5.0] def change create_table :neighborhoods do |t| t.string :name t.decimal :latitude, precision: 15, scale: 13 t.decimal :longitude, precision: 15, scale: 13 t.references :country, foreign_key: true t.references :state, foreign_key: true t.references :city, foreign_key: true t.timestamps end end end 

No use flotador … Va a redondear sus coordenadas, lo que resulta en algunas ocurrencias extrañas.

Usar decimal