【问题标题】:The variable from a netcdf file comes out flippednetcdf 文件中的变量出现翻转
【发布时间】:2012-11-21 22:08:23
【问题描述】:

我从

下载了一个 nc 文件
f=open.ncdf("file.nc")
[1] "file Lfile.nc has  2 dimensions:"
[1] "Longitude   Size: 1440"
[1] "Latitude   Size: 720"
[1] "------------------------"
[1] "file filr.nc has   8 variables:"
[1] "short ts[Latitude,Longitude]  Longname:Skin Temperature (2mm) Missval:NA"

然后我想使用变量 soil_moisture_c

A = get.var.ncdf(nc=f,varid="soil_moisture_c",verbose=TRUE)

然后我用image(A) 绘制A。我得到了下面显示的地图,我什至把它换成了image(t(a)),但它被改变了到另一个方向,而不是它应该是怎样的。无论如何,为了知道出了什么问题,我使用了 netcdf 查看器 Panoply 并且地图被正确绘制,如下所示。

【问题讨论】:

    标签: r netcdf


    【解决方案1】:

    原因是您使用的NetCDF接口非常低级,您所做的只是读出变量而没有任何维度信息。网格的方向实际上是任意的,坐标信息需要在特定的上下文中理解。

    library(raster) ## requires ncdf package for this file  
    d <- raster("LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T185959Z_20040114.nc", varname = "soil_moisture_c")
    

    (我使用了与您不同的文件,但它应该可以正常工作)。

    事实证明,即使是 raster 也无法在没有工作的情况下做到这一点,但它确实很容易纠正:

    d <-  flip(t(d), direction = "x")
    

    这会转置数据并围绕“x”(经度)翻转,从而使地理配准与原始上下文保持一致。

    使用 maptools 中的地图绘制它以进行检查:

    plot(d)
    
    library(maptools)
    data(wrld_simpl)
    plot(wrld_simpl, add = TRUE)
    

    还有很多其他方法可以通过从文件中读取维度信息来实现这一点,但这至少是为您完成大部分艰苦工作的捷径。

    【讨论】:

    • 您应该对此提出一个新问题,因为这与原始问题(翻转地图与创建 envi 文件)几乎没有关系,并且 cmets 的格式实际上不允许您发布足够多的代码以便理解。
    【解决方案2】:

    作为对@mdsumner 更好的解决方案的补充,这是一种仅使用库ncdf 的方法。

    library(ncdf)
    f <- open.ncdf("LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040101.nc")
    A <- get.var.ncdf(nf,"soil_moisture_c")
    

    您所需要的只是找到您的尺寸,以便有一个连贯的 x 轴和 y 轴。如果您查看您的 netCDF 对象尺寸,您会看到以下内容:

    str(f$dim)
    List of 2
     $ Longitude:List of 8
      ..$ name         : chr "Longitude"
      ..$ len          : int 1440
      ..$ unlim        : logi FALSE
      ..$ id           : int 1
      ..$ dimvarid     : num 2
      ..$ units        : chr "degrees_east"
      ..$ vals         : num [1:1440(1d)] -180 -180 -179 -179 -179 ...
      ..$ create_dimvar: logi TRUE
      ..- attr(*, "class")= chr "dim.ncdf"
     $ Latitude :List of 8
      ..$ name         : chr "Latitude"
      ..$ len          : int 720
      ..$ unlim        : logi FALSE
      ..$ id           : int 2
      ..$ dimvarid     : num 1
      ..$ units        : chr "degrees_north"
      ..$ vals         : num [1:720(1d)] 89.9 89.6 89.4 89.1 88.9 ...
      ..$ create_dimvar: logi TRUE
      ..- attr(*, "class")= chr "dim.ncdf"
    

    因此您的尺寸是:

     f$dim$Longitude$vals -> Longitude
     f$dim$Latitude$vals -> Latitude
    

    现在您的 Latitude 从 90 变为 -90 而不是相反的 image 更喜欢,所以:

     Latitude <- rev(Latitude)
     A <- A[nrow(A):1,]
    

    最后,正如您所注意到的,对象 A 的 x 和 y 被翻转,因此您需要转置它,并且您的 NA 值由于某些原因由值 -32767 表示:

    A[A==-32767] <- NA
    A <- t(A)
    

    最后是剧情:

    image(Longitude, Latitude, A)
    library(maptools)
    data(wrld_simpl)
    plot(wrld_simpl, add = TRUE)
    

    编辑:要在您的 31 个文件上执行此操作,让我们将您的文件名向量 ncfilesyourpath 称为您存储它们的目录(为简单起见,我将假设您的变量总是被称为 soil_moisture_c 并且你的 NA 总是 -32767):

    ncfiles
     [1] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040101.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040102.nc"
     [3] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040103.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040104.nc"
     [5] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040105.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040106.nc"
     [7] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040107.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040108.nc"
     [9] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040109.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040110.nc"
    [11] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040111.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040112.nc"
    [13] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040113.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040114.nc"
    [15] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040115.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040116.nc"
    [17] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040117.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040118.nc"
    [19] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040119.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040120.nc"
    [21] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040121.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040122.nc"
    [23] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040123.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040124.nc"
    [25] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040125.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040126.nc"
    [27] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040127.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040128.nc"
    [29] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040129.nc" "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040130.nc"
    [31] "LPRM-AMSR_E_L3_D_SOILM3_V002-20120520T173800Z_20040131.nc"
    
    yourpath
     [1] "C:\\Users"
    
    library(ncdf)
    library(maptools)
    data(wrld_simpl)
    for(i in 1:length(ncfiles)){
        f <- open.ncdf(paste(yourpath,ncfiles[i], sep="\\"))
        A <- get.var.ncdf(f,"soil_moisture_c")
        f$dim$Longitude$vals -> Longitude
        f$dim$Latitude$vals -> Latitude
        Latitude <- rev(Latitude)
        A <- A[nrow(A):1,]
        A[A==-32767] <- NA
        A <- t(A)
        close.ncdf(f) # this is the important part
        png(paste(gsub("\\.nc","",ncfiles[i]), "\\.png", sep="")) # or any other device such as pdf, jpg...
        image(Longitude, Latitude, A)
        plot(wrld_simpl, add = TRUE)
        dev.off()
        }
    

    【讨论】:

    • 干得好,我稍后会对此进行扩展,但只是简单地快速作弊:)
    • 谢谢。我想写成二进制文件使用 ,,,,,,,,,,,to.write = file(paste("C:\\amserfromplannp.bin",sep= ""),"wb"),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, > writeBin(as.integer(A), to.write, size = 2),,,,,,,,,但是当我用另一个soft-where打开二进制文件时,我发现地图是颠倒的。
    • 我添加了ncfilesyourpath,因为不够清楚。
    • 这和原来的q有什么关系?
    【解决方案3】:

    您也可以使用 CDO 从命令行简单地反转纬度:

    cdo invertlat file.nc file_inverted.nc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2017-07-07
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多