Czy ręcznie przekształcasz obrócone lat / lon w zwykłe lat / lon?


24

Najpierw powinienem wyjaśnić, że nie mam wcześniejszego doświadczenia w tej dziedzinie, więc nie znam terminologii technicznej. Moje pytanie jest następujące:

Mam dwa zestawy danych pogodowych:

  • Pierwszy ma regularny układ współrzędnych (nie wiem, czy ma określoną nazwę), w zakresie od -90 do 90 i -180 do 180, a bieguny znajdują się na szerokościach -90 i 90.

  • W drugim, chociaż powinien on odpowiadać temu samemu regionowi, zauważyłem coś innego: szerokość i długość geograficzna nie były takie same, ponieważ mają inny punkt odniesienia (w opisie nazywany jest siatką obróconą ). Wraz z parami lat / lon otrzymujemy następujące informacje: południowy biegun lat: -35,00, południowy biegun lon: -15,00, kąt: 0,0.

Muszę przekształcić drugą parę lon / lat na pierwszą. Może to być tak proste, jak dodanie 35 do szerokości i 15 do długości, ponieważ kąt wynosi 0 i wydaje się prostą zmianą, ale nie jestem pewien.

Edycja: Mam informacje o współrzędnych są następujące

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

Najwyraźniej drugi układ współrzędnych jest określony przez ogólny obrót kuli

„Jeden z tych parametrów to:

  • Szerokość geograficzna w stopniach południowego bieguna układu współrzędnych, na przykład dotknięcie;

  • Długość geograficzna w stopniach południowego bieguna układu współrzędnych, na przykład lambdap;

  • Kąt obrotu w stopniach wokół nowej osi biegunowej (mierzony zgodnie z ruchem wskazówek zegara, patrząc od bieguna południowego do północnego) układu współrzędnych, przy założeniu, że nową oś uzyskano najpierw poprzez obrócenie kuli o stopnie lambda wokół geograficznej osi biegunowej , a następnie obracanie o (90 + dotknięcie) stopni, tak aby biegun południowy poruszał się wzdłuż (wcześniej obróconego) południka Greenwich. ”

ale wciąż nie wiem, jak przekonwertować to na pierwsze.


2
Czy to są dane GRIB ? Jeśli tak, może potrzebujemy tagu grib.
— Kirk Kuykendall

@skd wydaje się, że linki ECMWF są nieprawidłowe. Umiesz edytować
— gansub,

@gansub Zredagowałem linki. Nie wiem, czy informacje są dokładnie takie same, odkąd minęło sporo czasu, ale wierzę, że nowy link może zapewnić kontekst do wykorzystania w przyszłości.
— skd

@skd, kiedy mówisz angle=0.0, masz na myśli łożysko ? Mam plik netcdf ze współrzędnymi obróconego bieguna, ale nie ma wzmianki o żadnym kącie.
— FaCoffee,

@ CF84 Właściwie nie jestem pewien. Myślę, że jeśli nie ma wzmianki o kącie, to jest taki sam jak kąt = 0
— skd

Odpowiedzi:


24

Ręczne odwrócenie obrotu powinno załatwić sprawę; powinien gdzieś istnieć wzór na obracanie sferycznych układów współrzędnych, ale ponieważ nie mogę go znaleźć, oto pochodna ( „ oznacza obrócony układ współrzędnych; normalne współrzędne geograficzne używają prostych symboli):

Najpierw przekonwertuj dane w drugim zestawie danych ze sferycznego (lon ', lat') na (x ', y', z '), używając:

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

Następnie użyj dwóch macierzy obrotu, aby obrócić drugi układ współrzędnych, tak aby pokrywał się z pierwszym „normalnym”. Będziemy obracać osie współrzędnych, abyśmy mogli użyć macierzy obrotu osi . Musimy odwrócić znak w macierzy ϑ, aby pasował do sensu obrotu stosowanego w definicji ECMWF, który wydaje się różnić od standardowego kierunku dodatniego.

Ponieważ cofamy obrót opisany w definicji układu współrzędnych, najpierw obracamy o ϑ = - (90 + lat0) = -55 stopni wokół osi y '(wzdłuż obróconego południka Greenwich), a następnie o φ = - lon0 = +15 stopni wokół osi 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')

Po rozwinięciu staje się:

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

Następnie przekonwertuj z powrotem na „normalny” (lat, lon) za pomocą

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

Jeśli nie masz atan2, możesz go zaimplementować samodzielnie, używając atan (t / x) i sprawdzając znaki xiy

Przed użyciem funkcji trygonometrycznych przekonwertuj wszystkie kąty na radiany, aby uzyskać dziwne wyniki; przelicz z powrotem na stopnie, jeśli tak wolisz ...

Przykład (obrócone współrzędne kuli ==> standardowe współrzędne geograficzne):

  • biegun południowy obróconego CS to (lat0, lon0)

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

  • głównym południkiem obróconego CS jest południk -15 ° geograficznie (obrócony o 55 ° w kierunku północnym)

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

  • symetria wymaga, aby oba równiki przecinały się pod kątem 90 ° / -90 ° w nowym CS lub 75 ° / -105 ° we współrzędnych geograficznych

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

EDYCJA: Przepisałem odpowiedź dzięki bardzo konstruktywnemu komentarzowi whuber'a: macierze i rozwinięcie są teraz zsynchronizowane, używając odpowiednich znaków dla parametrów obrotu; dodano odniesienie do definicji macierzy; usunięto atan (t / x) z odpowiedzi; dodane przykłady konwersji.

EDYCJA 2: Możliwe jest uzyskanie wyrażeń dla tego samego wyniku bez wyraźnej transformacji w przestrzeń kartezjańską. x, y, zW rezultacie może być podstawiona przez odpowiadające im wyrażenia, a tym samym mogą być powtarzane x', y'a z'. Po zastosowaniu niektórych tożsamości trygonometrycznych pojawiają się następujące wyrażenia jednoetapowe:

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

1
Pomysł jest dobry, ale niektóre szczegóły wymagają naprawy. l0 = -15, a nie +15. Wszystkie trzy linie w rozwinięciu produktu macierzowego są niepoprawne. ATan2 (lub jego odpowiednik) musi zostać użyty, zmodyfikowany, aby zwracał dowolną rozsądną długość geograficzną, gdy x = y = 0. Zauważ, że ponieważ x ^ 2 + y ^ 2 + z ^ 2 = 1, na końcu dostajesz po prostu lat = Arcsin (z).
— whuber

1
Dzięki. Naprawiłem odpowiedź, aby przynajmniej poprawić matematykę. Obroty powinny teraz pasować do opisu w definicji CS, ale trudno jest mieć pewność co do ich znaku bez przykładu (innego niż położenie bieguna południowego).
— mkadunc,

Dobra robota! Dziwię się, że ta odpowiedź nie otrzymuje więcej głosów, ponieważ zawiera użyteczny i trudny do znalezienia materiał.
— whuber

Naprawdę trudno jest znaleźć materiał, dziękuję bardzo za odpowiedź. W końcu użyłem tego oprogramowania code.zmaw.de/projects/cdo do konwersji z obracanej siatki na zwykłą siatkę. Domyślam się, że najpierw przekształca współrzędne jak w tej odpowiedzi, a następnie interpoluje je, aby dać wyniki w punktach prostokątnej siatki. Chociaż trochę się spóźniam, zostawiam ją jej na przyszłość.
— skd

1
@alfe Nie jestem ekspertem od sfer Blocha, ale zasada wygląda bardzo podobnie do tego, co zrobiłem, ale zamiast konwertować do przestrzeni kartezjańskiej z 3 rzeczywistymi współrzędnymi, podpowiedź sugeruje konwersję do przestrzeni z 2 wyobrażonymi współrzędnymi (co oznacza 4 prawdziwe komponenty) i wykonanie tam obrotu. Wywołane przez twój komentarz, połączyłem wszystkie wyrażenia razem i dodałem wynik, w którym pośredni krok kartezjański nie jest już widoczny.
— mkadunc,

6

Jeśli ktoś jest zainteresowany, udostępniłem skrypt MATLAB na wymianie plików, przekształcając zwykłe lat / lon w obrócone lat / lon i odwrotnie: Obrócona transformacja siatki

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];

Na wypadek gdyby link zniknął, możesz wstawić kod dla przyszłych czytelników. Dzięki.
— Michael Stimson

1
Pewnie - wstawiono kod.
— simondk

2

Transformację tę można również obliczyć za pomocą oprogramowania proj (przy użyciu wiersza polecenia lub programowo), wykorzystując to, co proj nazywa tłumaczeniem ukośnym ( ob_tran) zastosowanym do transformacji latlon. Parametry projekcji do ustawienia to:

  • o_lat_p = szerokość geograficzna bieguna północnego => 35 ° w przykładzie
  • lon_0 = długość bieguna południowego => -15 ° w przykładzie
  • o_lon_p = 0

dodatkowo -m 57.2957795130823wymagane jest (180 / pi), aby uwzględnić przewidywane wartości w stopniach.

Replikacja przykładów zaproponowanych przez mkadunc daje ten sam wynik (zauważ, że w tym przypadku kolejność lon latnie występuje (lat,lon), znaki standardowe są wpisywane na standardowym wejściu, dane wyjściowe są oznaczone przez =>):

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

invprojpolecenie służy do konwersji współrzędnych „rzutowanych” (tj. obróconych) na geograficzne, podczas gdy projrobi się odwrotnie.


1

Opracowałem stronę asp.net do konwersji współrzędnych z obróconych na nieobrócone na podstawie domen CORDEX.

Opiera się na powyższych metodach. Możesz go swobodnie używać w tym linku:

Ręczne przekształcanie obróconych lat / lon na zwykłe lat / lon


Cordex Data Extractor to program komputerowy dla systemu Windows do wyodrębniania danych z pliku CORDEX NetCDF. Cordex Data Extractor nie potrzebuje pliku pomocy, ponieważ wszystkie procesy zostały wykonane za kodami, a użytkownik po prostu wprowadza daty, współrzędne i nazwę zmiennej. Proszę obejrzeć ten film: youtu.be/RmpZblZPXjI agrimetsoft.com/cordexDataExtractor.aspx
— Sohrab kolsoomi ayask

1

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

PYTON:

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

Z jakiego oprogramowania korzystasz? Każde oprogramowanie GIS będzie miało funkcję pokazującą aktualne informacje o systemie / projekcji. , co może pomóc w uzyskaniu nazwy bieżącego układu współrzędnych.

Ponadto, jeśli korzystasz z ArcGIS, możesz użyć narzędzia Projekt , aby ponownie rzutować drugi zestaw danych, importując ustawienia z pierwszego.


2
Niestety nie używam żadnego oprogramowania. Są to tylko zestawy danych siatki i zawierają następujące informacje: - Dla pierwszego: ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/… - Dla drugiego: ecmwf.int/publications/ instrukcje / d / gribapi / fm92 / grib1 / detail /…
— skd

Ponieważ kąt obrotu wynosi 0, myślę, że proste tłumaczenie powinno wyrównać drugi zestaw danych do pierwszego, tak jak powiedziałeś, dodając 15 do X i 35 do Y
— ujjwalesri

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.