Leosar
Leosar

Reputation: 2072

Copy metadata between two raster objects R

I have two geotiff raster files, one has all the metadata information and in the other the metadata information was lost. I know that all the metadata information was exactly the same so I want to copy it from one file to the other. I tried to use raster, because I made all the processing in R.

This is the file with metadata

af1_patch <-raster(a_files[6])

af1_patch

class       : RasterLayer 
dimensions  : 38400, 38400, 1474560000  (nrow, ncol, ncell)
resolution  : 231.656, 231.656  (x, y)
extent      : -2223901, 6671703, -4447802, 4447802  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs 
data source : Forest_patches_AF_1.tif 
names       : Forest_patches_AF_1
values      : 0, 255  (min, max)

And this is the file without the metadata

af1_area <-raster(a_files[1])

af1_area

class       : RasterLayer 
dimensions  : 38400, 38400, 1474560000  (nrow, ncol, ncell)
resolution  : 1, 1  (x, y)
extent      : 0, 38400, 0, 38400  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : africa_AF_1.tif 
names       : africa_AF_1 
values      : 0, 255  (min, max)

I tried to copy the metadata using:

res(af1_area) <- res(af1_patch)
crs(af1_area) <- crs(af1_patch)
extent(af1_area) <- extent(af1_patch)

but it doesn't work, dimensions and resolution are incorrect and the data values are lost:

af1_area

class       : RasterLayer 
dimensions  : 166, 166, 27556  (nrow, ncol, ncell)
resolution  : 53588, 53588  (x, y)
extent      : -2223901, 6671703, -4447802, 4447802  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs 


 hist(af1_area)

   Error in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...) : 
   cannot make a histogram; need data on disk or in memory

Thanks!

Upvotes: 0

Views: 445

Answers (2)

MikeJewski
MikeJewski

Reputation: 357

I think that this is occuring because you are changing the resolution before changeing the extent, because this, the extent is bound by the resolution that you have assigned to it. I was able to reproduce your problem and solve it by changing the order of the process. Hope it works for you!

library(raster)
x <- raster(matrix(1:10))
proj4string(x) <- CRS("+proj=longlat")
extent(x) <- extent(-10,10,-10,10)

y <- raster(matrix(1:10))
z <- raster(matrix(1:10))

#Current Process
res(y) <- res(x)
crs(y) <- crs(x)
extent(y) <- extent(x)

#Working Process
extent(z) <- extent(x)
res(z) <- res(x)
crs(z) <- crs(x)

Output:

> x
class       : RasterLayer 
dimensions  : 10, 1, 10  (nrow, ncol, ncell)
resolution  : 20, 2  (x, y)
extent      : -10, 10, -10, 10  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 
data source : in memory
names       : layer 
values      : 1, 10  (min, max)

> y
class       : RasterLayer 
dimensions  : 1, 1, 1  (nrow, ncol, ncell)
resolution  : 20, 20  (x, y)
extent      : -10, 10, -10, 10  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 

> z
class       : RasterLayer 
dimensions  : 10, 1, 10  (nrow, ncol, ncell)
resolution  : 20, 2  (x, y)
extent      : -10, 10, -10, 10  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 
data source : in memory
names       : layer 
values      : 1, 10  (min, max)

Upvotes: 1

Forrest R. Stevens
Forrest R. Stevens

Reputation: 3485

I would just reassign the values which will preserve the metadata, and re-write the file:

af1_patch <-raster(a_files[6])
af1_area <-raster(a_files[1])

af1_patch[] <- af1_area[]
#writeRaster(af1_patch, a_files[1], ...)

Upvotes: 0

Related Questions