2017-08-25 1 views
2

J'ai quelques grands rasters (~ 110 Mo chacun) Je veux effectuer des calculs raster sur. Pour les besoins de cet exemple, je veux faire la moyenne des fichiers SNDPPT_M_sl1_1km_ll.tif et SNDPPT_M_sl2_1km_ll.tif, disponible au this website. En réalité, les maths sont un peu plus complexes (multiplication et division de plusieurs rasters).R- Mathématiques raster tout en préservant le format entier

Les deux rasters d'entrée sont des données entières (INT1U), et j'aimerais que la sortie soit également INT1U. Cependant, chaque fois que j'essaie de faire un calcul raster, il crée des fichiers temporaires intermédiaires au format virgule flottante dont la taille est très grande. Je travaille sur un ordinateur portable avec environ 7 Go d'espace disque libre, qui est rempli avant que le calcul est terminé.

# load packages 
require(raster) 

## script control 
# which property? 
prop <- "SNDPPT" 

# load layers 
r.1 <- raster(paste0("1raw/", prop, "_M_sl1_1km_ll.tif")) 
r.2 <- raster(paste0("1raw/", prop, "_M_sl2_1km_ll.tif")) 

# allocate space for output raster - this is about 100 MB (same size as input files) 
r.out <- writeRaster(r.1, 
        filename=paste0("2derived/", prop, "_M_meanTop200cm_1km_ll.tif"), 
        datatype="INT1U") 

# perform raster math calculation 
r.out <- integer(round((r.out+r.2)/2)) 

# at this point, my hard drive fills due to temporary files > 7 GB in size 

qui le sait d'une solution de contournement pour réaliser des opérations mathématiques de trame en R avec entrée entier et les fichiers de sortie tout en minimisant ou en évitant les fichiers intermédiaires très importants?

+1

Je ne suis pas familier avec le paquet raster, mais pourriez-vous essayer si r.out <- (r.out + r.2)% /% 2) fonctionne? (Ce n'est pas exactement ce que vous voulez, mais fermez) –

Répondre

2

L'astuce ici pourrait être d'utiliser raster::overlay pour faire le calcul et enregistrer les résultats en tant que tiff comprimé en même temps. Quelque chose comme ceci devrait fonctionner:

library(raster) 
#> Loading required package: sp 
# load layers 
r.1 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif") 
r.2 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif") 

out <- raster::overlay(r.1, r.2, 
         fun = function(x, y) (round((x + y)/2)), 
         filename = "C:/Users/LB_laptop/Downloads/SNDPPT_out.tif", 
         datatype = "INT1U", 
         options = "COMPRESS=DEFLATE") 
> out 
class  : RasterLayer 
dimensions : 16800, 43200, 725760000 (nrow, ncol, ncell) 
resolution : 0.008333333, 0.008333333 (x, y) 
extent  : -180, 180, -56.00083, 83.99917 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : C:\Users\LB_laptop\Downloads\SNDPPT_out.tif 
names  : SNDPPT_out 
values  : 0, 242 (min, max) 

HTH.

+0

Merci @LoBu - bon point sur les résultats plus grands que 255. Dans mon cas, toutes les valeurs sont des pourcentages (0-100) et je fais la moyenne, donc je connais le le résultat ne sera jamais supérieur à 100, c'est pourquoi je suis OK avec le format INT1U dans tous les cas. Donc, cette solution a bien fonctionné pour moi une fois que j'ai défini la fonction comme 'function (x, y) (round ((x + y)/2))', produisant un raster de sortie de la même taille que les entrées (~ 120 Mo). –

+1

Bien. Considérons que je viens d'éditer la réponse parce que la syntaxe de l'option "compression" était erronée. – lbusett

+0

Ah, maintenant je l'ai! J'utilisais la multiplication à la place de la sommation. J'ai corrigé la réponse pour refléter cela. – lbusett