Konvertieren Sie Längen-und Breitengrad-zu-Punkt im 3D-Raum
Brauche ich zum umwandeln von Längen-und Breitengrad-Werte, um einen Punkt im 3-dimensionalen Raum. Ich habe versucht, dies für etwa 2 Stunden jetzt, aber ich komme nicht auf die richtigen Ergebnisse.
Den Equirectangular Koordinaten kommen aus openflights.org. Ich habe versucht, mehrere Kombinationen von cos und Sündeaber das Ergebnis war noch nie so Aussehen wie unsere kleine Geliebte Erde.
Im folgenden können Sie sehen, das Ergebnis der Anwendung der Umwandlung Wikipedia schlägt. Ich denke, man kann erraten aus dem Kontext, was c4d.Vector
ist.
def llarToWorld(latit, longit, altid, rad):
x = math.sin(longit) * math.cos(latit)
z = math.sin(longit) * math.sin(latit)
y = math.cos(longit)
v = c4d.Vector(x, y, z)
v = v * altid + v * rad
return v
Rot: X, Grün: Y, Blau: Z
Kann man in der Tat zu identifizieren Nord - und Südamerika, vor allem das land um den Golf von Mexiko. Allerdings sieht es etwas gequetscht und irgendwie an der falschen Stelle..
Als das Ergebnis sieht etwas gedreht, ich denke, ich habe versucht swapping-breiten-und Längengrad. Aber das Ergebnis ist etwas umständlich.
def llarToWorld(latit, longit, altid, rad):
temp = latit
latit = longit
longit = temp
x = math.sin(longit) * math.cos(latit)
z = math.sin(longit) * math.sin(latit)
y = math.cos(longit)
v = c4d.Vector(x, y, z)
v = v * altid + v * rad
return v
Dies ist, was das Ergebnis sieht aus wie ohne die Umwandlung der Werte.
def llarToWorld(latit, longit, altid, rad):
return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)
Frage: Wie kann ich konvertieren Sie die Länge und Breite richtig?
Lösung
Dank TreyA, fand ich diese Seite auf mathworks.com. Der code, macht es die Arbeit ist die folgende:
def llarToWorld(lat, lon, alt, rad):
# see: http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html
f = 0 # flattening
ls = atan((1 - f)**2 * tan(lat)) # lambda
x = rad * cos(ls) * cos(lon) + alt * cos(lat) * cos(lon)
y = rad * cos(ls) * sin(lon) + alt * cos(lat) * sin(lon)
z = rad * sin(ls) + alt * sin(lat)
return c4d.Vector(x, y, z)
Eigentlich, wechselte ich y
und z
weil die Erde rotiert, dann, jedoch, es funktioniert! Das ist das Ergebnis:
InformationsquelleAutor der Frage Niklas R | 2012-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
du bist nicht zu tun, was wikipedia sagt. Lesen Sie noch einmal sorgfältig.
sagen Sie:
dann:
und, in deinem Fall r = radius + Höhe
so dass Sie verwenden sollten:
beachten Sie, dass der Letzte Eintrag ist
cos(lat)
(Sie verwenden Längengrad).InformationsquelleAutor der Antwort andrew cooke
Habe ich neu formatiert den code, der erwähnt wurde hier, aber noch wichtiger ist, die Sie verlassen haben, einige der Gleichungen erwähnt in den link von Niklas R
Vergleich Ausgabe: Suche nach ECEF für Los Angeles, CA (34.0522, -118.40806, 0 elevation)
Mein code:
X = -2516715.36114 Meter oder -2516.715 km
Y = -4653003.08089 Meter oder -4653.003 km
Z = 3551245.35929 Meter oder 3551.245 km
Code:
X = -2514072.72181 Meter oder -2514.072 km
Y = -4648117.26458 Meter oder -4648.117 km
Z = 3571424.90261 Meter oder 3571.424 km
Obwohl in Ihrem Erdrotation Umgebung, Ihre Funktion zu produzieren richtige geografische region für die Anzeige, es wird NICHT das Recht geben, ECEF-Koordinaten entspricht. Wie Sie sehen können einige Parameter variiert, um so viel wie 20 KM das ist eher ein großer Fehler.
Abflachung Faktor,
f
hängt vom Modell und übernehmen Sie für Ihre Konvertierung. Typische, Modell WGS-84; es gibt jedoch auch andere Modelle.Persönlich, ich mag zu verwenden, diesen link Naval Postgraduate School für sanity-checks auf meiner Umbauten.
InformationsquelleAutor der Antwort CodingAway
Als TreyA statet,
LLA to ECEF
ist die Lösung. Sehen http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.htmlInformationsquelleAutor der Antwort Niklas R