rasterio/tests/test_blocks.py
2014-09-01 22:00:56 -06:00

124 lines
4.4 KiB
Python

import logging
import os.path
import unittest
import shutil
import subprocess
import sys
import tempfile
import numpy
import rasterio
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
class WindowTest(unittest.TestCase):
def test_window_shape_errors(self):
# Positive height and width are needed when stop is None.
self.assertRaises(
ValueError,
rasterio.window_shape,
(((10, 20),(10, None)),) )
self.assertRaises(
ValueError,
rasterio.window_shape,
(((None, 10),(10, 20)),) )
def test_window_shape_None_start(self):
self.assertEqual(
rasterio.window_shape(((None,4),(None,102))),
(4, 102))
def test_window_shape_None_stop(self):
self.assertEqual(
rasterio.window_shape(((10, None),(10, None)), 100, 90),
(90, 80))
def test_window_shape_positive(self):
self.assertEqual(
rasterio.window_shape(((0,4),(1,102))),
(4, 101))
def test_window_shape_negative(self):
self.assertEqual(
rasterio.window_shape(((-10, None),(-10, None)), 100, 90),
(10, 10))
self.assertEqual(
rasterio.window_shape(((~0, None),(~0, None)), 100, 90),
(1, 1))
self.assertEqual(
rasterio.window_shape(((None, ~0),(None, ~0)), 100, 90),
(99, 89))
def test_eval(self):
self.assertEqual(
rasterio.eval_window(((-10, None), (-10, None)), 100, 90),
((90, 100), (80, 90)))
self.assertEqual(
rasterio.eval_window(((None, -10), (None, -10)), 100, 90),
((0, 90), (0, 80)))
def test_window_index():
idx = rasterio.window_index(((0,4),(1,12)))
assert len(idx) == 2
r, c = idx
assert r.start == 0
assert r.stop == 4
assert c.start == 1
assert c.stop == 12
arr = numpy.ones((20,20))
assert arr[idx].shape == (4, 11)
class RasterBlocksTest(unittest.TestCase):
def test_blocks(self):
with rasterio.open('tests/data/RGB.byte.tif') as s:
self.assertEqual(len(s.block_shapes), 3)
self.assertEqual(s.block_shapes, [(3, 791), (3, 791), (3, 791)])
windows = s.block_windows(1)
(j,i), first = next(windows)
self.assertEqual((j,i), (0, 0))
self.assertEqual(first, ((0, 3), (0, 791)))
windows = s.block_windows()
(j,i), first = next(windows)
self.assertEqual((j,i), (0, 0))
self.assertEqual(first, ((0, 3), (0, 791)))
(j, i), second = next(windows)
self.assertEqual((j,i), (1, 0))
self.assertEqual(second, ((3, 6), (0, 791)))
(j, i), last = list(windows)[~0]
self.assertEqual((j,i), (239, 0))
self.assertEqual(last, ((717, 718), (0, 791)))
def test_block_coverage(self):
with rasterio.open('tests/data/RGB.byte.tif') as s:
self.assertEqual(
s.width*s.height,
sum((w[0][1]-w[0][0])*(w[1][1]-w[1][0])
for ji, w in s.block_windows(1)))
class WindowReadTest(unittest.TestCase):
def test_read_window(self):
with rasterio.open('tests/data/RGB.byte.tif') as s:
windows = s.block_windows(1)
ji, first_window = next(windows)
first_block = s.read_band(1, window=first_window)
self.assertEqual(first_block.dtype, rasterio.ubyte)
self.assertEqual(
first_block.shape,
rasterio.window_shape(first_window))
class WindowWriteTest(unittest.TestCase):
def setUp(self):
self.tempdir = tempfile.mkdtemp()
def tearDown(self):
shutil.rmtree(self.tempdir)
def test_write_window(self):
name = os.path.join(self.tempdir, "test_write_window.tif")
a = numpy.ones((50, 50), dtype=rasterio.ubyte) * 127
with rasterio.open(
name, 'w',
driver='GTiff', width=100, height=100, count=1,
dtype=a.dtype) as s:
s.write_band(1, a, window=((30, 80), (10, 60)))
# subprocess.call(["open", name])
info = subprocess.check_output(["gdalinfo", "-stats", name])
self.assert_(
"Minimum=0.000, Maximum=127.000, "
"Mean=31.750, StdDev=54.993" in info.decode('utf-8'),
info)