Преобразование широты и долготы в точку в трехмерном пространстве

Мне нужно преобразовать значения широты и долготы в точку в трехмерном -пространстве. Я пробовал это около 2 часов, но я не получаю правильных результатов.

Координаты Равнопрямоугольные взяты с openflights.org . Я пробовал несколько комбинаций cos и sin , но результат никогда не был похож на нашу маленькую любимую землю.


Далее вы можете увидеть результат применения преобразования, предложенного Википедией . Думаю, из контекста можно догадаться, что такое 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

enter image description here

Красный :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

enter image description here


Вот как выглядит результат без преобразования значений.

def llarToWorld(latit, longit, altid, rad):
    return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)

enter image description here


Вопрос:Как правильно преобразовать долготу и широту?


Решение

Благодаря 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, потому что тогда Земля вращалась, однако это работает! Вот результат:

enter image description here

19
задан Niklas R 9 May 2012 в 13:30
поделиться