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


23

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

我有两个天气数据集:

  • 第一个具有正则坐标系(我不知道它是否具有特定名称),范围从-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

显然,第二坐标系由球体的总体旋转定义

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

  • 以坐标系南极为单位的地理纬度,例如点击;

  • 坐标系南极的地理经度,例如lambdap;

  • 假设围绕新极轴的旋转角度(以度为单位,当从南极到北极看时为顺时针方向)是通过首先使球体绕地理极轴旋转lambdap度来获得的,然后旋转(90 + thetap)度,以使南极沿格林威治子午线(先前旋转过)移动。”

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


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

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

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

@skd当您说时angle=0.0,您的意思是轴承吗?我有一个带有旋转极坐标的netcdf文件,但是没有任何角度的提及。
FaCoffee,2013年

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

Answers:


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 = 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。矩阵乘积展开中的所有三行都不正确。必须使用ATan2(或其等效项),并对其进行修改以在x = y = 0时返回任何合理的经度。请注意,由于x ^ 2 + y ^ 2 + z ^ 2 = 1,最后您会得到lat = Arcsin(z)。
ub

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

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

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

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

6

如果有人感兴趣,我已经在文件交换上共享了一个MATLAB脚本,该文件交换将常规lat / lon转换为旋转lat / lon,反之亦然:旋转网格转换

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软件(通过命令行或以编程方式)通过应用ob_tranprot称为latlon转换的斜平移()来计算此转换。要设置的投影参数为:

  • 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

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

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

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


Cordex Data Extractor是Windows桌面软件,用于从CORDEX NetCDF文件中提取数据。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/手册/ d / gribapi / fm92 / grib1 / detail /…
skd

由于旋转角度为0,我认为一个简单的平移应该将第二个数据集与第一个数据集对齐,就像您说的在X上添加15并在Y上添加35
ujjwalesri 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.