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