Ручне перетворення обертового lat / lon на звичайний lat / lon?


24

Спершу слід уточнити, що у мене немає попереднього досвіду роботи в цій галузі, тому я не знаю технічної термінології. Моє запитання таке:

У мене є два набори даних про погоду:

  • Перша має регулярну систему координат (я не знаю, чи має вона конкретну назву), що становить від -90 до 90 та -180 до 180, а полюси знаходяться на широтах -90 та 90.

  • У другому, хоча це повинно відповідати одному і тому ж регіону, я помітив щось інше: широта і довгота не були однаковими, оскільки вони мають іншу опорну точку (в описі називається обертовою сіткою ). Разом з парами lat / lon надходить така інформація: південний полюс lat: -35.00, lon південного полюса: -15.00, кут: 0.0.

Мені потрібно перетворити другу пару lon / lat на першу. Це може бути так само просто, як додати 35 до широт і 15 до довгот, оскільки кут дорівнює 0 і здається простим зсувом, але я не впевнений.

Редагувати: Інформація, яку я маю про координати, така

http://rda.ucar.edu/docs/formats/grib/gribdoc/llgrid.html

Мабуть, друга система координат визначається загальним обертанням сфери

"Один вибір для цих параметрів:

  • Географічна широта в градусах південного полюса системи координат, наприклад, наприклад;

  • Географічна довгота в градусах південного полюса системи координат, наприклад лямбдап;

  • Кут повороту в градусах щодо нової полярної осі (вимірюється за годинниковою стрілкою при погляді з південного на північний полюс) системи координат, припускаючи, що нова вісь була отримана спочатку обертанням кулі через градуси лямбдапа щодо географічної полярної осі , а потім обертаючись на (90 + thetap) градусів, щоб південний полюс рухався уздовж (раніше обертового) Грінвічського меридіана ".

але я все ще не знаю, як перетворити це на перший.


2
Так це дані GRIB ? Якщо так, можливо, нам потрібен тег grib.
Кірк Куйкендалл

@skd Посилання на ECMWF не видаються дійсними. Чи можете ви редагувати?
gansub

@gansub Я редагував посилання. Я не знаю, чи інформація точно така ж, оскільки минуло давно, але я вважаю, що нове посилання може забезпечити деякий контекст для подальшого використання.
skd

@skd, коли ти кажеш angle=0.0, ти маєш на увазі підшипник ? У мене є файл netcdf з обернутими полюсними координатами, але жодного кута не згадується.
FaCoffee

@ CF84 Я насправді не впевнений. Я думаю, якщо кута не згадується, то він такий самий, як кут = 0
skd

Відповіді:


24

Ручне обертання обертання повинно зробити трюк; десь повинна бути формула обертання сферичних систем координат, але оскільки я не можу її знайти, ось деривація ( ' позначає обертану систему координат; звичайні географічні координати використовують прості символи):

Спочатку конвертуйте дані у другому наборі даних із сферичного (lon, lat ') у (x', y ', z'), використовуючи:

x' = cos(lon')*cos(lat')
y' = sin(lon')*cos(lat')
z' = sin(lat')

Потім використовуйте дві матриці обертання, щоб обертати другу систему координат, щоб вона збігалася з першою 'звичайною'. Ми будемо обертати осі координат, тож можемо використовувати матриці обертання осей . Нам потрібно повернути знак у матриці to, щоб відповідати відчуттю обертання, що використовується у визначенні ECMWF, яке, здається, відрізняється від стандартного позитивного напрямку.

Оскільки ми скасовуємо обертання, описане у визначенні системи координат, спочатку обертаємось на ϑ = - (90 + lat0) = -55 градусів навколо осі y (уздовж обертового меридіана Грінвіча), а потім на φ = - lon0 = +15 градусів навколо осі z):

x   ( cos(φ), sin(φ), 0) (  cos(ϑ), 0, sin(ϑ)) (x')
y = (-sin(φ), cos(φ), 0).(  0     , 1, 0     ).(y')
z   ( 0     , 0     , 1) ( -sin(ϑ), 0, cos(ϑ)) (z')

Розширено, це стає:

x = cos(ϑ) cos(φ) x' + sin(φ) y' + sin(ϑ) cos(φ) z'
y = -cos(ϑ) sin(φ) x' + cos(φ) y' - sin(ϑ) sin(φ) z'
z = -sin(ϑ) x' + cos(ϑ) z'

Потім перетворять назад у "нормальний" (лат., Лон) за допомогою

lat = arcsin(z)
lon = atan2(y, x)

Якщо у вас немає atan2, ви можете реалізувати його самостійно, використовуючи atan (y / x) та вивчаючи ознаки x і y

Переконайтеся, що ви перетворите всі кути в радіани перед тим, як використовувати тригонометричні функції, інакше ви отримаєте дивні результати; конвертувати назад в градуси, якщо це те, що ви віддаєте перевагу ...

Приклад (поворотні координати сфери ==> стандартні географічні координати):

  • Південний полюс обертового CS - це (lat0, lon0)

    (-90 °, *) ==> (-35 °, -15 °)

  • Основним меридіаном обертового CS є географічний меридіан -15 ° (повернутий на 55 ° на північ)

    (0 °, 0 °) ==> (55 °, -15 °)

  • Симетрія вимагає, щоб обидва екватора перетиналися на 90 ° / -90 ° в новому КС, або 75 ° / -105 ° в географічних координатах

    (0 °, 90 °) ==> (0 °, 75 °)
    (0 °, -90 °) ==> (0 °, -105 °)

EDIT: Перепишіть відповідь завдяки дуже конструктивному коментарю whuber: матриці та розширення зараз синхронізуються, використовуючи належні знаки для параметрів обертання; додане посилання на визначення матриць; видалено з відповіді атана (у / х); додано приклади конверсії.

EDIT 2: Можна отримати вирази для одного результату без явного перетворення в декартовий простір. x, y, zВ результаті можуть бути заміщені їх відповідними виразами, і те ж саме можна повторити для x', y'і z'. Після застосування деяких тригонометричних тотожностей виникають такі одношагові вирази:

lat = arcsin(cos(ϑ) sin(lat') - cos(lon') sin(ϑ) cos(lat'))
lon = atan2(sin(lon'), tan(lat') sin(ϑ) + cos(lon') cos(ϑ)) - φ

1
Ідея хороша, але деякі деталі потребують виправлення. lon0 = -15, а не +15. Всі три рядки в розширенні матричного добутку неправильні. ATan2 (або його еквівалент) необхідно використовувати, модифіковану для повернення будь-якої розумної довготи, коли x = y = 0. Зауважте, що оскільки x ^ 2 + y ^ 2 + z ^ 2 = 1, в кінці ви отримуєте просто lat = Arcsin (z).
whuber

1
Спасибі. Я зафіксував відповідь, щоб принаймні зробити математику правильною. Повороти тепер повинні відповідати опису у визначенні CS, але важко бути впевненим у їх знаку без прикладу (крім положення південного полюса).
mkadunc

Молодці! Я здивований, що ця відповідь не набирає більше голосів, оскільки вона дає корисний і важко знайти матеріал.
whuber

Це справді дуже важко знайти матеріал, дуже дякую за відповідь. Я перетворив цю програму code.zmaw.de/projects/cdo для перетворення з обертової сітки в звичайну сітку. Я здогадуюсь, що він спочатку перетворює координати, як у цій відповіді, а потім інтерполює їх, щоб дати результати в точках прямокутної сітки. Хоча трохи пізно, я залишаю це їй для подальшого ознайомлення.
скд

1
@alfe Я не є експертом у сферах Блоха, але принцип виглядає дуже схожим на те, що я зробив, але замість перетворення на декартовий простір з 3-ма реальними координатами, підказка пропонує перейти до простору з двома уявними координатами (що означає 4 реальні компоненти) та виконуючи там обертання. Ініційований вашим коментарем, я склав усі вирази разом і додав результат, коли проміжний декартовий крок вже не видно.
mkadunc

6

У випадку, якщо когось цікавить, я поділився сценарієм MATLAB на обміні файлами, що перетворює звичайний lat / lon в обернутий lat / lon і навпаки: Поворотну трансформацію сітки

function [grid_out] = rotated_grid_transform(grid_in, option, SP_coor)

lon = grid_in(:,1);
lat = grid_in(:,2);

lon = (lon*pi)/180; % Convert degrees to radians
lat = (lat*pi)/180;

SP_lon = SP_coor(1);
SP_lat = SP_coor(2);

theta = 90+SP_lat; % Rotation around y-axis
phi = SP_lon; % Rotation around z-axis

phi = (phi*pi)/180; % Convert degrees to radians
theta = (theta*pi)/180;

x = cos(lon).*cos(lat); % Convert from spherical to cartesian coordinates
y = sin(lon).*cos(lat);
z = sin(lat);

if option == 1 % Regular -> Rotated

    x_new = cos(theta).*cos(phi).*x + cos(theta).*sin(phi).*y + sin(theta).*z;
    y_new = -sin(phi).*x + cos(phi).*y;
    z_new = -sin(theta).*cos(phi).*x - sin(theta).*sin(phi).*y + cos(theta).*z;

elseif option == 2 % Rotated -> Regular

    phi = -phi;
    theta = -theta;

    x_new = cos(theta).*cos(phi).*x + sin(phi).*y + sin(theta).*cos(phi).*z;
    y_new = -cos(theta).*sin(phi).*x + cos(phi).*y - sin(theta).*sin(phi).*z;
    z_new = -sin(theta).*x + cos(theta).*z;

end

lon_new = atan2(y_new,x_new); % Convert cartesian back to spherical coordinates
lat_new = asin(z_new);

lon_new = (lon_new*180)/pi; % Convert radians back to degrees
lat_new = (lat_new*180)/pi;

grid_out = [lon_new lat_new];

На всякий випадок, якщо посилання перерветься, ви можете, будь-ласка, вставити код для майбутніх читачів. Спасибі.
Майкл Стімсон

1
Звичайно - вставлений код.
simondk

2

Це перетворення також можна обчислити за допомогою програмного забезпечення proj (або за допомогою командного рядка, або програмно), використовуючи те, що proj називає косим перекладом ( ob_tran), застосованим до перетворення латлона. Параметри проекції, які потрібно встановити:

  • o_lat_p = широта північного полюса => 35 ° у прикладі
  • lon_0 = довгота південного полюса => -15 ° у прикладі
  • o_lon_p = 0

додатково, -m 57.2957795130823 (180 / пі) необхідний для врахування прогнозованих значень у градусах.

Реплікація прикладів, запропонованих mkadunc, дає той же результат (зауважте, що тут порядку lon latнемає (lat,lon), кодинати набираються на стандартному вході, вихід позначається символом =>):

invproj -f "=> %.6f" -m 57.2957795130823 +proj=ob_tran +o_proj=latlon +o_lon_p=0 +o_lat_p=35 +lon_0=-15
0 -90
=> -15.000000   => -35.000000
40 -90
=> -15.000000   => -35.000000
0 0
=> -15.000000   => 55.000000
90 0
=> 75.000000    => -0.000000
-90 0
=> -105.000000  => -0.000000

invprojкоманда використовується для перетворення з "проектованих" (тобто повернутих) координат у географічні, тоді як projдля зворотного.


1

Я розробив сторінку asp.net для перетворення координат з поворотних в не обертаються на основі доменів CORDEX.

Він заснований на вищезазначених методах. Ви можете вільно користуватися цим посиланням:

Ручне перетворення обертового lat / lon в звичайний lat / lon


Cordex Data Extractor - це програмне забезпечення для робочого столу Windows для вилучення даних з файлу CORDEX NetCDF. Cordex Data Extractor не потребує файлу довідки, оскільки всі процеси були зроблені за кодами, і користувач просто вводить ім'я дати, координати та змінних. Перегляньте це відео: youtu.be/RmpZblZPXjI agrimetsoft.com/cordexDataExtractor.aspx
Sohrab kolsoomi ayask

1

https://www.mathworks.com/matlabcentral/fileexchange/43435-rotated-grid-transform

PYTHON:

from math import *

def rotated_grid_transform(grid_in, option, SP_coor):
    lon = grid_in[0]
    lat = grid_in[1];

    lon = (lon*pi)/180; # Convert degrees to radians
    lat = (lat*pi)/180;

    SP_lon = SP_coor[0];
    SP_lat = SP_coor[1];

    theta = 90+SP_lat; # Rotation around y-axis
    phi = SP_lon; # Rotation around z-axis

    theta = (theta*pi)/180;
    phi = (phi*pi)/180; # Convert degrees to radians

    x = cos(lon)*cos(lat); # Convert from spherical to cartesian coordinates
    y = sin(lon)*cos(lat);
    z = sin(lat);

    if option == 1: # Regular -> Rotated

        x_new = cos(theta)*cos(phi)*x + cos(theta)*sin(phi)*y + sin(theta)*z;
        y_new = -sin(phi)*x + cos(phi)*y;
        z_new = -sin(theta)*cos(phi)*x - sin(theta)*sin(phi)*y + cos(theta)*z;

    else:  # Rotated -> Regular

        phi = -phi;
        theta = -theta;

        x_new = cos(theta)*cos(phi)*x + sin(phi)*y + sin(theta)*cos(phi)*z;
        y_new = -cos(theta)*sin(phi)*x + cos(phi)*y - sin(theta)*sin(phi)*z;
        z_new = -sin(theta)*x + cos(theta)*z;



    lon_new = atan2(y_new,x_new); # Convert cartesian back to spherical coordinates
    lat_new = asin(z_new);

    lon_new = (lon_new*180)/pi; # Convert radians back to degrees
    lat_new = (lat_new*180)/pi;

    print lon_new,lat_new;

rotated_grid_transform((0,0), 1, (0,30))

0

Яке програмне забезпечення ви використовуєте? Кожне програмне забезпечення GIS матиме змогу показувати вам поточну інформацію про систему координат / проекцію. , що може допомогти вам отримати назву вашої поточної системи координат.

Крім того, якщо ви використовуєте ArcGIS, ви можете використовувати інструмент Project для повторного проектування другого набору даних, імпортуючи налаштування з першого.


2
На жаль, я не використовую жодного програмного забезпечення. Це лише набори даних мережі, і вони надходять із такою інформацією: - Для першої: ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/… - для другої: ecmwf.int/publications/ посібники / d / gribapi / fm92 / grib1 / детально /…
skd

Оскільки кут повороту дорівнює 0, я думаю, що простий переклад повинен вирівняти другий набір даних до першого, як ви сказали, додавши 15 до X та 35 до Y
ujjwalesri

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.