Quel type de données MySQL devrait être utilisé pour Latitude / Longitude avec 8 décimales?

Je travaille avec des données cartographiques et la Latitude/Longitude s’étend à 8 décimales. Par exemple:

 Latitude 40.71727401 Longitude -74.00898606 

J’ai vu dans le document Google qui utilise:

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

Cependant, leurs décimales ne sont que de 6.
Dois-je utiliser FLOAT(10, 8) ou existe-t-il une autre méthode à prendre en compte pour stocker ces données afin qu’elles soient précises. Il sera utilisé avec les calculs de carte. Merci!

DECIMAL est le type de données MySQL pour l’arithmétique exacte. Contrairement à FLOAT, sa précision est fixée pour toute taille de nombre, donc en l’utilisant à la place de FLOAT, vous éviterez peut-être des erreurs de précision lors de certains calculs. Si vous stockiez et récupériez simplement les chiffres sans les calculer, FLOAT serait en pratique sûr, bien qu’il n’y ait pas de mal à utiliser DECIMAL. Avec les calculs, FLOAT est toujours ok, mais pour être sûr de 8d.p. précision, vous devez utiliser DECIMAL.

Les latitudes vont de -90 à +90 (degrés), donc DECIMAL (10, 8) convient bien, mais les longitudes vont de -180 à +180 (degrés), vous avez donc besoin de DECIMAL (11, 8). Le premier nombre est le nombre total de chiffres stockés et le second est le nombre après le point décimal.

En bref: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL

Cela explique comment MySQL fonctionne avec les types de données à virgule flottante.

De plus, vous verrez que les valeurs float arrondies.

 // eg: valeurs données 41.0473112,29.0077011

 flotteur (11,7) |  décimal (11,7)
 ---------------------------
 41.0473099 |  41.0473112
 29.0077019 |  29.0077011

Vous pouvez définir votre type de données comme un entier signé. Lorsque vous stockez les coordonnées en SQL, vous pouvez définir comme lat * 10000000 et long * 10000000. Et lorsque vous sélectionnez avec distance / rayon vous diviserez les coordonnées de stockage en 10000000. J’ai été testé avec des lignes de 300K, le temps de réponse de la requête est bon. (2 x processeur 2,67 GHz, 2 Go de RAM, MySQL 5.5.49)

Le meilleur moyen dans mon cas était de sauvegarder les coordonnées en tant que DOUBLE.

 lat DOUBLE NOT NULL, lng DOUBLE NOT NULL 

Cela économisera la valeur entière sans arrondi.

Si vous devez arrondir la valeur, je vous conseille de faire ce traitement à l’origine des données, par exemple dans l’interface utilisateur.

Utiliser la migration du rbuy sur des 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 

N’utilisez pas float … Il arrondira vos coordonnées, entraînant des occurrences étranges.

Utilisez un nombre décimal