簡體   English   中英

將柵格名稱從柵格堆棧導出到R中的NetCDF文件

[英]Export raster names from raster stack to NetCDF file in R

我正在嘗試從netcdf文件中提取柵格圖層名稱,如先前從柵格堆棧中寫入的那樣。 將柵格堆棧導出到ncdf可以正常工作。 例如:

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)

#Give each raster layer a name - in this instance years 2014 to 2016
names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X", yname="Y",zname="Year",
        zunit="numeric")

但是,當我將ncdf文件讀回R時,不會保留Z尺寸(即Year)。 例如:

#Open the new netcdf dataset and look at the Z dimention, i.e. "Year"
data.nc<- open.nc("rstack.nc")
Zdim = var.get.nc(ncfile=data.nc,variable="Year")
print(Zdim)
#[1] 1 2 3

因此,我們得到的是樂隊編號,即1,2,3。 但是我需要的是Year定義的文本(例如2014、2015、2016),其定義如下:

names(rstack)<-c("2014","2015","2016")

是否有可能做到這一點?? 這個問題不是新問題,請參考這里: https : //gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r

有一些復雜的解決方法來獲得所需的信息,但是它們似乎效率低下(即將堆棧轉換為矩陣然后從此處進行操作)。 只是想知道是否有一種更優雅的方法而不必編寫大量額外的代碼並占用不必要的RAM。

我不認為這是與其他問題相同的問題。 NetCDF變量沒有dimnames ,因此您不能以您想要的方式來回處理柵格堆棧。

但是, Zdim是Z維度上的 -不是名稱-並且至少我希望您在編寫它之前先設置setZ(rstack, <zdimvals>) 我對使用writeRaster生成3D變量沒有足夠的經驗,但這似乎行得通。

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)
rstack <- setZ(rstack, 2014:2016)
#names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF",     varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X",   yname="Y",zname="Year",
        zunit="numeric")

## your ncdf4 code was not right, looked like RNetCDF (which is fine)
data.nc<- nc_open("rstack.nc")
Zdim = ncvar_get(data.nc,varid="Year")
#print(Zdim)  ## now it's numeric
##[1] 2014 2015 2016

您可能想要探索用於存儲這些年份值的單位和元數據。

最后,這非常令人困惑,但最終歸結為NetCDF與更多GIS-y模型之間的脫節。 我不知道有什么簡單的方法可以理解它,但是原始的殘酷經驗。 NetCDF非常通用,功能非常強大,但是庫本身非常底層,過於簡單。 (所有都是平板和切片,沒有原始的“索引”抽象,至少不足以使用)。

柵格提供的工具非常高級,因此靈活性較差。 唯一接近其他級別的工具是Ferret,無論出於何種原因,對NetCDF的大量使用要么只是非常注重NetCDF,要么只是帶有基本元數據的啞數組。 像這樣的結構化對象很少見。 通常,使用“ nc運算符”工具可以更好地完成NetCDF操縱,但是我認為值得探索一些選擇,並且如果可以讓R的柵格進行所需的工作,那將是前進的方向。

Python在NetCDF和GDAL中也非常流行-但是GDAL與柵格具有相同的“ GIS-y”觀點。 這很復雜,就我個人而言,僅使用R和GDAL即可獲得99%的收益,但是我確實在需要時使用其他工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM