爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10392|回复: 9

[程序设计] 关于nc数据插值到站点的问题

[复制链接]

新浪微博达人勋

发表于 2015-5-2 18:10:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sinohack 于 2015-5-2 18:16 编辑

有CMIP5模式下载的气温nc文件,需要插值求已知站点的温度值,采用反距离加权插值法(IDW)进行插值。经过从论坛和网上学习,用以下下程序进行,根据自己的理解做了注释,但总是在插值的时候出错,请各位帮忙给看看。excel文件为已知站点的经纬度,由两列,一列为经度,一列为纬度。先取了9个站点进行调试程序。

  1. % 读取nc文件
  2. ncid = netcdf.open('C:\Users\chris\Desktop\matlab格点数据\tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc','NOWRITE'); %打开nc文件
  3. ncdisp('tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc'); %在命令窗中显示nc文件的变量
  4. tasData  = ncread('tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc','tas'); %读入变量tas
  5. TimeData  = ncread('tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc','time'); %读入变量time
  6. LonData  = ncread('tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc','lon'); %读入变量lon
  7. LatData  = ncread('tas_Amon_CCSM4_rcp45_r1i1p1_200601-210012.nc','lat'); %读入变量lat
  8. [xx,yy]=meshgrid(LonData,LatData);
  9. tasData=permute(tasData, [2 1 3]);
  10. %读取nc文件变量完成


  11. %读取要求站点excl文件经纬度
  12. lat1 = xlsread('C:\Users\chris\Desktop\matlab格点数据\站点.xls',2,'d2:d10');
  13. lon1 = xlsread('C:\Users\chris\Desktop\matlab格点数据\站点.xls',2,'e2:e10');
  14. %读取excl文件经纬度完成


  15. %IDW(反距离加权插值法)
  16. %其中x,y,z为已知坐标及其函数值,X,Y为要插值的坐标
  17. %x,y,z,X,Y最高为二维的,不可为三维
  18. %不考虑x,y中出现重复坐标的情况
  19. X=lat1;
  20. Y=lon1;
  21. x=xx;
  22. y=yy;
  23. z=tasData;



  24. [m0,n0]=size(x);%返回矩阵x的行数m0,列数n0;[r,c]=size(A)%将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
  25. [m1,n1]=size(X);%返回矩阵X的行数m1,列数n0;
  26. %生成距离矩阵r(m0*m1*n1,n0)
  27. for i=1:m1
  28.     for j=1:n1
  29.         r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)=sqrt((X(i,j)-x).^2+(Y(i,j)-y).^2);%求各点的距离并存入r矩阵的每行中
  30.     end
  31. end
  32. %定义插值函数
  33. for i=1:m1
  34.     for j=1:n1
  35.         if find(r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)==0)
  36.             [m2,n2]=find(r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)==0);
  37.             Z(i,j)=z(m2,n2);
  38.         else
  39.             numerator=sum(sum(z./r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)));
  40.             %z乘距离每一行所有列倒数再竖向求和得到一个行向量,然后再求行向量所有数值的和,r(i,:)表示矩阵r的第i行所有列
  41.             %(sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。而缺省的sum(x)就是竖向相加,求每列的和,结果是行向量。)
  42.             denominator=sum(sum(1./r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)));
  43.             %求距离矩阵倒数,然后竖向相加,得到一个行向量,然后再求行向量各个数的和
  44.             Z(i,j)=numerator/denominator;%IDW(反距离加权插值法)Z=Σ(距离的倒数/距离的倒数之和)*z
  45.         end
  46.     end
  47. end
复制代码



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

新浪微博达人勋

发表于 2015-8-12 15:54:33 | 显示全部楼层
楼主,我想问一下,你最后插值得到的Z的矩阵的规格是怎样的,跟X一样么?
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

发表于 2015-5-2 21:28:57 | 显示全部楼层
~~~~~~~~~~~~~~~~~~~~~~~~~~
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-5-3 13:00:15 | 显示全部楼层
学习了,非常感谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-27 16:06:57 | 显示全部楼层
请问楼主最后是如何解决的?
我运行时也是出现错误提示:

  1. 错误使用  ./
  2. 矩阵维度必须一致。

  3. 出错 chazhi (line 47)
  4.             numerator=sum(sum(z./r(m0*n1*(i-1)+m0*(j-1)+1:m0*n1*(i-1)+m0*(j),:)));
复制代码
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-30 17:46:42 | 显示全部楼层
谢谢楼主分享啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-9 16:32:45 | 显示全部楼层
请问一下,如何把CMIP模式插值到2.5°*2.5*的分辨率上
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-6-30 23:30:42 | 显示全部楼层
kimhyunjoong 发表于 2017-8-27 16:06
请问楼主最后是如何解决的?
我运行时也是出现错误提示:

请问,您解决这个问题了么
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-7-8 14:35:24 | 显示全部楼层
loser. 发表于 2019-6-30 23:30
请问,您解决这个问题了么

时间太久,我也不记得了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-7-8 23:02:08 | 显示全部楼层
kimhyunjoong 发表于 2019-7-8 14:35
时间太久,我也不记得了

{:5_275:}{:5_275:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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