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

17

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

Equirectangular координаты приходят из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

Red: X, Green: Y, Blue: 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

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

Solution

Благодаря 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

altid это высота, но что такоеrad? Это радиус Земли? Являютсяaltid а такжеrad в тех же единицах (футах)? Что делать, если вы используете только радиус (то есть простоv = v * rad)? Omri Barel
Также посмотрите на поиск в Google 'lla to ecef' - фиксированная широта / долгота / высота над земным центром. TreyA
@ TreyA Отлично, спасибо! Нашел это: Mathworks.de / помощь / набор инструментов / aeroblks / llatoecefposition.html Это правильная формула. :) Вы можете сделать свой комментарий ответом, если хотите знать, и таким образом я также могу пометить свой вопрос как ответивший. Niklas R

Ваш Ответ

3   ответа
12

что предлагает Википедия. прочитайте это снова внимательно.

они говорят

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) (вы используете долготу).

К сожалению, это тот же результат, что показано на рисунке 2: .. Niklas R
нет, это не так. lat / long меняются местами только для z. Вы обменяли их всех. andrew cooke
Ну, это не совсем то же самое, но очень похоже на второе изображение. И это очень похоже на первое изображение, когда меняются широта и долгота. Ссылка, которую я нашел при поискеlla to ecef (Спасибо TreyA) отлично. Видеть: Mathworks.de / помощь / набор инструментов / aeroblks / llatoecefposition.html Niklas R
должен бытьx = r cos(long) cos(lat) y = r sin(long) cos(lat) z = r sin(lat). Обратите внимание, что lat - это угол от плоскости xy, а не от оси z, как предполагает Википедия. sachinruk
12

который был упомянут выше, но, что более важно, вы пропустили некоторые уравнения, упомянутые в ссылке, предоставленной Никлас Р

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 для Лос-Анджелеса, Калифорния (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; Однако есть и другие модели.

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

Это работает, но сначала вам нужно преобразовать углы в радианы. Значения широты и долготы обычно указываются в градусах. Tomislav Muic
Как @TomislavMuic указал, что вы должны конвертировать Степень лат в радианах перед использованием приведенного выше фрагмента. Для этого просто используйте функцию math.radians (). Harshdeep
4

Treya statet,LLA to ECEF это решение. Видетьhttp: //www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.htm

Похожие вопросы