File size: 1,929 Bytes
1b63144
0483bf4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c72cc9
 
 
 
 
 
 
 
 
0483bf4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b63144
0483bf4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
"""Headless grid tests (pure numpy)."""

import numpy as np
import pytest

from splasher import Grid, grid_from_points


def test_dims():
    g = Grid(0.0, 10.0, 0.0, 4.0, 1.0)
    assert g.cols == 10
    assert g.rows == 4
    assert g.shape == (4, 10)
    assert g.empty_raster(fill=-1).shape == (4, 10)


def test_dims_ceil():
    g = Grid(0.0, 10.0, 0.0, 5.0, 3.0)
    assert g.cols == 4  # ceil(10/3)
    assert g.rows == 2  # ceil(5/3)


def test_world_to_cell():
    g = Grid(0.0, 10.0, 0.0, 10.0, 1.0)
    xy = np.array([[0.5, 0.5], [9.5, 9.5], [-1.0, 5.0], [5.0, 11.0]])
    ij, valid = g.world_to_cell(xy)
    assert ij[0].tolist() == [0, 0]  # [i(y), j(x)]
    assert ij[1].tolist() == [9, 9]
    assert valid.tolist() == [True, True, False, False]


def test_world_to_cell_non_finite():
    g = Grid(0.0, 10.0, 0.0, 10.0, 1.0)
    xy = np.array([[np.nan, 5.0], [5.0, np.inf], [-np.inf, np.nan], [2.5, 3.5]])
    with np.errstate(invalid="raise"):
        ij, valid = g.world_to_cell(xy)
    assert valid.tolist() == [False, False, False, True]
    assert ij[3].tolist() == [3, 2]


def test_cell_to_world_roundtrip():
    g = Grid(-5.0, 5.0, -5.0, 5.0, 2.0)
    x, y = g.cell_to_world(0, 0)
    ij, valid = g.world_to_cell(np.array([[x, y]]))
    assert valid[0]
    assert ij[0].tolist() == [0, 0]


def test_invalid():
    with pytest.raises(ValueError):
        Grid(0.0, 0.0, 0.0, 1.0, 1.0)
    with pytest.raises(ValueError):
        Grid(0.0, 1.0, 0.0, 1.0, 0.0)


def test_grid_from_points():
    xy = np.array([[1.0, 2.0], [3.0, 8.0]])
    g = grid_from_points(xy, cell_size=1.0, margin=1.0)
    assert g.xmin <= 0.0 and g.ymin <= 1.0
    assert g.xmax >= 4.0 and g.ymax >= 9.0


def test_line_segments_shape():
    g = Grid(0.0, 4.0, 0.0, 2.0, 1.0)
    xs, ys = g.line_segments()
    # (cols+1) vertical + (rows+1) horizontal, 2 points each
    assert len(xs) == len(ys) == 2 * ((g.cols + 1) + (g.rows + 1))