我有两个天气数据集:
第一个具有常规坐标系(我不知道它是否具有具体名称),范围从-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)来获得新轴度,以便南极沿(以前旋转的)格林威治子午线移动。“
但是我仍然不知道如何将其转换为第一个。
#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:可以在没有显式转换为笛卡尔空间的情况下得出相同结果的表达式。结果中的
x
,y
和z
可以用它们相应的表达式替换,并且对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-transformPYTHON:
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
评论
那么,这是GRIB数据吗?如果是这样,也许我们需要一个grib标签。@skd ECMWF链接似乎无效。您可以编辑吗?
@gansub我已经编辑了链接。由于时间长了,我不知道这些信息是否完全相同,但是我相信新的链接可以提供一些上下文以供将来参考。
@skd当您说angle = 0.0时,是指方位角吗?我有一个带有旋转极坐标的netcdf文件,但是没有提及任何角度。
@ CF84我实际上不确定。我想如果没有提及角度,那就等于角度= 0