在栅格砖块中交换轴

6

使用R语言的raster包,我从文件中获取了一个brick。这个文件具有以下ncdump头部信息(这里展示了一个小文件的例子,实际文件要大得多):

dimensions:
        lon = 2 ;
        lat = 3 ;
        time = UNLIMITED ; // (125000 currently)
variables:
        float lon(lon) ;
                lon:standard_name = "longitude" ;
                lon:long_name = "longitude" ;
                lon:units = "degrees_east" ;
                lon:axis = "X" ;
        float lat(lat) ;
                lat:standard_name = "latitude" ;
                lat:long_name = "latitude" ;
                lat:units = "degrees_north" ;
                lat:axis = "Y" ;
        double time(time) ;
                time:standard_name = "time" ;
                time:long_name = "Time" ;
                time:units = "seconds since 2001-1-1 00:00:00" ;
                time:calendar = "standard" ;
                time:axis = "T" ;
        short por(time, lat, lon) ;
                por:_FillValue = 0s ;
                por:missing_value = 0s ;

R 中:

class       : RasterBrick 
dimensions  : 3, 2, 6, 125000  (nrow, ncol, ncell, nlayers)
resolution  : 0.008999825, 0.009000778  (x, y)
extent      : 6.4955, 6.5135, 44.0955, 44.1225  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : /home/clima-archive/afantini/chym/chym_output/test.nc 
names       : X0, X3600, X7200, X10800, X14400, X18000, X21600, X25200, X28800, X32400, X36000, X39600, X43200, X46800, X50400, ... 
z-value     : 0, 449996400 (min, max)
varname     : por

然而,为了更快的访问和更高的压缩,文件的两个维度已经交换,以便我们需要的使用方式更好地进行分块。所以文件将是这样的(下载1MB文件的链接):

dimensions:
        lon = UNLIMITED ; // (2 currently)
        lat = 3 ;
        time = 125000 ;
variables:                                                                                                                                                                                                                            
        float lon(lon) ;                                                                                                                                                                                                              
                lon:standard_name = "longitude" ;                                                                                                                                                                                     
                lon:long_name = "longitude" ;                                                                                                                                                                                         
                lon:units = "degrees_east" ;                                                                                                                                                                                          
                lon:axis = "X" ;                                                                                                                                                                                                      
        float lat(lat) ;                                                                                                                                                                                                              
                lat:standard_name = "latitude" ;                                                                                                                                                                                      
                lat:long_name = "latitude" ;                                                                                                                                                                                          
                lat:units = "degrees_north" ;                                                                                                                                                                                         
                lat:axis = "Y" ;                                                                                                                                                                                                      
        double time(time) ;                                                                                                                                                                                                           
                time:standard_name = "time" ;                                                                                                                                                                                         
                time:long_name = "Time" ;                                                                                                                                                                                             
                time:units = "seconds since 2001-1-1 00:00:00" ;                                                                                                                                                                      
                time:calendar = "standard" ;                                                                                                                                                                                          
                time:axis = "T" ;                                                                                                                                                                                                     
        short por(lon, lat, time) ;
                por:_FillValue = 0s ;
                por:missing_value = 0s ;

R中:

class       : RasterBrick 
dimensions  : 3, 125000, 375000, 2  (nrow, ncol, ncell, nlayers)
resolution  : 3600, 0.009000778  (x, y)
extent      : -1800, 449998200, 44.0955, 44.1225  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : /home/clima-archive/afantini/chym/chym_output/test_swapped.nc 
names       : X6.5, X6.50899982452393 
degrees_east: 6.5, 6.50899982452393 
varname     : por

如您所见,该文件似乎以125000列的数量打开。我想交换列数和层数,而不必读取所有数据。从栅格手册中,我认为应该使用layerlvar,因为:

layer:整数。在多层文件中使用的层(变量), 或从RasterStack / Brick或SpatialPixelsDataFrame 或SpatialGridDataFrame中提取的层。如果‘layer = 0’则返回一个空的RasterLayer(没有关联值)。

.......

‘lvar’:integer> 0(默认值=3)。如果文件有4个维度(例如深度而不是时间),则选择要使用的“级别变量”(第三维变量)。

但是这似乎行不通,例如设置layer =“time”,因为它不起作用。
我该如何做呢?
1个回答

3

如果您不介意在打开/阅读后重新塑造数据,我认为可以使用ncdf4库将数据读入变量中,然后进行转置。具体操作如下:

nc   <- nc_open(*your_nc_file*)
data <- ncvar_get(nc, por)     # "por" is the name of your variable, right ? 
data_new <- aperm(data, c(1,3,2)) # "transpose" the matrix

可能的问题是data_new不再是raster*对象,但你可以很容易地从中重新创建一个。

希望这有帮助,

Lorenzo


如果我没有错的话,这意味着需要读取整个变量,而由于它太大,这是不可行的。实际上,我只需要正确定义栅格(因为我要对分辨率、单元格数等进行一些计算),并且只读取一小部分长度为125000的向量。 - AF7
1
好的。我有一个想法,但最好在真实文件上测试它,而不是在模拟文件上。 - lbusett
1
好的。所以我猜想,即使读取该文件可以给您所需的结果,您也不想将数据“重新保存”到另一个文件中,否则您就不会交换它了,对吗?我猜测您是在交换维度以提高“光谱处理”速度,我猜测我是正确的。如果是这样,为什么不全部使用BIP格式保存呢?[链接] http://idlcoyote.com/ip_tips/where3.html - lbusett
1
顺便说一下:我假设你已经看到了这些相关的帖子:https://dev59.com/OmIj5IYBdhLWcg3wv3i2 和 https://dev59.com/a37aa4cB1Zd3GeqPrIJf,对吗? - lbusett
1
好的,很抱歉我无法帮助你。如果你设法解决了,请告诉我:现在我变得很好奇!再见,Lorenzo - lbusett
显示剩余19条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接