Ich versuche eine "Formel" zu entwickeln, um die lat-lng-Werte zu korrigieren.
Ich benutze eine Vue-Broschüre, aber wenn Sie außerhalb der "ersten" Welt schwenken, erhalten Sie große Zahlen. Über +180 oder unter -180.
Zum Beispiel: Wenn ich nach rechts (Richtung Osten) nach Amerika schwenke, erhalte ich lng 215. In meinen Gedanken würde ich es einfach mit korrigieren 215-360=-145
Das gleiche gilt, wenn ich nach Ostrussland nach links schwenke (Westrichtung) und zum Beispiel -222 bekomme. Jetzt muss ich rechnen-222+360=138
Da die Welt jedoch unbestimmt ist, konnte der Benutzer zur 8. Welt schwenken, und ich musste die Werte anpassen.
Ist es möglich, den richtigen Längengrad zu berechnen? (und eine andere Anforderung ist, wenn sich der Benutzer in der ersten Welt befindet, sollten 24 lng immer noch 24 lng sein.
quelle
while (Math.abs(lon) > 180) { lon -= Math.sign(lon) * 360 }
Ich gebe es jedoch nicht als Antwort, da Ihre Version tatsächlich der Erklärung entspricht, während meine Version nur eine Optimierung ist, die wahrscheinlich keinen Unterschied macht. Ich behalte es nur als Kommentar, um daran zu erinnern, dass Dinge auf verschiedene Arten erledigt werden können, von denen einige optimierter sind als andere.lon %= 180
?Eine Antwort, die Bedingungen und Funktionsaufrufe vermeidet:
Ich habe unter https://jsperf.com/longitude-normalization ein schnelles Mikrobenchmark geschrieben, und der bedingte Code scheint für "angemessene" Bereiche von Eingabewerten schneller zu sein (in Chrome auf meinem Computer). Im Allgemeinen sollten Sie sich bei kleinen Berechnungen wie diesen wahrscheinlich nicht im Voraus Gedanken über die Leistung machen, um der Lesbarkeit und Konsistenz mit dem Rest Ihrer Codebasis mehr Gewicht zu verleihen.
Wahrscheinlich wichtiger in diesem Fall ist die Frage, ob Ihr Code jemals auf extreme Eingabewerte stoßen könnte (1e10, Infinity usw.). In diesem Fall läuft die Schleifenimplementierung möglicherweise sehr langsam oder hängt Ihr Programm stillschweigend auf. Dies kann bei Berechnungen in der Nähe der Pole auftreten, z. B. kann der Versuch, nach Osten oder Westen um einen gewissen Abstand (und nicht um einen Winkel) von einem Pol zu schwenken, leicht zu einer unendlichen Länge führen.
quelle
Einzeiler:
Erläuterung: Sie möchten wissen, was übrig bleibt, nachdem Sie die vollen Umdrehungen (360 °) ignoriert haben.
Dieser Vorgang wird als Normalisieren bezeichnet.
Beispiel (cpp.sh)
quelle
remainder
alsmodulus
. Der Modul in JS würde zu [0, 360] führen.-1 % 3
-1, nicht 2, wie es erforderlich wäre, damit es hier funktioniert.remainder
ist eine großartige C ++ - Lösung, aber leider gibt es in JS keine Funktion / keinen Operator, die ähnlich genug ist, um nützlich zu sein.Eine weitere Option: longitude = atan2 (cos (lang), sin (lang))
quelle
Wenn die von Ihnen verwendete Programmiersprache den Operator% (mod) für Gleitkommazahlen (wie Python und Ruby) unterstützt, würde ich die Verwendung empfehlen. Andernfalls können Sie in einigen anderen Sprachen (wie C und C ++) fmod () verwenden.
(Unabhängig davon, welchen Mod-Operator Sie verwenden, stellen Sie im Voraus sicher, dass Mod-Operationen für Gleitkommazahlen ausgeführt werden und dass Sie immer nicht negative Antworten erhalten. Andernfalls erhalten Sie später eine böse Überraschung, wenn viele von Ihnen Lat / Lon-Punkte sind nicht korrekt.)
Verwenden Sie es so:
Wenn Sie es vorziehen, alles in einer Zeile zu erledigen:
Diese Ansätze haben keine Schleifen, daher normalisieren sie Längengrade, ohne dass wiederholt addiert oder subtrahiert werden muss, unabhängig davon, wie oft Ihre Beobachtung um die Erde kreist.
Bearbeiten:
Hmmm ... Ich habe gerade bemerkt, dass Javascript nicht
%
mit negativen Werten umzugehen scheint, wie ich es mir vorgestellt hatte.Versuchen Sie in diesem Fall diesen Einzeiler:
Das, was
36180
wir hinzufügen, ist 36.000 + 180. Die 36.000 sollen einen negativen Wert in den positiven Bereich verschieben, und das 180 soll ihn verschieben, so dass er, wenn er von modifiziert wird360
, im Bereich von [0,360] liegt. . Das- 180
Teil verschiebt es zurück in den Bereich von [-180,180].Hier ist ein weiterer Einzeiler, der nicht davon abhängt, dass 36.000 groß genug sind:
Das
longitude % 360 + 360
Teil stellt sicher, dass der Wert in der positiven Domäne bleibt, wenn er später von geändert wird360
. Das+ 180
Teil verschiebt es so, dass es, wenn es später um 180 subtrahiert wird (mit- 180
), im gewünschten Bereich von [-180,180] liegt.quelle
fmod(longitude, 360)
-> (-360.0 ... +360.0) undilongitude % 360
-> [-359 ... +359].