Wie genau sollte ich Breiten- und Längengrade speichern?


103

Ich habe diese Frage hier gelesen:

Welcher Datentyp soll beim Speichern von Breiten- und Längengraddaten in SQL-Datenbanken verwendet werden?

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?

  1. Listenpunkt
  2. x00 = 6000 Meilen
  3. xx0 = 600 Meilen
  4. xxx = 60 Meilen
  5. xxx.x = 6 Meilen
  6. xxx.xx = 0,6 Meilen
  7. etc?

7
Die Genauigkeit der Koordinaten hängt davon ab, wo sich diese Koordinaten befinden, da die Oberfläche des Planeten keine perfekte Kugel ist und der Abstand zu den Polen ebenfalls ein wichtiger Faktor ist. Durchschnittlich 3 Dezimalstellen sind jedoch etwa 120 Meter. 4 Dezimalstellen wären 12 Meter / 40 Fuß usw.
Marc B

1
Siehe diese Frage auf GIS Stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

Antworten:


191

Genauigkeit versus Dezimalstellen am Äquator

decimal  degrees    distance
places
-------------------------------  
0        1.0        111 km
1        0.1        11.1 km
2        0.01       1.11 km
3        0.001      111 m
4        0.0001     11.1 m
5        0.00001    1.11 m
6        0.000001   0.111 m
7        0.0000001  1.11 cm
8        0.00000001 1.11 mm

ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision


4
Wenn sich diese am Äquator befinden, bedeutet dies, dass es sich um Worst-Case-Fehler handelt?
Liath

6
Eigentlich ist Äquator der beste Fall. Ein Breiten- und ein Längengrad sind am Äquator (69 Meilen) gleich groß, aber ein Längengrad schrumpft auf Null, wenn er sich einem der Pole nähert. Hier ist eine sehr schöne Erklärung: nationalatlas.gov/articles/mapping/a_latlong.html#four
Codingoutloud

11
@codingoutloud Was würde diese Worst-Case-Fehler machen. Oder um pedantisch zu sein, dies sind Worst-Case-Fehler bei der Verwendung von Lat / Lon auf Meereshöhe. Bei einer Höhe von 6.378 m steigt der Fehler um 0,1%.
Scott B

@ Codingoutload: Dieser Link ist anscheinend nicht mehr vorhanden :(
Tom Stambaugh

1
@ Tom Stambaugh: Dafür gibt es web.archive.org: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger

19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

Wenn Sie eine Genauigkeit von 15 m wünschen, wählen Sie 4 Stellen. Sodecimal(9,6)


9
Wenn Sie SQL Server verwenden ... Beachten Sie, dass bei einer Genauigkeit von 1-9 5 Byte verwendet werden. Sie haben also möglicherweise eine Dezimalstelle (9,6) anstelle einer Dezimalstelle (7,4) verwendet und die höhere Genauigkeit genutzt, da beide den gleichen Platz beanspruchen.
Theo

Verwenden Sie für den Breitengrad (8,6)(oder (6,4)um ein Byte zu speichern (in MySQL).
Rick James

15

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].


4
Ich stimme zwar zu, dass 17 Ziffern zu viel sind, aber ich schlage vor, dass 6 zu wenig sind, wenn die Daten nachbearbeitet werden sollen. Wenn Sie beispielsweise eine Radiusabfrage ausführen ("Antwortfunktionen innerhalb eines Radius von 0,5 Meilen um diesen Punkt"), werden Fehler - einschließlich Kürzungen - vergrößert. Wenn Sie 6 Dezimalstellen für die Ausgabe einer solchen Abfrage benötigen, sollte die Eingabe mit deutlich mehr beginnen. In unserem Shop wird in der Regel DECIMAL (18,15) verwendet. Unser Ziel ist es sicherzustellen, dass die Datenbank nicht der begrenzende Faktor für die Genauigkeit räumlicher Berechnungen ist.
Tom Stambaugh

Das Überschreiten von 6 Dezimalstellen geht über die verfügbare Genauigkeit heutiger GPS-Satelliten hinaus. Die Nachbearbeitung führt nicht zu einer signifikanten Fehlermenge. DECIMAL(18,15)dauert 9 Bytes.
Rick James

11

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:

  • 0,01524 / 110,574 = 1/7255 eines Breitengrads
  • 0,01524 / 111,320 = 1/7304 eines Längengrades

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.


5

Unter Berücksichtigung der verschiedenen Teile einer Kugel und eines diagonalen Abstands finden Sie hier eine Tabelle der verfügbaren Präzisionen:

   Datatype           Bytes       resolution
   ------------------ -----  --------------------------------
   Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
   DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
   SMALLINT scaled        4   682 m    0.4 mi  Cities
   Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
   DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
   MEDIUMINT scaled       6   2.7 m    8.8 ft
   FLOAT                  8   1.7 m    5.6 ft
   DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
   Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
   DOUBLE                16   3.5nm     ...    Fleas on a dog

- http://mysql.rjweb.org/doc.php/latlng#representation_choices


3

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.


FLOATund DOUBLE, in diesem Zusammenhang , leidet nicht an einige der Fragen , die Sie beschreiben.
Rick James

@ RickJames Sie haben "diesen Kontext" nicht ausreichend angegeben. Wenn Sie meinen, streng in der Speicherung eines Wertes in zwei DB-Spalten, dann vielleicht. Bestimmte Werte befinden sich jedoch nicht nur in nicht verwendeten DB-Spalten, sondern implizit in der Annahme, dass (Proximity-) Abfragen für diese Werte geschrieben werden. Und diese ziemlich pragmatische Annahme zu halten, bedeutet dann, dass alle Probleme, die eine unzuverlässige Annäherung darstellen, weiterhin bestehen.
chaotisches Gleichgewicht

1
Wenn ein FLOATWert 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, zwei FLOATs( DOUBLEsoder ungefähre DECIMALs) mit '=' zu vergleichen.
Rick James

Sie scheinen den Punkt zu verfehlen. Jede versuchte Abfrage wird implizit mit equals verwendet, wenn nicht explizit. Dies setzt voraus, dass Sie nicht mit den Werten durch andere Ebenen und Sprachen gehen und sich ausschließlich in SQL Server aufhalten. Hier ist eine offizielle Antwort von Microsoft für SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
chaotic3quilibrium

Es tut mir leid, ich dachte, die Frage wurde markiert [mysql], nicht SQL Server.
Rick James

2

Wenn Sie in Google Maps auf Standorte klicken, erhalten Sie Breiten- und Längengrade mit 7 Dezimalstellen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.