tipo longitud latitud guardar geograficas datos dato coordenadas mysql types floating-point

mysql - guardar - latitud y longitud tipo de dato sql



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

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!


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

// e.g: given values 41.0473112,29.0077011 float(11,7) | decimal(11,7) --------------------------- 41.0473099 | 41.0473112 29.0077019 | 29.0077011


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

This explica cómo MySQL funciona con tipos de datos de coma flotante.


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.


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

Usar decimal


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)


Usando migrar ruby ​​en los rieles

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