[GIS] Writing a 3-band image with rasterio

geotiff-tiffpythonrasterio

I would like to save a 3-band raster to file using rasterio.

The official docs have examples for saving a single band image in both the quickstart and in the advanced topics.

What I would like to do is something like..

with rasterio.open('image.tif', 'w', **meta) as dst:
    dst.write(array)

This raises the following error for an array with a shape of (256, 256, 3).

ValueError: Source shape (256, 256, 3) is inconsistent with given indexes 3

Best Answer

The numpy array needs to be in bands, rows, cols order (z, y, x) not cols, rows, bands (x, y, z).

You can rearrange the axes with numpy.moveaxis

e.g.

import numpy as np
import rasterio

with rasterio.open('image.tif', 'w', **meta) as dst:
    # If array is in (x, y, z) order (cols, rows, bands)
    dst.write(np.moveaxis(array, [0, 1, 2], [2, 1, 0]))

    # If array is in (y, x, z) order (rows, cols, bands)
    dst.write(np.moveaxis(array, [0, 1, 2], [2, 0, 1]))  # same as np.rollaxis(array, axis=2)