Raster Processing#

Write a Raster#

import numpy
from osgeo import gdal
from osgeo import osr

## Numpy array with data
data = numpy.array()

## Variables
rasname = '/home/user/Documents/raster.tif'
cols = 100
rows = 50
Xmin = -10.0
Ymax = 80.0
pixel = 1.0
EPSG = 4326
rastype = gdal.GDT_Float32
nodata = -9999

## Raster creation
driver = gdal.GetDriverByName('GTiff')
outDataset = driver.Create(rasname, cols, rows, 1, rastype)
proj = osr.SpatialReference()
proj.ImportFromEPSG(EPSG)
outDataset.SetProjection(proj.ExportToWkt())
outDataset.SetGeoTransform((Xmin, pixel, 0.0, Ymax, 0.0, -1 * pixel))
outBand = outDataset.GetRasterBand(1)
outBand.SetNoDataValue(nodata)

## Writing
outBand.WriteArray(data)
outDataset = None

Raster Processing by Blocks#

This script computes a raster using array programming by blocks.

from osgeo import gdal
import numpy

gdal.AllRegister()

inras = r"C:\Dataset\Input.tif"
outras = r"C:\Dataset\Output.tif"

## GET INPUT INFO
dataset = gdal.Open(inras, gdal.GA_ReadOnly)
geot = dataset.GetGeoTransform()
proj = dataset.GetProjection()
band = dataset.GetRasterBand(1)
cols = dataset.RasterXSize
rows = dataset.RasterYSize
nd = band.GetNoDataValue()

## SET OUTPUT INFO
driver = dataset.GetDriver()
outDataset = driver.Create(outras, cols, rows, 1, gdal.GDT_Float32)
outDataset.SetGeoTransform((geot[0], geot[1], geot[2], geot[3], geot[4], geot[5]))
outDataset.SetProjection(proj)
outBand = outDataset.GetRasterBand(1)
outBand.SetNoDataValue(nd)

# SET BLOCK SIZE
blockSizes = band.GetBlockSize()
xBlockSize = blockSizes[0]
yBlockSize = blockSizes[1]

## ITERATION BY BLOCKS
for i in range(0, rows, yBlockSize):
    if i + yBlockSize < rows:
        numRows = yBlockSize
    else:
        numRows = rows - i
    for j in range(0, cols, xBlockSize):
        if j + xBlockSize < cols:
            numCols = xBlockSize
        else:
            numCols = cols - j

        arr = band.ReadAsArray(j, i, numCols, numRows)
        data = numpy.where(arr == nd, numpy.nan, arr)

        ## Do data computation -> outdata

        outBand.WriteArray(outdata, j, i)

outDataset = None