Je travaille avec des données cartographiques, et le Latitude/Longitude
é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, leur décimale ne passe qu'à 6.
Dois-je utiliser FLOAT(10, 8)
ou existe-t-il une autre méthode à considérer pour stocker ces données afin qu'elles soient précises. Il sera utilisé avec des calculs de carte. Merci!
mysql
types
floating-point
Edward
la source
la source
float
type - qui n'a que 7 chiffres de précision. Vous avez besoin d'au moins 9. Vous n'avez pas besoin de 10 - les documents pour une raison étrange comptent le signe moins comme un chiffre. Faites soit:double(9,6)
oudecimal(9,6)
.FLOAT
distingue deux éléments distants de 1,7 m (5,6 pieds). Tous ces éléments sont ridiculement excessifs pour les applications "cartographiques"!Réponses:
DECIMAL est le type de données MySQL pour l'arithmétique exacte. Contrairement à FLOAT, sa précision est fixée pour n'importe quelle taille de nombre, donc en l'utilisant à la place de FLOAT, vous pouvez éviter les erreurs de précision lors de certains calculs. Si vous stockiez et récupériez simplement les nombres sans calcul, alors dans la pratique, FLOAT serait sûr, bien qu'il n'y ait aucun mal à utiliser DECIMAL. Avec les calculs, FLOAT est toujours correct, mais pour être absolument sûr de 8d.p. précision, vous devez utiliser DECIMAL.
Les latitudes varient de -90 à +90 (degrés), donc DECIMAL (10, 8) est correct pour cela, mais les longitudes varient 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 la virgule décimale.
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.
MISE À JOUR: MySQL prend en charge les types de données spatiales et
Point
est un type à valeur unique qui peut être utilisé. Exemple:la source
De plus, vous verrez que les
float
valeurs sont arrondies.la source
double
type de données, qui a la précision requise.dans laravel utilisé le type de colonne décimale pour la migration
pour plus d'informations, voir le type de colonne disponible
la source
Vous pouvez définir votre type de données comme 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 divisez les coordonnées de stockage à 10000000. Je l'ai testé avec 300K lignes, le temps de réponse aux requêtes est bon. (2 x 2,67 GHz, 2 Go de RAM, MySQL 5.5.49)
la source
N'utilisez pas de flotteur ... Il arrondira vos coordonnées, ce qui entraînera des événements étranges.
Utiliser décimal
la source
MySQL prend désormais en charge les types de données spatiales depuis que cette question a été posée. La réponse actuellement acceptée n'est donc pas fausse, mais si vous recherchez des fonctionnalités supplémentaires telles que la recherche de tous les points dans un polygone donné, utilisez le type de données POINT.
Consultez la documentation de Mysql sur les types de données géospatiales et les fonctions d'analyse spatiale
la source
Je crois que la meilleure façon de stocker Lat / Lng dans MySQL est d'avoir une colonne POINT (type de données 2D) avec un index SPATIAL.
la source
Utilisation de Migrate Ruby sur des rails
la source
(20,18)
arrive également à +/- 99.Code pour utiliser / prouver la précision de la réponse d' Oğuzhan KURNUÇ .
RÉSUMÉ:
Grande précision (~ 1 cm) dans une petite taille (4B).
La précision est (très proche de) 7 chiffres décimaux pour les valeurs supérieures à la plage [-180, 180].
Cela fait 7 chiffres à droite de la décimale (~ 1 cm) , pour un total de 9 chiffres (ou 10 chiffres, si l'on compte le "1" initial de "180") près de + -180.
Comparez cela avec un flottant de 4 octets , qui n'a que ~ 7 chiffres au total, donc ~ 5 chiffres à droite de la décimale près de + = 180 (~ 1 m) .
Méthodes pour utiliser cette approche:
Tests de précision:
Méthodes auxiliaires utilisées par les tests:
la source