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