Преобразование широты и долготы в 3D-пространстве - программирование
Подтвердить что ты не робот

Преобразование широты и долготы в 3D-пространстве

Мне нужно преобразовать значения широты и долготы в точку в трехмерном пространстве. Я пробовал это примерно 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

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

4b9b3361

Ответ 2

ты не делаешь то, что предлагает википедия. внимательно прочитайте его.

они говорят:

x = r cos(phi) sin(theta)
y = r sin(phi) sin(theta)
z = r cos(theta)

а затем:

theta == latitude
phi == longitude

и, в вашем случае, r = радиус + высота

поэтому вы должны использовать:

r = radius + altitude
x = r cos(long) sin(lat)
y = r sin(long) sin(lat)
z = r cos(lat)

обратите внимание, что конечная запись cos(lat) (вы используете долготу).

Ответ 3

Я переформатировал код, который ранее упоминался здесь, но что более важно, вы оставили некоторые из уравнений, упомянутых в ссылке, предоставленной Niklas R

def LLHtoECEF(lat, lon, alt):
    # see http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html

    rad = np.float64(6378137.0)        # Radius of the Earth (in meters)
    f = np.float64(1.0/298.257223563)  # Flattening factor WGS84 Model
    cosLat = np.cos(lat)
    sinLat = np.sin(lat)
    FF     = (1.0-f)**2
    C      = 1/np.sqrt(cosLat**2 + FF * sinLat**2)
    S      = C * FF

    x = (rad * C + alt)*cosLat * np.cos(lon)
    y = (rad * C + alt)*cosLat * np.sin(lon)
    z = (rad * S + alt)*sinLat

    return (x, y, z)

Сравнительный результат: поиск ECEF для Лос-Анджелеса, CA (34.0522, -118.40806, 0 отметки)
Мой код:
X = -2516715.36114 метров или -2516.715 км
Y = -4653003,08089 м или -4653.003 км
Z = 3551245.35929 метров или 3551.245 км

Ваш код:
X = -2514072.72181 м или -2514.072 км
Y = -4648117,26458 метров или -4648,117 км
Z = 3571424.90261 м или 3571,424 км

Несмотря на то, что в среде вашего земного вращения ваша функция будет создавать правильную географическую область для отображения, она будет НЕ давать правильные эквивалентные координаты ECEF. Как видите, некоторые параметры варьируются в зависимости от 20 КМ, что является большой ошибкой.

Фактор сглаживания f зависит от модели, которую вы предполагаете для вашего преобразования. Типичная модель WGS 84; однако существуют и другие модели.

Лично мне нравится использовать эту ссылку в военно-морской аспирантуре для проверки работоспособности моих конверсий.