¿Qué tipo de datos MySQL se debe utilizar para Latitud / Longitud con 8 decimales?


Estoy trabajando con datos de mapas, y el Latitude/Longitude se extiende a 8 decimales. Por ejemplo:

Latitude 40.71727401
Longitude -74.00898606

Vi en el documento de Google que utiliza:

lat FLOAT( 10, 6 ) NOT NULL,  
lng FLOAT( 10, 6 ) NOT NULL

Sin embargo, sus 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 utilizará con los cálculos del mapa. ¡Gracias!

Author: pnuts, 2012-09-20

6 answers

DECIMAL es el tipo de datos MySQL para la aritmética exacta. A diferencia de FLOAT, su precisión es 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 daño en usar DECIMAL. Con los cálculos de FLOTACIÓN sigue siendo en su mayoría aceptable, pero para estar absolutamente seguro de 8d. p. precisión debe utilizar DECIMAL.

Las latitudes van de -90 a +90 (grados), por lo que DECIMAL(10, 8) está bien para eso, pero las longitudes van 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 tipos de datos de coma flotante.

 439
Author: gandaliter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-19 23:46:43

Además, verá que float valores redondeados.

// e.g: given values 41.0473112,29.0077011

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

 11
Author: K-Gun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 19:01:06

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

 5
Author: Oğuzhan KURNUÇ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-09 23:59:40

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

lat DOUBLE NOT NULL,  
lng DOUBLE NOT NULL

Guardará el valor completo sin redondear.

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

 1
Author: tioperez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 07:18:53

Usando migrar ruby on 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
 0
Author: gilcierweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 18:20:25

No utilice float... Rodeará sus coordenadas, lo que resultará en algunas ocurrencias extrañas.

Use decimal

 0
Author: Sam Sabey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-27 01:13:18