简体   繁体   中英

R - extract part of .nc file and convert into raster (similar to WorldClim format)

I have a netcdf file I made which contains percentage values. The file has 1 variable, 5 dimensions and 0 NetCDF attributes. The dimensions are "lon" "lat" "month" "CR" "yearSumm"

They were created using

lon <- ncdim_def("lon", "modis_degrees", -179.5:179.5, unlim=FALSE, 
    create_dimvar=TRUE, calendar=NA, longname="Longitude")
lat <- ncdim_def("lat", "modis_degrees", -89.5:89.5, unlim=FALSE, 
    create_dimvar=TRUE, calendar=NA, longname="Latitude")
month <- ncdim_def("month", "month_name", 1:13, unlim=FALSE, 
    create_dimvar=TRUE, calendar=NA, longname="Month.and.Annual.Data")
CR <- ncdim_def("CR", "CR_numeric", 1:12, unlim=FALSE, 
    create_dimvar=TRUE, calendar=NA, longname="Cloud.Regime")
yearSumm <- ncdim_def("yearSumm", "yearOrSummType", 1:21, unlim=FALSE, 
    create_dimvar=TRUE, calendar=NA, longname="Year.and.Summary.Data")

I want to extract 13 layers (each latxlong with each cell a percentage value) from this and make them into a raster file like the bioclimatic data you can download from worldclim

I have tried extracting the data I want into an array, to then make a raster. I did that using

CR_RFO <- ncvar_get(CRnc, attributes(CRnc$var)$names[1]) 
CR_Ann <- as.array(CR_RFO[1:360, 1:180, 13, 1:12, 18])

This seems to have selected the data I want. I then tried to make that into raster format.

raster(CR_Ann)
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘raster’ for signature ‘"array"’
> CR_R <- as.raster(CR_Ann)
Error in array(if (d[3L] == 3L) rgb(t(x[, , 1L]), t(x[, , 2L]), t(x[,  : 
  a raster array must have exactly 3 or 4 planes
> CR_R <- raster(CR_Ann)
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘raster’ for signature ‘"array"’
> CR_R <- stack(CR_Ann)
Error in data.frame(values = unlist(unname(x)), ind, stringsAsFactors = FALSE) : 
  arguments imply differing number of rows: 777600, 0
> CR_R <- brick(CR_Ann)

Eventually brick worked, but I don't think that is actually what I want. When I looked up the WorldClim files I downloaded, it is a zip file of.tifs

I also had tried

# set path and filename
ncpath <- "data/"
ncname <- "CR_RFO"  
ncfname <- paste(ncpath, ncname, ".nc", sep="")
dname <- "Ann"  # note: Ann means Annual

CR_raster <- brick(ncfname, varname="CR_RFO")
CR_raster; class(CR_raster)

which resulted in the error

CR_RFO has more than 4 dimensions, I do not know what to do with these data

I suspect I am going about it from the wrong angle, and maybe even have made my netcdf file incorrectly, as lat and long are not variables like in some of the examples I have read.

How can I extract these 13 lat x long layers and output them as.tif as per worldclim?

This is how I have ended up doing what I think I needed to. I haven't tested this in place of worldclim data yet, but I have successfully made the geotiff files.

CRnc <- nc_open("data/CR_RFO.nc")
CR_RFO <- ncvar_get(CRnc, attributes(CRnc$var)$names[1]) 

Repeat from here for each tif I want, selecting the correct number in the 4th place in the index, and changing the file names accordingly.

    CR1_Ann <- as.matrix(CR_RFO[1:360, 1:180, 13, 1, 18])
    CR1_Ann <- t(CR1_Ann)
    CR1_Ann <- flipud(CR1_Ann)
    CR1_Annr <- raster(CR1_Ann, ymn = -89.5, ymx = 89.5, xmn = -179.5, xmx = 179.5) 
    #plot(CR1_Annr)
    writeRaster(CR1_Annr, "./data/CR_Ann/CR1_Ann", format = "GTiff")

This is not an elegant solution, so if anyone has a better way, please share.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM