Мне нужно преобразовать значения широты и долготы в точку в трехмерном пространстве. Я пробовал это примерно 2 часа, но я не получаю правильных результатов.
Координаты Equirectangular взяты из openflights.org. Я пробовал несколько комбинаций cos и sin, но результат никогда не был похож на нашу маленькую любимую землю.
В дальнейшем вы можете увидеть результат применения преобразования Wikipedia. Я думаю, из контекста можно предположить, что c4d.Vector
.
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
Красный: X, Зеленый: Y, Синий: Z
Можно действительно идентифицировать Северную и Южную Америку, особенно землю вокруг Мексиканского залива. Тем не менее, он выглядит несколько скверно и не в том месте.
В результате выглядит несколько повернутым, я думаю, я пробовал менять широту и долготу. Но этот результат несколько неудобен.
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
Вот как выглядит результат без преобразования значений.
def llarToWorld(latit, longit, altid, rad):
return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)
Вопрос: Как правильно преобразовать долготу и широту?
Решение
Благодаря TreyA я нашел эту страницу на mathworks.com. Код, который работает, следующий:
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)
На самом деле, я переключил y
и z
, потому что земля была повернута, но это работает! Что результат: