爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4167|回复: 8

[程序设计] matlab将经纬度坐标转为格点坐标

[复制链接]

新浪微博达人勋

发表于 2022-10-19 20:56:18 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
根据WRF模式结果处理及部分气象参数计算-编程作图-气象家园_气象人自己的家园 (06climate.com)帖子,本人找到了经纬度坐标转为格点坐标的子程序,奈何自己是初学者,在运行子程序时出现问题,麻烦请问如何解决,谢谢。
本人程序:filename = 'wrfinput_d01';
                ij=wrf_ll_to_ij(filename, 30, 90,'U10');

子程序说明:function ij = wrf_ll_to_ij(filename, lat, lon, varargin)
% 转换指定经纬度点坐标为模拟域中的对应坐标点。
% 参数声明:
%   输入参数:
%      filename : 输入文件名
%        lat    : 指定纬度。标量或向量。
%        lon    : 指定经度。标量或向量。
%           当 lat 和 lon 为向量时,两向量大小应一致。
%     可选参数:
%       debug   :  debugging 信息, 单元素数值。默认为0.
%       如果对应的参数名不一致,则表明WRF输出结果的属性名称顺序出现更改,
%       使用ncinfo查看数据属性并更改程序内相应变量顺序。
%   输出参数:
%      ij   : 转换后的模拟域坐标。
%         当 lat 和 lon 为向量时,输出为2 X N 数组,每一列代表一组经纬度对应的
%         模拟域坐标点。
%         第一行为 经度方向点, 第二行为纬度方向点。
%%  计算方法取自:https://github.com/cwebster2/pyMeteo 中wrf模块
%    ll_to_ij 方法     

问题:wrf_ll_to_ij(filename, lat, lon, varargin)时,filename是什么文件,varargin是什么?我利用filename=wrfinput_d01,varargin=U10,显示可选参数只能是一个!
  • filename = 'wrfinput_d01';
  • ij=wrf_ll_to_ij(filename, 30, 90,'U10');
  • 错误使用 wrf_ll_to_ij (line 32)
  • 可选参数只能是一个!
子程序文件:


wrf_ll_to_ij.m

5.01 KB, 下载次数: 6, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-10-20 09:56:10 | 显示全部楼层
看了下源代码,水平有限,说下我的理解。
在matlab中,varargin是“Variable length input argument list”,它并不是你需要输入的函数变量,而是允许你的调用该函数时,你输入的参数可以改变,同理还有nargin,指的是一个函数的输入变量的个数。
它们两个都是固定的函数定义语句中的一个输入变量,通常放在函数变量的最后一个。
这个函数中,varargin应该是用来debug用的,在函数里varagin会返回1*n个cell,n为你输入的变量个数。如果你只输入任何了必须变量(filename、lat、lon),debug=0,如果你输入了其他的变量,它会打印出相应的变量信息,如果你输错了变量,则函数错误。
楼主显然输错了变量,因为'U10'属于字符串,并非数据,不能作为函数变量输入。
如果楼主只想返回对应坐标,只要使用:wrf_ll_to_ij(filename, 30, 90)即可
如果楼主还想输入其他任意变量,比如U10,直接wrf_ll_to_ij(filename, 30, 90,U10),注意U10应当为数值。
varargin并不需要输入,它只是允许你在除了必要的变量输入外,再输入其他的变量,调用时可不考虑。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-10-20 10:05:40 | 显示全部楼层
谷梁陌尘 发表于 2022-10-20 09:56
看了下源代码,水平有限,说下我的理解。
在matlab中,varargin是“Variable length input argument list ...

另外,在该函数中,你可以直接将varargin理解为可选参数,即:可输入or可不输入。
不过正如debug里所说,可选参数数目只能为1,按照我的理解,在该函数里,这个可选参数的目的是为了debug,即检查作为输入的WRF文件里,有哪了变量没有正确的获取,以便修改对应的变量名称。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-10-20 21:09:48 | 显示全部楼层
谷梁陌尘 发表于 2022-10-20 10:05
另外,在该函数中,你可以直接将varargin理解为可选参数,即:可输入or可不输入。
不过正如debug里所说 ...

首先谢谢你的回复,非常感激!
我试了一下,仍然不行!
第一点:filename值得是WRF模式的什么数据?wrfout_d01_2021-11-01_120000、wrfinput_d01、还是ARWpost的后处理。
第二点:是直接将filename = 'wrfout_d01_2021-11-01_120000'?,之前需要读取文件吗?我看子程序应该不需要(不知道理解对不)。
第三点:我的程序filename = 'wrfout_d01_2021-11-01_120000'
                         ij=wrf_ll_to_ij(filename, 30, 90);
             运行出错,显示错误使用 wrf_ll_to_ij (line 144),不支持的投影方式!,这表明应该是读取成功了,回查了子程序,应该是mp__proj 没有赋值,所以直接else了。
以上问题,希望大神能帮助解决一下。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-10-21 10:26:43 | 显示全部楼层
谷梁陌尘 发表于 2022-10-20 10:05
另外,在该函数中,你可以直接将varargin理解为可选参数,即:可输入or可不输入。
不过正如debug里所说 ...

另外,想请问一下,他这个子程序公式出自哪?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-10-21 11:29:06 | 显示全部楼层
269772539 发表于 2022-10-20 21:09
首先谢谢你的回复,非常感激!
我试了一下,仍然不行!
第一点:filename值得是WRF模式的什么数据?wrf ...

你好,我用自己的WRFout数据试验了一下,出现了同样的问题。
经检查发现,是函数语句中读取的map_proj代码出现问题,map_proj       = info.Attributes(79).Value;
map_proj_name  = info.Attributes79).Name;
在我的文件中,应当变为124,关于这点,最好根据您自己的ncinfo修改,我修改后,map_projname=Polar Stereographic,map_proj=2。至于数据,只要你输入的数据包含了计算的数据信息,都是可以的。
请注意:这个函数的最关键部分在于获取数据的正确性,即这串代码:
%  获取WRF输出结果中的相应属性
map_proj       = info.Attributes(79).Value;
map_proj_name  = info.Attributes(79).Name;
dx             = info.Attributes(7).Value;
dx_name        = info.Attributes(7).Name;
dy             = info.Attributes(8).Value;
dy_name        = info.Attributes(8).Name;
truelat1       = info.Attributes(70).Value;
truelat1_name  = info.Attributes(70).Name;
truelat2       = info.Attributes(71).Value;
truelat2_name  = info.Attributes(71).Name;
stand_lon      = info.Attributes(73).Value;
stand_lon_name = info.Attributes(73).Name;
e_wen          = info.Attributes(4).Value;
e_wen_name     = info.Attributes(4).Name;
e_snn          = info.Attributes(5).Value;
e_snn_name     = info.Attributes(5).Name;
也许是因为WRF版本不同的原因,他的info.Attributes( )内的索引值并不能与我的WRFOUT文件对应,再使用时,您应当根据您的ncinfo中的Attributes进行修改。
子程序公式主要是根据特定的投影信息进行的一些转换,这并没有什么特别,关于WRF里的投影及其参数,您可以参看https://www2.mmm.ucar.edu/wrf/us ... uda_wps_general.pdf中的PROJECTION部分的简要说明,大概了解WRF中的四种投影及一些参数的意义。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-10-23 20:48:29 | 显示全部楼层
谷梁陌尘 发表于 2022-10-21 11:29
你好,我用自己的WRFout数据试验了一下,出现了同样的问题。
经检查发现,是函数语句中读取的map_proj代 ...

非常感谢您的回复,但是有一点我不太明白(我上网搜了没有搜出来),所以想再次请教您。
您回复的话语中有这样一句“他的info.Attributes( )内的索引值并不能与我的WRFOUT文件对应,再使用时,您应当根据您的ncinfo中的Attributes进行修改。”
请问:这个在matlab中如何获取,本人第一做,不太懂。
              我是在matlab中输入ncinfo('wrfout**'),出来的结果
                                                                                  包含以下字段的 struct:

                                                                                    Filename: 'G:\process\data\turnij\wrfout_d01_2021-12-07_12  00  00'
                                                                                   Name: '/'
                                                                                   Dimensions: [1×10 struct]
                                                                                   Variables: [1×177 struct]
                                                                                   Attributes: [1×132 struct]
                                                                                   Groups: []
                                                                                   Format: 'netcdf4'
我想请问一下,如何具体获得?谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-10-24 10:25:16 | 显示全部楼层
269772539 发表于 2022-10-23 20:48
非常感谢您的回复,但是有一点我不太明白(我上网搜了没有搜出来),所以想再次请教您。
您回复的话语中 ...

在工作区点击Attributes就行了。
或者attr=ncinfo.Attributes
然后使用fieldnames查看attr所有字段名称,通过名称索引访问对应的Value给予赋值。
ncinfo与attr都是以Struct方式存储,你可以查看相关博文了解matlab中的Struct数组特征。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-11-7 00:11:25 | 显示全部楼层
谷梁陌尘 发表于 2022-10-24 10:25
在工作区点击Attributes就行了。
或者attr=ncinfo.Attributes
然后使用fieldnames查看attr所有字段名称 ...

您好,我现在将他的子程序整体安装主程序运行,但是有个问题,麻烦问下WRF模式模拟域与网格域之间转换的公式是什么?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表