Ich habe diese Frage hier gelesen:
Und es scheint, dass der allgemeine Konsens darin besteht, dass die Verwendung von Dezimal (9,6) der richtige Weg ist. Die Frage für mich ist, wie genau brauche ich das wirklich?
Beispielsweise gibt die Google-API ein Ergebnis zurück wie:
"lat": 37.4219720,
"lng": -122.0841430
Wie viele Ziffern benötige ich von -122.0841430? Ich habe mehrere Anleitungen gelesen, aber ich kann nicht genug Sinn daraus machen, um dies herauszufinden.
Genauer gesagt in meiner Frage: Wenn ich innerhalb von 50 Fuß von der genauen Position genau sein möchte, wie viele Dezimalstellen muss ich speichern?
Vielleicht wäre eine bessere Frage tatsächlich eine nicht programmierende Frage, aber es wäre: Wie viel genauer gibt Ihnen jeder Dezimalpunkt?
Ist es so einfach?
- Listenpunkt
- x00 = 6000 Meilen
- xx0 = 600 Meilen
- xxx = 60 Meilen
- xxx.x = 6 Meilen
- xxx.xx = 0,6 Meilen
- etc?
mysql
geolocation
Bürger
quelle
quelle
Antworten:
Genauigkeit versus Dezimalstellen am Äquator
ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision
quelle
Wenn Sie eine Genauigkeit von 15 m wünschen, wählen Sie 4 Stellen. So
decimal(9,6)
quelle
(8,6)
(oder(6,4)
um ein Byte zu speichern (in MySQL).Ich entwerfe Datenbanken und beschäftige mich seit einiger Zeit mit dieser Frage. Wir verwenden eine Standardanwendung mit einem Oracle-Backend, bei dem die Datenfelder so definiert wurden, dass 17 Dezimalstellen zulässig sind. Lächerlich! Das ist in Tausendstel Zoll. Kein GPS-Instrument auf der Welt ist so genau. Lassen Sie uns also 17 Dezimalstellen beiseite legen und uns mit dem Praktischen befassen. Die Regierung garantiert, dass ihr System bis zu einer "Worst-Case" -Pseudorange-Genauigkeit von 7,8 Metern bei einem Konfidenzniveau von 95% gut ist. Anschließend hat die tatsächliche FAA (unter Verwendung ihrer hochwertigen Instrumente) gezeigt, dass GPS-Messwerte normalerweise gut sind innerhalb eines Meters.
Sie müssen sich also zwei Fragen stellen: 1) Woher stammen Ihre Werte? 2) Wofür werden die Daten verwendet?
Handys sind nicht besonders genau und Google / MapQuest-Messwerte sind wahrscheinlich nur bis zu 4 oder 5 Dezimalstellen gut. Mit einem hochwertigen GPS-Instrument erhalten Sie möglicherweise 6 (innerhalb der USA). Mehr zu erfassen ist jedoch eine Verschwendung von Schreib- und Speicherplatz. Wenn nach den Werten gesucht wird, ist es für einen Benutzer außerdem gut zu wissen, dass 6 das Beste ist, nach dem er suchen sollte (offensichtlich sollte jeder eingegebene Suchwert zuerst mit der gleichen Genauigkeit gerundet werden wie der gesuchte Datenwert ).
Wenn Sie lediglich einen Standort in Google Maps anzeigen oder in ein GPS einfügen, um dorthin zu gelangen, sind vier oder fünf ausreichend.
Ich muss über die Leute hier lachen, die all diese Ziffern eingeben. Und wo genau nehmen sie diese Messung vor? Haustürknauf? Mailbox vor der Tür? Zentrum des Gebäudes? Spitze des Zellturms? UND ... nehmen alle es konsequent am selben Ort ein?
Als gutes Datenbankdesign würde ich Werte von einem Benutzer für vielleicht ein paar mehr als fünf Dezimalstellen akzeptieren, dann aus Gründen der Konsistenz nur fünf runden und erfassen [vielleicht sechs, wenn Ihre Instrumente gut sind und Ihre Endanwendung dies rechtfertigt].
quelle
DECIMAL(18,15)
dauert 9 Bytes.Der Abstand zwischen den einzelnen Breitengraden variiert aufgrund der Form der Erde, und der Abstand zwischen den einzelnen Längengraden wird kleiner, wenn Sie sich den Polen nähern. Sprechen wir also über den Äquator, bei dem der Abstand zwischen den einzelnen Graden 110,574 km für den Breitengrad und 111,320 km für den Längengrad beträgt.
50ft ist 0.01524km, also:
Sie benötigen vier Ziffern mit einer Genauigkeit von insgesamt sieben Ziffern, die ausreicht, um auf Zehntausendstel Grad herunterzufahren.
DECIMAL(7,4)
sollte genug für Ihre Bedürfnisse sein.quelle
Unter Berücksichtigung der verschiedenen Teile einer Kugel und eines diagonalen Abstands finden Sie hier eine Tabelle der verfügbaren Präzisionen:
- http://mysql.rjweb.org/doc.php/latlng#representation_choices
quelle
Speichern Sie keine Gleitkommawerte. Sie können zwar annehmen, dass sie korrekt sind, aber nicht. Sie sind eine Annäherung. Und es stellt sich heraus, dass verschiedene Sprachen unterschiedliche Methoden zum "Parsen" der Gleitkommainformationen haben. Unterschiedliche Datenbanken haben unterschiedliche Methoden zum Implementieren der Wertannäherungen.
Verwenden Sie stattdessen einen Geohash . Dieses Video stellt den Geohash in weniger als 5 Minuten vor und erklärt ihn visuell. Der Geohash ist bei weitem die überlegene Methode, um Längen- / Breitengradinformationen auf konsistente Weise zu codieren / decodieren. Indem Sie die angenäherten Gleitkommawerte eines Längen- / Breitengrads niemals in Datenbankspalten "serialisieren" und stattdessen einen Geohash verwenden, erhalten Sie die gleichen wünschenswerten Roundtrip-Konsistenzgarantien, die Sie mit String-Werten erhalten. Diese Website hilft Ihnen beim Spielen mit einem Geohash.
quelle
FLOAT
undDOUBLE
, in diesem Zusammenhang , leidet nicht an einige der Fragen , die Sie beschreiben.FLOAT
Wert und der 'nächste' Wert so nahe beieinander liegen, dass Sie eine Stadt (oder ein Fahrzeug oder eine Person oder einen Floh) nicht von einer anderen unterscheiden können, spielen die Rundungs- und Darstellungsfehler keine Rolle. Inzwischen ist es fast immer töricht, zweiFLOATs
(DOUBLEs
oder ungefähreDECIMALs
) mit '=' zu vergleichen.[mysql]
, nicht SQL Server.Wenn Sie in Google Maps auf Standorte klicken, erhalten Sie Breiten- und Längengrade mit 7 Dezimalstellen
quelle