richtige/beste Typ für die Speicherung von Längen-und Breitengrad
In einem system-level-Programmiersprache wie C, C++, C oder D, was ist der beste Typ/Codierung für die Speicherung von Längen-und Breitengrad?
Die Optionen, die ich sehe sind:
- IEEE-754 FP als Grad-oder Bogenmaß
- Grad oder Bogenmaß gespeichert als fixed-point-Wert in einen 32-oder 64-bit int
- Zuweisung eines integer-range-Grad-Bereich: ->
deg = (360/2^32)*val
- Grad, Minuten, Sekunden und Bruchteilen von Sekunden gespeichert, die als bit-Felder in einer int -
- eine Struktur, in irgendeiner Form.
Die einfache Lösung (FP) hat den großen Nachteil, dass es sehr non-uniform-Auflösung (irgendwo in England, es Messen kann, in Mikron, die in Japan über, kann es auch nicht). Auch dieser hat alle Fragen der FP-Vergleich und so weiter. Die anderen Optionen erfordern zusätzlichen Aufwand in den verschiedenen teilen des Daten-Lebenszyklus. (generation, Präsentation, Berechnungen etc.)
Eine interessante option ist ein unverankerter Genauigkeit geben, dass, wo die Breite erhöhen, es wird mehr bits und die Länge wird weniger (als Sie zusammen näher an den Polen).
Fragen, die nicht ganz decken:
- Was ist der ideale Datentyp zu verwenden, wenn die Speicherung der breiten - /Längengrade in einer MySQL
- Arbeiten mit Breitengrad/Längengrad-Werte in Java
BTW: 32 bit, Ihnen eine E/W Auflösung am äquator von etwa 0,3 in. Dies ist in der Nähe der Skala, die high-grade-GPS-setups kann (IIRC, die Sie bekommen können bis zu etwa 0,5 in in einigen Modi).
OTOH, wenn die 32 bits gleichmäßig verteilt über die Oberfläche der Erde, können Sie die index-Quadrate von etwa 344m auf Seite 5 Bytes geben 21m, 6B->1,3 m und 8B->5mm.
Habe ich nicht eine bestimmte Verwendung im Sinn jetzt aber gearbeitet haben mit dieser Art der Sache vor und erwarten wieder, irgendwann.
InformationsquelleAutor der Frage BCS | 2008-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg ist es nur, um es zu speichern als float/double in Grad. Positiv für N und E, negativ für S und W. Nur daran erinnern, dass Minuten und Sekunden sind von 60 (so, 31 45 ' N 31.75). Es ist leicht zu verstehen, was die Werte sind, indem Sie betrachten und, wo notwendig, die Umwandlung in Bogenmaß ist trivial.
Berechnungen auf breiten-und Längengrade wie die Ein Großer Kreis Entfernung zwischen zwei Koordinaten, die sich stark auf die trigonometrischen Funktionen, die in der Regel verdoppelt. Jedes andere format wird verlassen sich auf eine andere Implementierung der Sinus -, Cosinus -, atan2 und Wurzel, bei einem minimum. Beliebiger Genauigkeit zahlen (z.B. BigDecimal Java) wird nicht für diese Arbeit. So etwas wie das int wo die 2^32 ist gleichmäßig ist haben ähnliche Probleme.
Den Punkt der Homogenität hat sich in mehreren Kommentaren. Auf diese werde ich einfach zur Kenntnis, dass die Erde, mit Bezug auf die Länge, die ist nicht einheitlich. Eine Bogen-Sekunde Länge, in der Polarkreis ist eine kürzere Strecke als am Äquator. Double-precision-floats geben sub-Millimeter-Präzision überall auf der Erde. Ist diese nicht ausreichend? Wenn nicht, warum nicht?
Würd es auch erwähnenswert, was Sie tun möchten, dass die Informationen, wie die Arten von Berechnungen, die Sie benötigen werden, haben einen Einfluss auf das, was Speicher-format, das Sie verwenden.
InformationsquelleAutor der Antwort cletus
Längen-und Breitengraden sind in der Regel nicht bekannt, keine größere Genauigkeit als 32-bit-float. Also, wenn Sie sich sorgen über Speicherplatz, die Sie verwenden können, schwebt. Aber im Allgemeinen ist es bequemer, die Arbeit mit zahlen als verdoppelt.
Bogenmaß sind bequemer für die theoretische Mathematik. (Zum Beispiel, die Ableitung von Sinus ist-Cosinus-nur, wenn Sie verwenden Sie Bogenmaß.) Aber Grad sind in der Regel besser vertraut und leichter für die Menschen zu interpretieren, so möchten Sie vielleicht zu halten mit Grad.
InformationsquelleAutor der Antwort John D. Cook
Dezimal-Darstellung mit einer Genauigkeit von 8 sollte mehr als genug sein, laut diesem wikipedia-Artikel über Dezimalgrad.
InformationsquelleAutor der Antwort Pykler
Könnten die von dir genannten Probleme mit floating-point-Werte zu einem Problem werden? Wenn die Antwort Nein ist, würde ich vorschlagen, einfach mit der Radiant-Wert in double-precision - du wirst es brauchen, wenn Sie tun werden, trigonometrische Berechnungen sowieso.
Ob es möglicherweise ein Problem mit Präzisions-Verlust bei der Verwendung von Doppel-oder-werden Sie nicht tun, Trigonometrie, würde ich vorschlagen, dass Sie Ihre Lösung der Zuordnung zu einer integer-Bereich - dies wird Ihnen die beste Auflösung, kann leicht umgewandelt werden, um was auch immer Anzeige-format Sie sind Gebietsschema verwenden werden, und - nach der Auswahl einer geeigneten 0-meridian - konvertieren verwendet werden kann, um floating-point-Werte von hoher Präzision.
PS: ich habe mich immer gefragt, warum es scheint niemand, der verwendet geozentrische sphärische Koordinaten - Sie sollte einigermaßen in der Nähe der geographischen Koordinaten, und nicht alle diese fancy Mathe auf Sphäroide zu tun Berechnungen; zum Spaß, ich wollte zu konvertieren, Gauß-Krüger-Koordinaten (die in der deutschen Katasteramt) GPS-Koordinaten - lassen Sie mich Ihnen sagen, das war hässlich: verwendet man das Bessel-ellipsoid, die anderen WGS84, und die Gauss-Krüger-mapping selbst ist ziemlich verrückt auf seine eigene...
InformationsquelleAutor der Antwort Christoph
0,3 Zoll Auflösung immer bis zu dem Punkt, wo Erdbeben über ein paar Jahre machen einen Unterschied. Möchten Sie vielleicht zu überdenken, warum Sie glauben, Sie brauchen eine solche feine Auflösung weltweit.
Einige der spreading-Zentren im Pazifischen Ozean ändern, um so viel wie 15 cm/Jahr.
InformationsquelleAutor der Antwort Greg Hewgill
Welche Codierung ist "beste" hängt wirklich davon ab, Ihre Ziele/Anforderungen.
Wenn Sie Arithmetik, floating point Breitengrad,Längengrad, ist oft sehr bequem. Andere Zeiten kartesische Koordinaten (also x,y,z) kann bequemer sein. Zum Beispiel, wenn Sie nur kümmerte sich um Punkte auf der Oberfläche der Erde, Sie können einen n-Vektor.
Als für die längerfristige Speicherung, IEEE floating point Abfälle bits für die Bereiche, die Sie nicht kümmern (für lat/lon) oder für die Präzision, die Sie möglicherweise nicht interessieren in dem Fall der kartesischen Koordinaten (es sei denn, Sie wollen sehr gute Präzision auf die Herkunft aus welchem Grund auch immer). Selbstverständlich können Sie die Karte entweder durch Eingabe der Koordinaten int-Werte der von Ihnen bevorzugten Größe, so dass die gesamte Palette der sagte ints deckt den Bereich, den Sie interessiert sind an der Auflösung, die Sie interessieren.
Gibt es natürlich andere Dinge zu denken als nur nicht Verschwendung von bits in der Kodierung. Zum Beispiel, (Geohashes)[https://en.wikipedia.org/wiki/Geohash] haben die nette Eigenschaft, dass es leicht zu finden, andere geohashes in der gleichen Gegend. (Die meisten haben die gleiche Vorwahl, und Sie können die Berechnung der Präfix den anderen haben.) Leider, Sie halten die gleiche Präzision bei der Längengrade in der Nähe des äquators und in der Nähe der Pole. Ich bin derzeit mit 64-bit-geohashes für Speicher, der über 3 m Auflösung am äquator.
Den Maidenhead Locator System hat einige ähnliche Eigenschaften, sondern wirkt eher optimiert für die Kommunikation Lagen zwischen Menschen eher als das speichern auf einem computer. (Speichern MLS Zeichenfolgen Abfälle eine Menge von bits, die für einige eher triviale Fehler-Erkennung.)
Dem einen system fand ich das nicht umgehen die Polen anders ist die Military Grid Reference Systemobwohl es scheint auch mehr Mensch-Kommunikation orientiert. (Und es scheint wie ein Schmerz zu konvertieren oder zu lat/lon.)
Je nachdem, was Sie genau möchten, könnten Sie etwas ähnliches wie die Universal polar sereographic Koordinatensystem in der Nähe der Pole zusammen mit etwas mehr rechnerisch sane als UTM für den rest der Welt, und verwenden Sie höchstens ein bit, um anzuzeigen, welches der beiden Systeme Sie verwenden. Ich sage bei den meisten ein bisschen, denn es ist unwahrscheinlich, dass die meisten der Punkte, die Sie kümmern würde werden in der Nähe der Pole. Zum Beispiel könnten Sie " zur Hälfte "ein bisschen" sagen 11 zeigt die Verwendung des polar-system, während die 00, 01 und 10 zeigen den anderen system und sind Teil der Darstellung.
Sorry das ist ein bisschen lang, aber ich wollte zu retten, was ich gelernt hatte, vor kurzem. Leider habe ich nicht gefunden, einen standard, gesunden und effizienten Weg zur Darstellung eines Punktes auf der Erde mit gleichmäßiger Präzision.
Edit: ich fand einen anderen Ansatz, der sieht viel mehr wie das, was Sie wollte, da es direkt nutzt die geringere Präzision erforderlich, für die Länge näher an den Polen. Es stellt sich heraus, es gibt eine Menge Forschung über das speichern von normalen Vektoren. - Codierung der Normalen-Vektoren mit Optimierten Sphärischen Koordinaten beschreibt ein solches system für die Codierung von normalen Vektoren, wobei gleichzeitig ein Mindestmaß an Genauigkeit, aber es könnte genauso gut verwendet werden, für die geographischen Koordinaten.
InformationsquelleAutor der Antwort aij
http://www.esri.com/news/arcuser/0400/wdside.html
Am äquator, ein arc-zweiten der Längengrad entspricht etwa einem arc-zweite der Breitengrad, die ist 1/60ste einer nautischen Meile (oder 101.27 Füße oder 30.87 m).
32-bit-float-enthält 23 explizite bits von Daten.
180 * 3600 erfordert log2(648000) = 19.305634287546711769425914064259-bit-Daten. Beachten Sie, dass die Vorzeichen-bit wird separat gespeichert und daher müssen wir die Höhe nur 180 Grad.
Nach Abzug von 23 bits für log2(648000) haben wir die restlichen extra 3.694365712453288230574085935741 bits, die für die sub-Sekunden-Daten.
2 ^ 3.694365712453288230574085935741 = 12.945382716049382716049382716053 Teile pro Sekunde.
Daher einen float-Datentyp haben können 30.87 /12.945382716049382716049382716053 ~= 2.38 m Präzision am äquator.
InformationsquelleAutor der Antwort Roland Pihlakas
Wenn du mit "speichern" meinst du "halten in memory", die eigentliche Frage ist: was willst du mit Ihnen zu tun?
Ich vermute, dass, bevor Sie diese Koordinaten tun nichts interessant, Sie wurden funnelled als Bogenmaß durch die Funktionen in der Mathematik.h. Es sei denn, Sie planen, die Umsetzung durchaus ein paar Transzendentalen Funktionen und arbeiten auf Grad/Min/Sek. gepackt in ein bit-Feld.
Also warum nicht die Dinge einfach halten und nur speichern Sie Sie in IEEE-754-Grad-oder Bogenmaß an der Präzision Ihrer Anforderungen?
InformationsquelleAutor der Antwort natevw
Ein Java-Programm für comuting max Rundungsfehler in Meter vom casting-lat/long-Werte in Float/Double:
Ausgabe:
InformationsquelleAutor der Antwort John W. Phillips
Den folgenden code packt die WGS84-Koordinaten verlustfrei Koordinaten in ein unsigned long (also in 8 bytes):
Quelle: http://www.dupuis.me/node/35
InformationsquelleAutor der Antwort Augustin
Können Sie
decimal
Datentyp:InformationsquelleAutor der Antwort Lemon Kazi