首先,我需要澄清一下,我之前没有该领域的经验,所以我不知道技术术语。我的问题如下:

我有两个天气数据集:


第一个具有常规坐标系(我不知道它是否具有具体名称),范围从-90到90和-180到180,而两极分别位于纬度-90和90。纬度和经度不同,因为它们有另一个参考点(在说明中称为旋转网格)。连同纬度/经度对一起,提供以下信息:南极纬度:-35.00,南极纬度:-15.00,角度:0.0。

我需要将第二对lon / lat转换为第一对。可以简单地将纬度添加35,将经度添加15,因为角度为0,这似乎很简单,但是我不确定。

编辑:我所拥有的信息有关坐标的信息如下:

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

显然,第二个坐标系是由球体的一般旋转定义

“这些参数的一种选择是:


坐标系南极的地理纬度,例如:tap;
坐标系南极的地理经度(例如lambdap);
围绕新极轴的旋转角度(以度为单位)(从南向后看是顺时针坐标系的北极),并假设已通过首先围绕球形极轴旋转小球lambdap度,然后旋转(90 + thetap)来获得新轴度,以便南极沿(以前旋转的)格林威治子午线移动。“

但是我仍然不知道如何将其转换为第一个。

评论

那么,这是GRIB数据吗?如果是这样,也许我们需要一个grib标签。

@skd ECMWF链接似乎无效。您可以编辑吗?

@gansub我已经编辑了链接。由于时间长了,我不知道这些信息是否完全相同,但是我相信新的链接可以提供一些上下文以供将来参考。

@skd当您说angle = 0.0时,是指方位角吗?我有一个带有旋转极坐标的netcdf文件,但是没有提及任何角度。

@ CF84我实际上不确定。我想如果没有提及角度,那就等于角度= 0

#1 楼

手动反向旋转应该可以解决问题。应该在某处有一个旋转球面坐标系的公式,但由于找不到它,所以这是推导('标记旋转坐标系;法线地理坐标使用普通符号):使用以下数据从球形(lon',lat')到(x',y',z')的第二个数据集中的数据:

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


然后使用两个旋转矩阵旋转第二个坐标系,使其与第一个“法线”重合。我们将旋转坐标轴,因此我们可以使用轴旋转矩阵。我们需要反转ϑ矩阵中的符号,以匹配ECMWF定义中使用的旋转方向,这似乎与标准的正方向不同。

由于我们要撤消定义坐标系,我们首先绕y'轴旋转ϑ =-(90 + lat0)= -55度(沿旋转的格林威治子午线),然后绕z =旋转φ= -lon0 = +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')


展开后,它变为: lon)使用

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


如果没有atan2,则可以使用atan(y / x)并检查x和y的符号来自己实现br />
使用三角函数之前,请确保将所有角度都转换为弧度,否则会得到怪异的结果;最后,如果您愿意的话,可以转换回度数...

示例(旋转球坐标==>标准地理坐标):



旋转的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(z)
lon = atan2(y, x)


评论


这个主意很好,但是某些细节需要修正。 lon0 = -15,而不是+15。矩阵乘积展开中的所有三行都不正确。必须使用ATan2(或其等效项),并对其进行修改以在x = y = 0时返回任何合理的经度。请注意,因为x ^ 2 + y ^ 2 + z ^ 2 = 1,最后您会得到lat = Arcsin(z)。

– hu
2011年9月19日在19:59

谢谢。我确定了答案,至少可以使数学正确。现在,旋转应该与CS定义中的描述匹配,但是如果没有示例(南极的位置除外),则很难确定其旋转符号。

– mkadunc
2011-09-20 12:36

做得好!我很惊讶这个答复没有获得更多的选票,因为它提供了有用且难以发现的材料。

– hu
2011年9月20日15:07

这确实很难找到材料,非常感谢您的回答。我最终使用此软件code.zmaw.de/projects/cdo将旋转的网格转换为常规网格。我的猜测是,它首先像在此答案中那样变换坐标,然后对它们进行插值,以便在矩形网格的点处给出结果。虽然有点晚,但我还是把这个留给她以后参考。

–skd
2013年3月19日15:00



@alfe我不是Bloch球面领域的专家,但是原理看起来与我所做的非常相似,但是提示不要转换为具有3个实坐标的笛卡尔空间,而是建议转换为具有2个虚构坐标的空间(这意味着4个实数部分)并在那里执行旋转。由您的评论触发,我将所有表达式放在一起并添加了一个结果,其中中间的笛卡尔步不再可见。

– mkadunc
17年12月15日14:52



#2 楼

如果有人感兴趣,我已经在文件交换中共享了一个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)
2015年10月1日,0:19

确定-已插入代码。

– simondk
2015年10月6日在8:35

#3 楼

也可以使用proj软件(使用命令行或以编程方式)通过应用应用于latlon变换的proj称为“斜平移”(ob_tran)来计算此变换。要设置的投影参数为:


o_lat_p =北极纬度=> 35°在示例中

lon_0 =南极经度=> -15°在示例中

o_lon_p = 0

另外,还需要-m 57.2957795130823(180 / pi)来考虑以度为单位的投影值。
mkadunc给出相同的结果(注意,这里的顺序是lon lat而不是(lat,lon),坐标是在标准输入中键入的,输出由=>标记的):已旋转)坐标调整为地理坐标,而invproj则相反。

#4 楼

我已经开发了一个asp.net页面,用于基于CORDEX域将坐标从旋转坐标转换为非旋转坐标。

它基于上述方法。您可以在此链接中自由使用它:

将旋转的经纬度手动转换为常规经纬度

评论


Cordex Data Extractor是Windows桌面软件,用于从CORDEX NetCDF文件中提取数据。 Cordex Data Extractor不需要帮助文件,因为所有过程都在背后的代码中完成,并且用户只需输入日期,坐标和变量名即可。请观看此视频:youtu.be/RmpZblZPXjI agrimetsoft.com/cordexDataExtractor.aspx

– Sohrab kolsoomi ayask
18年5月6日在18:14

#5 楼

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


#6 楼

python的cartopy模块具有旋转极点功能。
它理解了似乎发生的变化。 -py

我想可能会有所帮助。

#7 楼

您正在使用哪种软件?每个GIS软件都将具有向您显示当前坐标系/投影信息的功能。 ,它可以帮助您获取当前坐标系的名称。第一。

评论


不幸的是,我没有使用任何软件。这些只是网格数据集,它们具有以下信息:-对于第一个:ecmwf.int/publications/manuals/d/gribapi/fm92/grib1/detail/…-对于第二个:ecmwf.int/publications/手册/ d / gribapi / fm92 / grib1 / detail / ...

–skd
2011年6月9日在11:51



由于旋转角度为0,我认为简单的平移应将第二个数据集与第一个数据集对齐,就像您说的在X上加上15和在Y上加上35

– ujjwalesri
2011年6月10日下午4:36