TransWikia.com

Writing a 3-band image with rasterio

Geographic Information Systems Asked by Sam Murphy on August 28, 2020

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

2 Answers

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)

Correct answer by user2856 on August 28, 2020

To rearrange the axis (i.e., move the bands channel to make it the first axis), you can use np.rollaxis.

with rasterio.open('image.tif', 'w', **meta) as dst:
    # Note: assumes band info is in axis 2. Also, break up commands for clarity.
    rolled_array = np.rollaxis(array, axis=2)  # Roll axis 2 to 0th position
    dst.write(rolled_array)  

rasterio also has some built-in function to help with this as shown here. See rasterio.plot.reshape_as_raster and rasterio.plot.reshape_as_image.

Answered by wronk on August 28, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP