有人給我發送了一些R
代碼,使用R
包raster
等來讀取netCDF
文件。該代碼創建一系列*.tif
文件。不幸的是,我不是很熟悉raster
,*.tif
文件或netCDF
文件。所以,我試圖改變R
的代碼也寫*.csv
文件。我認爲下面的代碼以*.tif
格式和*.csv
格式寫入相同的網格單元格數據。但是,我不確定。我希望有人能夠驗證這兩種格式的數據是相同的。理想情況下,我希望能夠打開*.tif
文件並自己進行驗證。我怎樣才能做到這一點?writeRaster vs write.table或.tif vs .csv
如果*.tif
文件只包含圖像而不是數字,那麼也許不可能進行直接比較。在這種情況下,我想驗證在*.tif
文件中的圖像對應的數據在*.csv
文件
下面的R
代碼是*.csv
文件的內容與有關列和行「後續問題標題。
setwd('c:/users/mark w miller/netCDF/')
my.file <- "my.netCDF.nc"
my.var1 <- "my.variable"
library(ncdf)
library(rgdal)
library(chron)
library(fields)
file <- open.ncdf(my.file)
long <- get.var.ncdf(file, varid="lon")
lat <- get.var.ncdf(file, varid="lat")
time <- get.var.ncdf(file, varid="time")
my.varb <- get.var.ncdf(file, varid=my.var1)
#netCDF to raster
library(raster)
r <- brick(my.file, varname = my.var1)
#Crop spatial coverage
e <- extent(255,265,35,45)
rc <- crop(r, e, bylayer=TRUE)
lat2 <- lat[ lat >= 35 & lat <= 45]
long2 <- long[long >= 255 & long <= 265]
list1 <- unstack(rc)
rs <- stack(list1)
for(i in 1:5){
r2 <- 1+(i-1)*12
s2 <- 2+(i-1)*12
a2 <- rs[[r2]]
b2 <- rs[[s2]]
m2 <- stack(a2,b2)
my.var <- overlay(m2, fun=function(x,y) {(x+y)}, unstack=TRUE, recycle=FALSE)
f2 <- 1999+i
writeRaster(my.var, filename=paste("my.var", f2, ".tif"), format="GTiff")
my.var2 <- as.matrix(my.var, nrow=length(lat2), byrow=TRUE)
write.table(my.var2, file = paste0("my.var", f2, ".csv"), quote = FALSE, sep=",", col.names = FALSE, row.names = FALSE)
}
這裏有一個*.csv
文件的舍入內容:
1.0,0.9,0.8,0.8,0.7,0.7,0.8,0.8,1.0,1.0
1.0,0.8,0.6,0.5,0.4,0.5,0.7,0.9,1.0,1.0
1.0,0.7,0.5,0.4,0.3,0.4,0.7,1.0,1.0,1.0
0.0,0.5,0.4,0.4,0.4,0.6,1.0,1.0,1.0,1.0
0.0,0.6,0.5,0.4,0.5,0.8,1.0,2.0,2.0,2.0
1.0,0.7,0.6,0.5,0.6,1.0,1.0,2.0,2.0,2.0
1.0,0.9,0.8,0.7,0.9,1.0,2.0,2.0,2.0,2.0
1.0,1.0,1.0,1.0,1.0,2.0,2.0,2.0,1.0,2.0
2.0,1.0,1.0,1.0,2.0,2.0,2.0,1.0,1.0,2.0
1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0
鑑於:
lat2
# [1] 44.5 43.5 42.5 41.5 40.5 39.5 38.5 37.5 36.5 35.5
long2
# [1] 255.5 256.5 257.5 258.5 259.5 260.5 261.5 262.5 263.5 264.5
我可以放心地下面列和行的名稱分別添加到*.csv
文件?
255.5 256.5 257.5 258.5 259.5 260.5 261.5 262.5 263.5 264.5
44.5 1.0,0.9,0.8,0.8,0.7,0.7,0.8,0.8,1.0,1.0
43.5 1.0,0.8,0.6,0.5,0.4,0.5,0.7,0.9,1.0,1.0
42.5 1.0,0.7,0.5,0.4,0.3,0.4,0.7,1.0,1.0,1.0
41.5 0.0,0.5,0.4,0.4,0.4,0.6,1.0,1.0,1.0,1.0
40.5 0.0,0.6,0.5,0.4,0.5,0.8,1.0,2.0,2.0,2.0
39.5 1.0,0.7,0.6,0.5,0.6,1.0,1.0,2.0,2.0,2.0
38.5 1.0,0.9,0.8,0.7,0.9,1.0,2.0,2.0,2.0,2.0
37.5 1.0,1.0,1.0,1.0,1.0,2.0,2.0,2.0,1.0,2.0
36.5 2.0,1.0,1.0,1.0,2.0,2.0,2.0,1.0,1.0,2.0
35.5 1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0
感謝您的任何建議。實際的NetCDF文件非常大。如果我能弄清楚如何對它進行子集化並將其保存爲相同的netCDF格式,我可能會嘗試將它上傳到某處。
編輯
下面是代碼來創建模擬數據,這些模擬數據轉換爲netCDF文件和分析netCDF文件如在上面的代碼:
setwd('c:/users/mark w miller/netCDF/')
library(raster)
library(ncdf)
library(rgdal)
library(chron)
library(fields)
library(sp)
set.seed(1234)
x = seq(255, 269, length = 8)
y = seq( 36, 40, length = 5)
xy <- expand.grid(x,y)
z <- rnorm(nrow(xy), 10, 1)
rc <- data.frame(xy,z)
raster.rc1 <- rasterFromXYZ(rc, res=c(2,1), crs=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))
z <- rnorm(nrow(xy), 10, 1)
rc <- data.frame(xy,z)
raster.rc2 <- rasterFromXYZ(rc, res=c(2,1), crs=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))
z <- rnorm(nrow(xy), 10, 1)
rc <- data.frame(xy,z)
raster.rc3 <- rasterFromXYZ(rc, res=c(2,1), crs=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))
z <- rnorm(nrow(xy), 10, 1)
rc <- data.frame(xy,z)
raster.rc4 <- rasterFromXYZ(rc, res=c(2,1), crs=CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))
all.years <- list(raster.rc1, raster.rc2, raster.rc3, raster.rc4)
#all.rc <- stack(all.years)
all.rc <- brick(all.years)
writeRaster(all.rc, filename="example.netCDF.nc", format="CDF", bylayer=TRUE, overwrite=TRUE)
my.file <- open.ncdf('example.netCDF.nc')
my.file
long <- get.var.ncdf(my.file, varid="longitude")
lat <- get.var.ncdf(my.file, varid="latitude")
time <- get.var.ncdf(my.file, varid="value")
my.var <- get.var.ncdf(my.file, varid="variable")
long
# [1] 255 257 259 261 263 265 267 269
lat
# [1] 40 39 38 37 36
time
# [1] 1 2 3 4
my.var
r <- brick('example.netCDF.nc', varname = 'variable')
#Crop spatial coverage
e <- extent(257,267,37,39)
rc <- crop(r, e, bylayer=TRUE)
lat2 <- lat[ lat >= 37 & lat <= 39]
lat2
long2 <- long[long >= 257 & long <= 267]
long2
list1 <- unstack(rc)
rs <- stack(list1)
for(i in 1:2){
r2 <- 1+(i-1)*2
s2 <- 2+(i-1)*2
a2 <- rs[[r2]]
b2 <- rs[[s2]]
m2 <- stack(a2,b2)
my.sim <- overlay(m2, fun=function(x,y) {(x+y)}, unstack=TRUE, recycle=FALSE)
f2 <- 2010+i
writeRaster(my.sim, filename=paste("my.sim", f2, ".tif"), format="GTiff")
my.sim2 <- as.matrix(my.sim, nrow=length(lat2), byrow=TRUE)
write.table(my.sim2, file = paste0("my.sim", f2, ".csv"), quote = FALSE, sep=",", col.names = FALSE, row.names = FALSE)
}
我會從as.data.frame(subset(rc,1),xy = TRUE)開始 – mdsumner
@mdsumner謝謝。這似乎提取了一層數據並將其轉換爲數據幀。也許我可以用'create.ncdf'把這個數據幀轉換成一個netCDF文件。 –
使用writeRaster創建一個netcdf文件 – mdsumner