[R-sig-Geo] clip a raster layer to a mask layer using raster algebra in R?

Christian Willmes c@willme@ @ending from uni-koeln@de
Thu Dec 6 13:33:29 CET 2018


Thank you.

It seems that both approaches need an additional, very expensive 
computation (takes several minutes on a i7-4790 with SSD) to create the 
mask or the extent, and in my case the mask computed by this command 
below is already what I want. Only values above a given RSL (Sealevel) 
height. The rest of the raster needs to be NA or NULL.

 >gebco_rsl <- gebco
 >gebco_rsl[gebco < rsl] <- NA

....

The easy (and faster) approach for creating a mask:

 >gebco_mask <- gebco >= rsl

writes 0's into the remaining cells, which does not work for me (and the 
mask() function).

On the other hand, the GRASS mapcalc computation (given below) takes 
less than a minute on that same raster.

I wanted to re-implement the whole analysis in R for better/easier 
reproducibility, but now I think I will stick to R + GRASS GIS.

If anyone knows a faster approach for creating a mask in R, please let 
me know.

Thanks and best regards,
Christian

Am 06.12.18 um 10:59 schrieb Bede-Fazekas Ákos:
> Dear Christian,
> raster::mask() and raster::crop() may solve your problem.
> https://www.rdocumentation.org/packages/raster/versions/2.8-4/topics/mask
> https://www.rdocumentation.org/packages/raster/versions/2.8-4/topics/crop
>
> HTH,
> Ákos Bede-Fazekas
> Hungarian Academy of Sciences
>
> 2018.12.06. 9:40 keltezéssel, Christian Willmes írta:
>> Sorry, I had an error in the main command.
>>
>> It should be:
>>
>> gebco_clipped <- ifelse(RSLmask, gebco, NA)
>>
>> But it still gives the same error.
>>
>> Best,
>> Christian
>>
>> Am 06.12.18 um 09:37 schrieb Christian Willmes:
>>> Hello,
>>>
>>> this should be normally a very basic simple one-liner, but I can't 
>>> get my head around it. I only find solutions for cliping a raster 
>>> against a vector, but none for clipping a raster against a raster mask.
>>>
>>> I want to clip a layer to a mask. In GRASS GIS r.mapcalc the syntax is:
>>>
>>> result = if(RSLmask, gebco, null())
>>>
>>> This clips the GEBCO dataset to the extent of the given raster mask 
>>> 'rslmask'. The result raster has heigt values within the raster mask 
>>> extent, the rest of the raster layer has NULL or NA values.
>>>
>>> In R I did the following, but it does not work as expected:
>>>
>>> gebco <- raster(gebco2014) #load raster
>>>
>>> RSLmask <- gebco >= 0  #create mask layer
>>>
>>> RSL <- ifelse(RSLmask, 1, NA)
>>>
>>> The last command gives an error about vector type 'S4'?!
>>>
>>> >In is.na(test) :
>>>   >is.na() auf nicht-(Liste oder Vektor) des Typs 'S4' angewendet
>>>
>>> So, in short: what is the R way to simply clip a raster to a raster 
>>> mask?
>>>
>>> Thanks and best regards,
>>> Christian
>>>
>>> PS: If found many solutions for clipping a raster to a vector 
>>> polygon, but this is not what I want.
>>>
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo using r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo

-- 
Dr. Christian Willmes	
AG GIS & Fernerkundung      | GIS & RS Group
Geographisches Institut     | Institute of Geography
Universität zu Köln         | University of Cologne
Tel.: +49 (0)221 470 6234
http://www.geographie.uni-koeln.de/14126.html
http://www.sfb806.de
http://crc806db.uni-koeln.de
http://publons.com/a/1316706/
http://orcid.org/0000-0002-5566-6542



More information about the R-sig-Geo mailing list