请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7758|回复: 9

[其他] linint2_Wrap插值后地图是颠倒的

[复制链接]

新浪微博达人勋

发表于 2014-3-27 16:19:34 | 显示全部楼层 |阅读模式

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

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

x
求各位大神帮忙,我用linint2_Wrap把(lat1,lon1)网格上的数据插到(lat,lon)上。但是由于lat不是递增的,是递减的。所以我令lat2=lat(::-1);  然后
a = linint2_Wrap(field2&lon1,field2&lat1,field2,True,lon,lat2,0)
因为出的图是倒的,所以我就加了一句a1 = a(:,::-1,:)   但是画出的图还是倒的。想请教下,这是为什么,要怎么解决呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-27 16:55:49 | 显示全部楼层
呃,看你的描述,有点糊涂了。
a = linint2_Wrap(field2&lon1,field2&lat1,field2,True,lon,lat2,0)
既然这句可以执行,说明原始数据field2的lat1坐标是严格递增的,插值出来的a应该是完全正确的,不需要a1 = a(:,::-1,:)这步操作。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-27 17:15:17 | 显示全部楼层
本帖最后由 longlivehj 于 2014-3-27 17:18 编辑

解释一下为何加入a1 = a(:,::-1,:),图片没有任何改变。
a本身是带有坐标变量的,a1 = a(:,::-1,:)将a1在第二维上反序的同时,也将相应的坐标变量进行了反序;也就是说,a1如果在地理解释上其实没有发生任何改变,而ncl一些绘图函数直接用到了坐标变量。所以,即使a1 = a(:,::-1,:),出来的图是不会变的。

如果非要强行改,不需要a1 = a(:,::-1,:),只要a&lat1 = a&lat1(::-1)即可。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-27 23:34:32 | 显示全部楼层
longlivehj 发表于 2014-3-27 16:55
呃,看你的描述,有点糊涂了。
a = linint2_Wrap(field2&lon1,field2&lat1,field2,True,lon,lat2,0)
既然 ...

对  lat1是递增的 我没有改, 但是后的lat2原来不是递增,我就改成了递增的        后来,我用插值出来的数据画了图了, 我单独画出的 地图是正确的,  所以数据应该是没问题的    可能是画图的程序出错了,但我觉得很奇怪,我用别的数据,用相同的画图程序,画出来的地图是正确的。为什么用这个插值后的数据画,就颠倒了呢?(关键是,我另外写一个单独的程序简单地把插值后的数据画个图,地图又是正确的)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-27 23:38:21 | 显示全部楼层
eveninglyw 发表于 2014-3-27 23:34
对  lat1是递增的 我没有改, 但是后的lat2原来不是递增,我就改成了递增的        后来,我用插值出来的 ...

我这个可能还是没说清楚。  简单的说,就是  我用插值后的数据另外写一个画图程序(不同于我原来的画图程序),画出的地图是正确的; 而我用其它数据,用原来的画图程序画出的地图也是正确的。     这样,我就不知道,我到底是哪里出错了。   如果是原来的画图程序错了,那应该是哪一块出了问题呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-28 01:10:49 | 显示全部楼层
eveninglyw 发表于 2014-3-27 23:38
我这个可能还是没说清楚。  简单的说,就是  我用插值后的数据另外写一个画图程序(不同于我原来的画图程 ...

简单说,ncl里面,只要保证数据的存放和坐标变量排列保持对应,绘图时就一定不会出现问题!

对于你的回复,有太多疑问:

输出的纬度一般要自己生成,为何不一开始就生成递增数组,而要先生成递减的lat,然后转换成递增的lat2?

什么叫另外写了个画图程序?插值数据是如何传递给这个插值程序的?函数(过程)调用?还是把插值数据保存成了某种格式的文件?

如果真想弄清什么原因,最好能贴出程序和相关数据。数据太大,无法上传,可以把一些关键变量的信息打印贴出来,便于配合程序分析。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-28 12:59:07 | 显示全部楼层
longlivehj 发表于 2014-3-28 01:10
简单说,ncl里面,只要保证数据的存放和坐标变量排列保持对应,绘图时就一定不会出现问题!

对于你的 ...

我觉得 我的根本问题 还是在插值的问题上,我把我插值的过程给您看看吧。
     这是待插值的数据说明:(只给出了一部分,我用的变量都是 nj_o,ni_o格点的)
netcdf gx1v3.020.clim.1984-2000 {
dimensions:
        time = UNLIMITED ; // (1 currently)
        d2 = 2 ;
        ni_a = 192 ;
        nj_a = 94 ;
        ni_i = 320 ;
        nj_i = 384 ;
        ni_l = 192 ;
        nj_l = 94 ;
        ni_o = 320 ;
        nj_o = 384 ;
        ni_r = 19 ;
        nj_r = 1 ;
variables:
        double time(time) ;
                time:long_name = "time" ;
                time:units = "days since 0000-01-01 00:00:00" ;                           
                time:calendar = "noleap" ;
                time:bounds = "time_bound" ;        
          float domain_o_lat(nj_o, ni_o) ;
                domain_o_lat:long_name = "latitude" ;
                domain_o_lat:units = "degrees north" ;     
        float domain_o_lon(nj_o, ni_o) ;
                domain_o_lon:long_name = "longitude" ;
                domain_o_lon:units = "degrees east" ;
        float domain_o_area(nj_o, ni_o) ;
                domain_o_area:long_name = "cell area" ;
                domain_o_area:units = "rad^2" ;
        float domain_o_aream(nj_o, ni_o) ;
                domain_o_aream:long_name = "cell area from map file" ;
                domain_o_aream:units = "rad^2" ;
        float avXo2c_o_So_t(time, nj_o, ni_o) ;
                avXo2c_o_So_t:long_name = "temperature" ;
                avXo2c_o_So_t:units = "kelvin" ;
                avXo2c_o_So_t:missing_value = 1.e+30f ;
                avXo2c_o_So_t:_FillValue = 1.e+30f ;
                avXo2c_o_So_t:cell_method = "time: mean" ;
此外,我查看了nj_o,ni_o,nj_o是[-79.22002...72.1858],ni_o是[320.56,...359.9,1.0625,....320.2]  384*320

然后,我要插成的格点是:lat[90,...-78];lon[0,..361]  196*362

下面是我主要的程序(file1是待插值的数据文件,file2是需要插成的格点数据文件)
lon = file2->lon
lat_old = file2->lat
lat = lat_old(::-1)
lat_o = file1->domain_o_lat
lon_o = file1->domain_o_lon
lat_obs = lat_o(:,0)
lon_ob = lon_o(0,:)
lon_obs = lon_ob
lon_obs(0:283) = lon_ob(36:319)
lon_obs(284:319) = lon_ob(0:35)
field2 = file1->$变量名$
field2!0 = "time"
field2!1 = "lat"
field2!2 = "lon"
field2&lat = lat_obs
field2&lon = lon_obs
a = linint2_Wrap(field2&lon,field2&lat,field2,True,lon,lat,0)
a1 = a(:,::-1,:)
file3->$变量名$ = a1



以上是我插值的主要程序,请您帮我看看  是不是这里面出现了错误?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-28 14:11:03 | 显示全部楼层
eveninglyw 发表于 2014-3-28 12:59
我觉得 我的根本问题 还是在插值的问题上,我把我插值的过程给您看看吧。
     这是待插值的数据说明: ...

lon = file2->lon
lat_old = file2->lat
lat = lat_old(::-1)
lat_o = file1->domain_o_lat
lon_o = file1->domain_o_lon
lat_obs = lat_o(:,0)
lon_ob = lon_o(0,:)
lon_obs = lon_ob
lon_obs(0:283) = lon_ob(36:319)
lon_obs(284:319) = lon_ob(0:35)


;前面貌似是东西半球经度互换,那么在读取数据后,是否也要将数据同样处理?否则,后面赋予坐标变量时经度与数据就不对应了。
field2 = file1->$变量名$


field2!0 = "time"
field2!1 = "lat"
field2!2 = "lon"
field2&lat = lat_obs
field2&lon = lon_obs
a = linint2_Wrap(field2&lon,field2&lat,field2,True,lon,lat,0)

;这个之前说过了,没有必要这步操作!当然,做了也不算错。
a1 = a(:,::-1,:)


file3->$变量名$ = a1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-3-30 12:45:10 | 显示全部楼层
longlivehj 发表于 2014-3-28 14:11
lon = file2->lon
lat_old = file2->lat
lat = lat_old(::-1)

不好意思,回复晚了。其实我数据也是做了同样处理的。我再自己找找看,可能是画图的resources哪里不对了;但是最近由于进不去服务器,所以还看不了。不管怎么样,还是谢谢您了!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-13 09:44:12 | 显示全部楼层
{:lxm_24:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

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

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

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