회전 된 위도 / 경도를 일반 위도 / 경도로 수동 변환합니까?


23

먼저이 분야에 대한 경험이 없기 때문에 기술 용어를 모릅니다. 내 질문은 다음과 같습니다.

두 가지 날씨 데이터 세트가 있습니다.

  • 첫 번째 는 -90에서 90 및 -180에서 180 사이 의 정규 좌표계 (특정 이름이 있는지 모르겠습니다)를 가지고 있으며 극점은 위도 -90 및 90입니다.

  • 두 번째 것은 동일한 지역에 해당해야하지만 다른 점을 발견했습니다. 위도와 경도는 다른 참조 점이 있기 때문에 동일하지 않습니다 (설명에서 회전 그리드 라고 함 ). 위도 / 경도 쌍과 함께 다음 정보가 제공됩니다.

두 번째 lon / lat 쌍을 첫 번째 쌍으로 변환해야합니다. 각도가 0이고 간단한 이동처럼 보이기 때문에 위도에 35, 경도에 15를 추가하는 것만 큼 간단 할 수 있지만 확실하지 않습니다.

편집 : 좌표에 대한 정보는 다음과 같습니다.

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

분명히, 두 번째 좌표계는 구의 일반적인 회전에 의해 정의됩니다

"이러한 매개 변수 중 하나는 다음과 같습니다.

  • 좌표계의 남극 각도에서의 지리적 위도, 예를 들어 탭;

  • 좌표계의 남극 각도에서의 지리적 경도 (예 : lambdap);

  • 좌표축의 새 극축 (남쪽에서 북극으로 볼 때 시계 방향으로 측정)을 기준으로 한 회전 각도로, 먼저 지리적 극축을 중심으로 램덤 각도로 구를 회전하여 얻은 새 축을 가정합니다. 그 다음에 남극이 (이전에 회전 한) 그리니치 자오선을 따라 움직일 수 있도록 (90 + 도청)도를 통해 회전합니다. "

그러나 여전히 이것을 첫 번째로 변환하는 방법을 모르겠습니다.


2
GRIB 데이터입니까? 그렇다면, 우리는 grib 태그가 필요할 것입니다.
커크 Kuykendall

@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')

그런 다음 두 개의 회전 행렬을 사용하여 두 번째 좌표 시스템을 회전시켜 첫 번째 '정상'좌표와 일치하도록합니다. 좌표축을 회전 시켜 축 회전 행렬을 사용할 수 있습니다 . 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'

그런 다음 다음을 사용하여 '정상'(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 : 직교 공간으로의 명시 적 변형없이 동일한 결과에 대한 표현식을 도출 할 수 있습니다. 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가 아닙니다. 매트릭스 제품 확장에서 세 줄이 모두 올바르지 않습니다. x = y = 0 일 때 합리적인 경도를 반환하도록 수정 된 ATan2 (또는 이와 동등한 것)를 사용해야합니다 . x ^ 2 + y ^ 2 + z ^ 2 = 1이기 때문에 결국에는 lat = Arcsin (z)가됩니다.
whuber

1
감사. 나는 적어도 수학을 올바르게 만들기 위해 답을 수정했습니다. 이제 회전이 CS 정의의 설명과 일치해야하지만, 남극의 위치를 ​​제외하고 예가없는 기호에 대해서는 확실하지 않습니다.
mkadunc

잘 했어! 유용하고 찾기 어려운 자료를 제공하기 때문에이 회신이 더 많은 표를 얻지 못하는 것에 놀랐습니다.
whuber

이것은 실제로 자료를 찾기가 매우 어렵습니다. 답장을 보내 주셔서 대단히 감사합니다. 회전 된 그리드에서 일반 그리드로 변환하기 위해이 소프트웨어 code.zmaw.de/projects/cdo 를 사용했습니다 . 내 생각에 그것은 먼저이 답변에서와 같이 좌표를 변환 한 다음 직사각형 그리드의 점에서 결과를 제공하기 위해 좌표를 보간합니다. 조금 늦었지만 나중에 참조 할 수 있도록 그녀를 남겨 둡니다.
skd

1
@alfe 나는 Bloch spheres의 전문가는 아니지만 원리는 내가 한 것과 매우 비슷해 보이지만 실제 좌표가 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];

링크가 끊어 질 경우를 대비하여 향후 독자를위한 코드를 삽입하십시오. 감사.
Michael Stimson

1
물론-코드가 삽입되었습니다.
simondk

2

이 변환은 또한 proj가 라 트론 변환에 적용된 경사 변환 ( )을 사용하여 proj 소프트웨어 (명령 줄을 사용하거나 프로그래밍 방식으로) 로 계산할 수 있습니다 ob_tran. 설정할 투영 매개 변수는 다음과 같습니다.

  • o_lat_p 예에서 = 북극 위도 => 35 °
  • lon_0 = 예제에서 남극 경도 => -15 °
  • o_lon_p = 0

또한, -m 57.2957795130823예상 값을도 단위로 고려하려면 (180 / pi)가 필요합니다.

mkadunc가 제안한 예제를 복제하면 동일한 결과를 얻을 수 있습니다 (여기서 order is lon latnot (lat,lon), coodinates는 표준 입력으로 입력되고 출력은로 표시됨 =>).

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
불행히도 나는 어떤 소프트웨어도 사용하지 않습니다. 사람들은 단지입니다 그리드 데이터 세트 그리고 그들은 다음과 같은 정보와 함께 제공 : - 첫 번째 경우 : ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/... - 두 번째의 경우 : ecmwf.int/publications/ manuals / d / gribapi / fm92 / grib1 / detail /…
skd

회전 각도가 0이기 때문에, 나는 당신이 Y로 X 15과 35을 추가 말한 것처럼 간단한 번역은, 첫 번째로 두 번째 데이터 집합을 정렬해야한다고 생각
ujjwalesri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.