"""
Rasterio exposes GDAL's resampling/decimation on I/O. These are the tests
that it does this correctly.
"""
import numpy as np
import pytest
import rasterio
from rasterio.enums import Resampling
from rasterio.errors import ResamplingAlgorithmError
from rasterio.windows import Window
def test_read_out_shape_resample_down():
with rasterio.open('tests/data/RGB.byte.tif') as s:
out = np.zeros((8, 8), dtype=rasterio.ubyte)
data = s.read(1, out=out)
expected = np.array([
[ 0, 0, 20, 15, 0, 0, 0, 0],
[ 0, 6, 193, 9, 255, 127, 23, 39],
[ 0, 7, 27, 255, 193, 14, 28, 34],
[ 0, 31, 29, 44, 14, 22, 43, 0],
[ 0, 9, 69, 49, 17, 22, 255, 0],
[ 11, 7, 13, 25, 13, 29, 33, 0],
[ 8, 10, 88, 27, 20, 33, 25, 0],
[ 0, 0, 0, 0, 98, 23, 0, 0]], dtype=np.uint8)
assert (data == expected).all()
def test_read_out_shape_resample_up():
with rasterio.open('tests/data/RGB.byte.tif') as s:
out = np.zeros((7180, 7910), dtype=rasterio.ubyte)
data = s.read(1, out=out, masked=True)
assert data.shape == (7180, 7910)
assert data.mean() == s.read(1, masked=True).mean()
def test_read_downsample_alpha():
with rasterio.Env(GTIFF_IMPLICIT_JPEG_OVR=False):
with rasterio.open('tests/data/alpha.tif') as src:
out = np.zeros((100, 100), dtype=rasterio.ubyte)
assert src.width == 1223
assert src.height == 1223
assert src.count == 4
assert src.read(1, out=out, masked=False).shape == out.shape
src.read(4, out=out, masked=False)
def test_resample_alg_effect_1():
"""default (nearest) and cubic produce different results"""
with rasterio.open('tests/data/RGB.byte.tif') as s:
assert not any([s.overviews(bidx) for bidx in s.indexes])
out_shape = (s.height // 2, s.width // 2)
nearest = s.read(1, out_shape=out_shape)
cubic = s.read(1, out_shape=out_shape, resampling=Resampling.cubic)
assert np.any(nearest != cubic)
def test_resample_alg_effect_2():
"""Average and bilinear produce different results"""
with rasterio.open('tests/data/RGB.byte.tif') as s:
assert not any([s.overviews(bidx) for bidx in s.indexes])
out_shape = (s.height // 2, s.width // 2)
avg = s.read(1, out_shape=out_shape, resampling=Resampling.average)
bilin = s.read(1, out_shape=out_shape, resampling=Resampling.bilinear)
assert np.any(avg != bilin)
def test_float_window():
"""floating point windows work"""
with rasterio.open('tests/data/RGB.byte.tif') as s:
out_shape = (401, 401)
window = Window(300.5, 300.5, 200.5, 200.5)
s.read(1, window=window, out_shape=out_shape)
def test_resampling_alg_error():
"""Get an exception instead of a crash when using warp-only algs for read or write, see issue #1930"""
with pytest.raises(ResamplingAlgorithmError):
with rasterio.open("tests/data/RGB.byte.tif") as src:
src.read(1, out_shape=(1, 10, 10), resampling=Resampling.max)
def test_resampling_rms():
"""Test Resampling.rms method"""
with rasterio.open('tests/data/float.tif') as s:
out_shape = (2, 2)
rms = s.read(1, out_shape=out_shape, resampling=Resampling.rms)
expected = np.array([
[1.35266399, 0.95388681],
[0.29308701, 1.54074657]], dtype=np.float32)
assert np.allclose(rms, expected)