Olá, novamente!
Encontrei um erro no código anterior e que está presente também na primeira solução que sugeri. Ao usar {raster} a definição de extent() estava incorreta. Os valores x e y correspondem ao centro do pixel e para o valor de extent() ficar correto deve-se considerar a resolução da imagem. É pouco perceptível na pequena escala, mas pode causar problemas ao aumentar a escala. Segue o código corrigido...
### <code r>
### Dados
require(raster)
data(volcano); volcano <- 10*volcano
image(volcano)
x <- 100*(1:nrow(volcano))
y <- 100*(1:ncol(volcano))
########## {ncdf4} ###########################################################
library(ncdf4)
nc1_dim1 <- ncdim_def('EW', 'm', as.double(x))
nc1_dim2 <- ncdim_def('SN', 'm', as.double(y))
nc1_varz <- ncvar_def('Elevation', 'm', list(nc1_dim1, nc1_dim2), -1, longname = 'Data about a Volcano')
nc1_out <- nc_create('volcano.nc', nc1_varz, force_v4 = TRUE) ncvar_put(nc1_out, nc1_varz, volcano)
nc_close(nc1_out)
########## {RNetCDF} #########################################################
require(RNetCDF)
var.def.nc(nc2_out, "Elevation", "NC_DOUBLE", c("EW", "SN")) att.put.nc(nc2_out, "Elevation", "_FillValue", "NC_DOUBLE", -999.9)
########## {raster} ##########################################################
require(raster)
tmp <- raster(volcano)
r <- t(flip(tmp, 1))
plot(r)
resx <- round(mean(x[-1]-x[-length(x)]), 6) # 100
resy <- round(mean(y[-1]-y[-length(y)]), 6) # 100
extent(r) <- c(range(x), range(y)) + c(-resx, +resx, -resy, +resy)/2
plot(r)
writeFormats()
# extents
cbind(sapply(paste0("r", 1:3), function(x) as.vector(extent(get(x)))))
# r1 r2 r3
# [1,] 50 50 50
# [2,] 8750 8750 8750
# [3,] 50 50 50
# [4,] 6150 6150 6150
{
windows()
par(mfrow=c(2,2))
sapply(paste0("r", 1:3), function(x) plot(get(x), main=x))
par(mfrow=c(1,1))
}
### </code>