Search code examples
rr-rastergeotiff

How to get values for a pixel from a geoTIFF in R?


I'm trying to get RGB components from a geoTIFF file in R. The colours on the image correspond to different land classification types and I have a legend for each classification type in RGB components.

I'm using the raster library. My code so far is

library(raster)
my.map = raster("mygeoTIFFfile.tif")

Here is the information on the file once it has been read in:

> my.map[[1]]
class       : RasterLayer 
dimensions  : 55800, 129600, 7231680000  (nrow, ncol, ncell)
resolution  : 0.002777778, 0.002777778  (x, y)
extent      : -180.0014, 179.9986, -64.99861, 90.00139  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : filepah/filename.tif 
names       : filename.tif
values      : 11, 230  (min, max)

The specific geoTIFF file I'm working on can be found here:

http://due.esrin.esa.int/page_globcover.php

(just click on "Globcover2009_V2.3_Global_.zip")

Can someone please help me get the value from a single pixel location from this file please?


Solution

  • It seems that you are asking the wrong question.

    To get a value for a single pixel (grid cell), you can do use indexing. For example, for cell number 10,000 and 10,001 you can do r[10000:10001]. You could get all values by doing values(r). But that will fail for a very large raster like this (unless you have lots of RAM).

    However, the question you need answered, it seems, is how to make a map by matching integer cell values with RGB colors.

    Let's set up an example raster

     library(raster)
     r <- raster(nrow=4, ncol=4)
     values(r) <- rep(c(11, 14, 20, 30), each=4)
    

    And some matching RGB values

    legend <- read.csv(text="Value,Label,Red,Green,Blue
    11,Post-flooding or irrigated croplands (or aquatic),170,240,240
    14,Rainfed croplands,255,255,100
    20,Mosaic cropland (50-70%) / vegetation (grassland/shrubland/forest) (20-50%),220,240,100
    30,Mosaic vegetation (grassland/shrubland/forest) (50-70%) / cropland (20-50%) ,205,205,102")
    

    Compute the color code

    legend$col <-  rgb(legend$Red, legend$Green, legend$Blue, maxColorValue=255)
    

    set up a "color table"

    # start with white for all values (1 to 255)
    ct <- rep(rgb(1,1,1), 255)
    # fill in where necessary
    ct[legend$Value+1] <- legend$col 
    colortable(r) <- ct
    

    plot

    plot(r)
    

    You can also try:

    tb <- legend[, c('Value', 'Label')]
    colnames(tb)[1] = "ID"
    tb$Label <- substr(tb$Label, 1,10)
    levels(r) <- tb
    
    library(rasterVis)
    levelplot(r, col.regions=legend$col, at=0:length(legend$col))