====== Raster Operations ====== Some basic operations involving two rasters (or two bands) are available in TerraLib. They include //arithmetic operations//, //resampling//, //cropping//, and //reprojection//. ===== Arithmetic Operations ===== The 4 basic arithmetic operations (+,-,/,*) are possible to be performed between 2 rasters (or 2 bands). When using 2 rasters, they must fit in terms of number of bands, and number of rows x columns. ==== Example of use ==== A basic use of arithmetic operations between rasters is the calculation of the NDVI (Normalized Difference Vegetation Index), that follows this equation: $$B_{NDVI} = \frac{B_{IRed} - B_{Red}}{B_{IRed} + B_{Red}}$$ where $B_{NDVI}$ is a single band derived from //Red// and //Infra-Red// bands. // load input data std::map rinfo; rinfo["URI"] = "input.tif"; te::rst::Raster* rin = te::rst::RasterFactory::open(rinfo); // in this raster, band 0 is the red band, and band 1 is the infra-red band te::rst::Band* bred = rin->getBand(0); te::rst::Band* bired = rin->getBand(1); // create output raster with 2 bands (rout[0] - ndvi, rout[1] - tmp) std::map orinfo; orinfo["URI"] = "output-ndvi.tif"; te::rst::Grid* grid = new te::rst::Grid(*rin->getGrid()); std::vector bprops; bprops.push_back(new te::rst::BandProperty(0, te::dt::DOUBLE_TYPE, "ndvi band")); bprops.push_back(new te::rst::BandProperty(0, te::dt::DOUBLE_TYPE, "tmp band")); te::rst::Raster* rout = te::rst::RasterFactory::make(grid, bprops, orinfo); // use rout[0] as numerator te::rst::Band* numerator = rout->getBand(0); te::rst::Copy(*bired, *numerator); *numerator -= *bred; // create denominator band te::rst::Band* denominator = rout->getBand(1); te::rst::Copy(*bired, *denominator); *denominator += *bred; // divide numerator by denominator, than rout[0] contains the ndvi *numerator /= *denominator; // clean up delete rin; delete rout; ===== Resampling ===== TerraLib contains 3 methods for raster resampling, which creates a copy of the raster with a different spatial resolution. The available methods in TerraLib are: * Bicubic: it considers 16 pixels (4x4) to interpolate, creating a smooth result. Is the slowest method. * Bilinear: this method uses the 4 nearest pixels (2x2) and interpolates using a weighted average. The weights are defined by the distance to the neighbor. * Nearest Neighbor: this method interpolates a new pixel value by copying the nearest neighbor pixel. Is the fastest method, but can create artifacts. ==== Example of use ==== // load input raster std::map rinfo; rinfo["URI"] = "input.tif"; te::rst::Raster* inraster = te::rst::RasterFactory::open(rinfo); // define output raster name std::map orinfo; orinfo["URI"] = "output-resampling-nn.tif"; // applies the interpolation using neares neighbor technique te::rst::Raster* nnraster = inraster->resample(te::rst::Interpolator::NearestNeighbor, 2, orinfo); // clean up delete inraster; delete nnraster; ===== Cropping ===== This operation allows to crop one raster, creating a sub-image, through the operation //Trim//. For example, input Raster and a rectangle to crop: {{:wiki:designimplementation:raster:input-crop.png?200|}} Output Raster: {{:wiki:designimplementation:raster:output-crop.png?100|}} ==== Example of use ==== The following code shows how to crop one raster. // load input raster std::map rinfo; rinfo["URI"] = "input.tif"; te::rst::Raster* inraster = te::rst::RasterFactory::open(rinfo); // set envelope based on line/column te::gm::Coord2D cur = inraster->getGrid()->gridToGeo(299, 150); te::gm::Coord2D cll = inraster->getGrid()->gridToGeo(100, 299); te::gm::Envelope* blenv = new te::gm::Envelope(cll.x, cll.y, cur.x, cur.y); // define output raster parameters std::map orinfo; orinfo["URI"] = "output-crop.tif"; // perform trim operation te::rst::Raster* outraster = inraster->trim(blenv, orinfo); // clean up delete inraster; delete outraster; ===== Reprojection ===== This operation reprojects a raster to another SRS (Spatial Reference System). ==== Example of use ==== The following code shows how to reproject one raster with a given SRID. // load the input raster std::map rinfo; rinfo["URI"] = "input.tif"; te::rst::Raster* inraster = te::rst::RasterFactory::open(rinfo); // define raster output parameters std::map orinfo; orinfo["URI"] = "output-reprojection.tif"; // call reprojection with changing SRID to 4326 (WGS84) te::rst::Raster* outraster = te::rst::Reproject(inraster, 4326, orinfo); // clean up delete inraster; delete outraster;