回転した緯度経度を通常の緯度経度に手動で変換しますか?


23

まず、この分野での経験がないことを明確にする必要があります。そのため、技術用語はわかりません。私の質問は次のとおりです。

2つの天気データセットがあります。

  • 最初のものは、-90から90および-180から180の範囲の通常の座標系(特定の名前があるかどうかはわかりません)を持ち、極は緯度-90および90にあります。

  • 2番目の例では、同じ地域に対応するはずですが、別の基準点(説明では回転グリッドと呼ばれます)があるため、緯度と経度が同じではないことに気付きました。緯度/経度のペアとともに、南極緯度:-35.00、南極経度:-15.00、角度:0.0。

lon / latの2番目のペアを最初のペアに変換する必要があります。角度が0で、単純なシフトのように見えるので、緯度に35を、経度に15を追加するだけで簡単にできますが、よくわかりません。

編集:座標に関する情報は次のとおりです

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

どうやら、2番目の座標系は球の一般的な回転によって定義されます

「これらのパラメータの選択肢の1つは次のとおりです。

  • 座標系の南極の地理的緯度(度数など)。

  • 座標系の南極の度単位の地理的経度、たとえばlambdap。

  • 座標系の新しい極軸(南極から北極を見たときに時計回りに測定)を中心とする回転角度(度)。最初に球体を地理極軸を中心にlambdap度回転させて取得したと仮定します。 、(90 +タップ)度回転して、南極が(以前に回転した)グリニッジ子午線に沿って移動するようにしました。」

しかし、まだこれを最初のものに変換する方法がわかりません。


2
それでは、このGRIBデータですか?もしそうなら、おそらくgribタグが必要です。
カーククイケンドール

@skd ECMWFリンクは有効ではないようです。編集できますか?
ガンサブ

@gansubリンクを編集しました。情報が長い間ずっと同じであるかどうかはわかりませんが、新しいリンクは将来の参照のためのコンテキストを提供できると思います。
skd

@skdあなたが言うとき、あなたangle=0.0方位を意味しますか?回転した極座標を含むnetcdfファイルがありますが、角度については言及されていません。
FaCoffee 16

@ CF84実はわからない。角度について言及がない場合は、angle = 0
skd

回答:


24

手動で回転を逆にすると、うまくいくはずです。球座標系を回転するための式がどこかにあるはずですが、私はそれを見つけることができないので、ここに派生があります('回転座標系をマークします;通常の地理座標は普通の記号を使用します):

最初に、2番目のデータセットのデータを球面(lon '、lat')から(x '、y'、z ')に変換します:

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

次に、2つの回転行列を使用して2番目の座標系を回転させ、最初の「通常の」座標系と一致させます。座標軸を回転させるので、軸回転行列を使用できます。ECMWF定義で使用される回転方向に一致するように、ϑ行列の符号を反転する必要がありますが、これは標準の正の方向とは異なるようです。

座標系の定義で説明されている回転を元に戻しているため、最初にy =軸(回転グリニッジ子午線に沿って)= =-(90 + lat0)= -55度回転し、次にφ=-回転しますlon0 = z軸を中心に+15度):

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'

次に、次を使用して 'normal'(lat、lon)に変換します

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°)

  • 対称性では、両方の赤道が新しいCSで90°/ -90°、または地理座標で75°/ -105°で交差する必要があります

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

編集: whuberによる非常に建設的なコメントのおかげで答えを書き直しました。マトリックスと展開は同期化され、回転パラメーターに適切な符号を使用しています。マトリックスの定義への参照を追加。回答からatan(y / x)を削除しました。変換の例を追加しました。

編集2:デカルト空間に明示的に変換することなく、同じ結果の式を導出することが可能です。xyz結果の対応する表現で置換することができ、そして同じことのために繰り返すことができる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ではありません。行列積の展開の3行すべてが正しくありません。ATan2(または同等のもの)を使用し、x = y = 0の場合に妥当な経度を返すように変更する必要あります。x ^ 2 + y ^ 2 + z ^ 2 = 1であるため、最後に単にlat = Arcsin(z)になることに注意してください。
whuber

1
ありがとう。少なくとも数学が正しいように答えを修正しました。これで、CSの定義の説明と回転が一致するはずですが、例(南極の位置以外)なしでそれらの符号を確認するのは困難です。
mkadunc

よくやった!この返信は有用で見つけにくい資料を提供するため、これ以上の票が得られないことに驚いています。
whuber

これは確かに資料を見つけるのが非常に難しいので、答えてくれてありがとう。最終的にこのソフトウェアcode.zmaw.de/projects/cdoを使用して、回転したグリッドから通常のグリッドに変換しました。私の推測では、最初にこの答えのように座標を変換し、次にそれらを補間して、長方形グリッドのポイントで結果を出します。少し遅れましたが、今後の参考のためにこれを彼女に残します。
skd

1
@alfe私はBloch球の専門家ではありませんが、原理は私がやったことに非常に似ていますが、3つの実座標を持つデカルト空間に変換する代わりに、2つの虚座標を持つ空間に変換することを示唆しています(つまり、 4つの実際のコンポーネント)とそこでの回転の実行。あなたのコメントをきっかけに、私はすべての表現をまとめ、中間デカルトのステップがもはや明らかではない結果を追加しました。
mkadunc

6

誰もが興味を持っている場合、ファイル交換でMATLABスクリプトを共有し、通常の緯度/経度を回転した緯度/経度に変換し、逆も同様です:回転グリッド変換

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
確かに-コードが挿入されました。
サイモンドック

2

この変換はprojでも計算できますソフトウェアで(コマンドラインまたはプログラムを使用して)は、projがob_tranlatlon変換に適用される斜め変換()と呼ぶものを使用することによって行います。設定する投影パラメータは次のとおりです。

  • o_lat_p =例では北極緯度=> 35°
  • lon_0 =例では南極経度=> -15°
  • o_lon_p = 0

さらに、 -m 57.2957795130823投影された値を度単位で考慮するには(180 / pi)が必要です。

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

CORDEXドメインに基づいて、座標を回転から非回転に変換するためのasp.netページを開発しました。

上記の方法に基づいています。このリンクで自由に使用できます:

回転した緯度/経度を通常の緯度/経度に手動で変換する


Cordex Data Extractorは、CORDEX NetCDFファイルからデータを抽出するためのWindowsデスクトップソフトウェアです。Cordex Data Extractorでは、すべてのプロセスが背後のコードで行われ、ユーザーは日付、座標、変数名を入力するだけなので、ヘルプファイルは必要ありません。このビデオをご覧ください:youtu.be/RmpZblZPXjI agrimetsoft.com/cordexDataExtractor.aspx
Sohrab kolsoomi ayask

1

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

パイソン:

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を使用している場合は、プロジェクトツールを使用して2番目のデータセットを再投影し、最初のデータセットから設定をインポートできます。


2
残念ながら、私はソフトウェアを使用していません。それらはちょうどあるグリッドデータセットと、彼らは次のような情報が付属しています: -最初のものの場合:ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/... - :1秒間ecmwf.int/publications/ manuals / d / gribapi / fm92 / grib1 / detail /…
skd

回転角度が0であるので、私はあなたがYにXに15と35を追加したような単純な変換は、最初の1に2つ目のデータセットを揃えるべきだと思います
ujjwalesri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.