Ich arbeite mit Kartendaten und die Latitude/Longitude
erstreckt sich auf 8 Dezimalstellen. Beispielsweise:
Latitude 40.71727401
Longitude -74.00898606
Ich habe in dem Google-Dokument gesehen, das verwendet:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
Ihre Dezimalstellen gehen jedoch nur auf 6.
Sollte ich eine FLOAT(10, 8)
andere Methode verwenden, um diese Daten so zu speichern, dass sie präzise sind? Es wird mit Kartenberechnungen verwendet. Vielen Dank!
mysql
types
floating-point
Edward
quelle
quelle
float
Typ, der nur 7 Stellen genau ist. Sie benötigen mindestens 9. Sie benötigen keine 10 - die Dokumente zählen aus irgendeinem Grund das Minuszeichen als Ziffer. Tun Sie entweder:double(9,6)
oderdecimal(9,6)
.FLOAT
unterscheidet zwei Elemente in einem Abstand von 1,7 m. All dies ist für "Karten" -Anwendungen lächerlich übertrieben!Antworten:
DECIMAL ist der MySQL-Datentyp für exakte Arithmetik. Im Gegensatz zu FLOAT ist die Genauigkeit für jede Zahlengröße festgelegt. Wenn Sie es also anstelle von FLOAT verwenden, können Sie bei einigen Berechnungen Präzisionsfehler vermeiden. Wenn Sie nur die Zahlen ohne Berechnung speichern und abrufen würden, wäre FLOAT in der Praxis sicher, obwohl die Verwendung von DECIMAL keinen Schaden anrichtet. Mit Berechnungen ist FLOAT meistens noch in Ordnung, aber um absolut sicher zu sein, 8d.p. Präzision sollten Sie DECIMAL verwenden.
Die Breiten reichen von -90 bis +90 (Grad), daher ist DECIMAL (10, 8) dafür in Ordnung, aber die Längen reichen von -180 bis +180 (Grad), sodass Sie DECIMAL (11, 8) benötigen. Die erste Zahl ist die Gesamtzahl der gespeicherten Ziffern und die zweite die Zahl nach dem Dezimalpunkt.
Zusamenfassend:
lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
Dies erklärt, wie MySQL mit Gleitkomma-Datentypen funktioniert.
UPDATE: MySQL unterstützt räumliche Datentypen und
Point
ist ein einwertiger Typ, der verwendet werden kann. Beispiel:quelle
Außerdem sehen Sie, dass die
float
Werte gerundet sind.quelle
double
Datentyp verwenden, der die erforderliche Genauigkeit aufweist.In Laravel wird der Dezimalsäulentyp für die Migration verwendet
Weitere Informationen finden Sie unter verfügbarer Spaltentyp
quelle
Sie können Ihren Datentyp als vorzeichenbehaftete Ganzzahl festlegen. Wenn Sie Koordinaten für SQL speichern, können Sie lat * 10000000 und long * 10000000 festlegen. Und wenn Sie mit Abstand / Radius auswählen, teilen Sie die Speicherkoordinaten auf 10000000. Ich habe es mit 300K Zeilen getestet, die Antwortzeit für Abfragen ist gut. (2 x 2,67 GHz CPU, 2 GB RAM, MySQL 5.5.49)
quelle
Verwenden Sie kein Float ... Es rundet Ihre Koordinaten ab, was zu seltsamen Ereignissen führt.
Verwenden Sie eine Dezimalstelle
quelle
MySQL unterstützt jetzt räumliche Datentypen, seit diese Frage gestellt wurde. Die aktuell akzeptierte Antwort ist also nicht falsch. Wenn Sie jedoch nach zusätzlichen Funktionen suchen, z. B. nach allen Punkten innerhalb eines bestimmten Polygons, verwenden Sie den Datentyp POINT.
Überprüfen Sie die MySQL-Dokumente zu Geodatentypen und den räumlichen Analysefunktionen
quelle
Ich glaube, der beste Weg, Lat / Lng in MySQL zu speichern, besteht darin, eine POINT-Spalte (2D-Datentyp) mit einem SPATIAL-Index zu haben.
quelle
Verwenden Sie Ruby auf Schienen migrieren
quelle
(20,18)
Auch bei +/- 99.Code zur Verwendung / zum Nachweis der Genauigkeit der Antwort von Oğuzhan KURNUÇ .
ZUSAMMENFASSUNG:
Große Präzision (~ 1 cm) bei kleiner Größe (4B).
Die Genauigkeit beträgt (sehr nahe an) 7 Dezimalstellen für Werte über dem Bereich [-180, 180].
Das sind 7 Stellen rechts von der Dezimalstelle (~ 1 cm) , also insgesamt 9 Stellen (oder 10 Stellen, wenn die anfängliche "1" von "180" gezählt wird) in der Nähe von + -180.
Vergleichen Sie dies mit einem 4-Byte-Float , der insgesamt nur ~ 7 Stellen hat, also ~ 5 Stellen rechts von der Dezimalstelle in der Nähe von + = 180 (~ 1 m) .
Methoden zur Verwendung dieses Ansatzes:
Präzisionstests:
Hilfsmethoden für Tests:
quelle