Skip to content

Commit

Permalink
shorten get_positions/get_indices to position/indices
Browse files Browse the repository at this point in the history
  • Loading branch information
njwilson23 committed May 14, 2017
1 parent 1870d8f commit 2a58654
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 65 deletions.
68 changes: 29 additions & 39 deletions karta/raster/grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,25 +331,15 @@ def resolution(self):
def skew(self):
return self.transform[4:]

@property
def bbox(self):
extent = self.get_extent(reference="edge")
return extent[0], extent[2], extent[1], extent[3]

@property
def data_bbox(self):
extent = self.get_data_extent(reference="edge")
def data_bbox(self, crs=None):
extent = self.data_extent(reference="edge", crs=crs)
return extent[0], extent[2], extent[1], extent[3]

@property
def extent(self):
return self.get_extent()

def get_bbox(self, crs=None):
a, b, c, d = self.get_extent(reference="edge", crs=crs)
def bbox(self, crs=None):
a, b, c, d = self.extent(reference="edge", crs=crs)
return a, c, b, d

def get_extent(self, reference='center', crs=None):
def extent(self, reference='center', crs=None):
""" Return the region characteristics as a tuple (xmin, xmax, ymin,
ymax).
Expand Down Expand Up @@ -396,7 +386,7 @@ def get_extent(self, reference='center', crs=None):
d = max(yg0, yg1, yg2, yg3)
return a, b, c, d

def get_data_extent(self, reference='center', nodata=None, crs=None):
def data_extent(self, reference='center', nodata=None, crs=None):
""" Return the region characteristics as a tuple (xmin, xmax, ymin,
ymax).
Expand Down Expand Up @@ -555,10 +545,10 @@ def clip(self, xmin, xmax, ymin, ymax, crs=None):
# Convert to center coords
t = self.transform

ll = self.get_positions(xmin, ymin)
lr = self.get_positions(xmax, ymin)
ul = self.get_positions(xmin, ymax)
ur = self.get_positions(xmax, ymax)
ll = self.positions(xmin, ymin)
lr = self.positions(xmax, ymin)
ul = self.positions(xmin, ymax)
ur = self.positions(xmax, ymax)

i0 = int(np.ceil(min(ll[0], lr[0], ul[0], ur[0])))
i1 = int(np.floor(max(ll[0], lr[0], ul[0], ur[0]))) + 1
Expand Down Expand Up @@ -590,7 +580,7 @@ def _round(a):
else:
return a//1+1

bb = self.bbox
bb = self.bbox()
bbnew = list(bboxnew)
dx, dy, sx, sy = self.transform[2:]

Expand Down Expand Up @@ -748,7 +738,7 @@ def resample(self, dx, dy, method='nearest'):
raise ValueError("resolution must be positive "
"(got {0}, {1})".format(dx, dy))

xmin, xmax, ymin, ymax = self.get_extent()
xmin, xmax, ymin, ymax = self.extent()
ny = int((ymax - ymin) // dy) + 1
nx = int((xmax - xmin) // dx) + 1

Expand All @@ -769,7 +759,7 @@ def resample(self, dx, dy, method='nearest'):
return RegularGrid(tnew, values=values, crs=self.crs,
nodata_value=self.nodata)

def get_positions(self, x, y):
def positions(self, x, y):
""" Return the float row and column indices for the point nearest
geographical coordinates.
Expand All @@ -795,24 +785,24 @@ def get_positions(self, x, y):
I, J = crfuncs.get_positions_vec(self.transform, x, y)
return I[0], J[0]

def _get_indices(self, x, y):
def _indices(self, x, y):
""" Return the integer row and column indices for the point nearest
geographical coordinates. Unlike `get_positions()`, this method raises
geographical coordinates. Unlike `positions()`, this method raises
and exception when points are out of range.
Parameters
----------
x, y : float or vector
vertices of points to compute indices for
"""
i, j = self.get_positions(x, y)
i, j = self.positions(x, y)
i = np.round(i).astype(np.int32)
j = np.round(j).astype(np.int32)
return i,j

def get_indices(self, x, y):
def indices(self, x, y):
""" Return the integer row and column indices for the point nearest
geographical coordinates. Unlike `get_positions()`, this method raises
geographical coordinates. Unlike `positions()`, this method raises
and exception when points are out of range.
Parameters
Expand All @@ -826,15 +816,15 @@ def get_indices(self, x, y):
points outside of Grid bbox
"""
ny, nx = self.size
i, j = self._get_indices(x, y)
i, j = self._indices(x, y)
if hasattr(i, "__iter__"):
if i.min() < 0 or i.max() > ny-1 or j.min() < 0 or j.max() > nx-1:
raise IndexError("coordinates outside grid region "
"({0})".format(self.bbox))
"({0})".format(self.bbox()))
else:
if i < 0 or i > ny-1 or j < 0 or j > nx-1:
raise IndexError("coordinate outside grid region "
"({0})".format(self.bbox))
"({0})".format(self.bbox()))
return i,j

def sample_nearest(self, x, y):
Expand Down Expand Up @@ -862,7 +852,7 @@ def sample_nearest(self, x, y):
m, n = self.size

if not hasattr(x, "__iter__"):
i, j = self._get_indices(x, y)
i, j = self._indices(x, y)
if (0 <= i < m) and (0 <= j < n):
return np.atleast_1d(self[i,j])
else:
Expand All @@ -872,7 +862,7 @@ def sample_nearest(self, x, y):
x = np.array(x)
y = np.array(y)

I, J = self._get_indices(x.ravel(), y.ravel())
I, J = self._indices(x.ravel(), y.ravel())
out_of_bounds_mask = (I < 0) | (I >= m) | (J < 0) | (J >= n)
I = I[~out_of_bounds_mask]
J = J[~out_of_bounds_mask]
Expand Down Expand Up @@ -934,7 +924,7 @@ def sample_bilinear(self, x, y):
else:
dim = x.ndim

I, J = self.get_positions(x.ravel(), y.ravel())
I, J = self.positions(x.ravel(), y.ravel())

# If the grid is large, decompressing everthing is expensive, so
# compute only the region necessary
Expand Down Expand Up @@ -1015,7 +1005,7 @@ def sample(self, *args, **kwargs):
if hasattr(args[0], "_geotype"):
crs = args[0].crs
if args[0]._geotype == "Point":
x, y = args[0].get_vertex(crs=self.crs)[:2]
x, y = args[0].vertex(crs=self.crs)[:2]
elif args[0]._geotype == "Multipoint":
x, y = args[0].coords(crs=self.crs)
else:
Expand Down Expand Up @@ -1197,9 +1187,9 @@ def merge(grids, weights=None):
normalizedweights = weights * len(weights) / weights.sum()

# Compute final grid extent
xmin, xmax, ymin, ymax = grids[0].get_extent(reference='edge')
xmin, xmax, ymin, ymax = grids[0].extent(reference='edge')
for grid in grids[1:]:
_xmin, _xmax, _ymin, _ymax = grid.get_extent(reference='edge')
_xmin, _xmax, _ymin, _ymax = grid.extent(reference='edge')
xmin = min(xmin, _xmin)
xmax = max(xmax, _xmax)
ymin = min(ymin, _ymin)
Expand All @@ -1217,7 +1207,7 @@ def merge(grids, weights=None):
counts = np.zeros([ny, nx], dtype=np.float32)

for grid, weight in zip(grids, normalizedweights):
_xmin, _xmax, _ymin, _ymax = grid.get_extent(reference='edge')
_xmin, _xmax, _ymin, _ymax = grid.extent(reference='edge')
offx = int((_xmin-xmin) / T[2])
offy = int((_ymin-ymin) / T[3])
_ny, _nx = grid.size
Expand Down Expand Up @@ -1288,7 +1278,7 @@ def gridpoints(x, y, z, transform, crs):
nodata_value=np.nan)

array = np.zeros([ny, nx])
(I, J) = grid.get_indices(x, y)
(I, J) = grid.indices(x, y)

try:
err = crfuncs.fillarray_double(array,
Expand Down
50 changes: 24 additions & 26 deletions tests/grid_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ def setUp(self):
pe = peaks(n=49)
self.rast = RegularGrid((0.0, 0.0, 30.0, 30.0, 0.0, 0.0), values=pe)

def test_get_resolution(self):
def test_resolution(self):
grid = RegularGrid([0.0, 0.0, 25.0, 35.0, 10.0, 10.0])
self.assertEqual(grid.resolution, (25.0, 35.0))

def test_get_coordinates(self):
def test_coordinates(self):
cg = self.rast.coordinates()
self.assertTrue(isinstance(cg, karta.raster.coordgen.CoordinateGenerator))
self.assertEqual(cg.transform, self.rast.transform)
Expand All @@ -29,14 +29,14 @@ def test_bbox(self):
pe[40:,:] = np.nan
pe[:,:5] = np.nan
grid = RegularGrid((0.0, 0.0, 30.0, 30.0, 0.0, 0.0), values=pe)
self.assertEqual(grid.bbox, (0, 0, 30*49, 30*49))
self.assertEqual(grid.bbox(), (0, 0, 30*49, 30*49))

def test_data_bbox(self):
pe = peaks(n=49)
pe[40:,:] = np.nan
pe[:,:5] = np.nan
grid = RegularGrid((0.0, 0.0, 30.0, 30.0, 0.0, 0.0), values=pe)
self.assertEqual(grid.data_bbox, (5*30, 0, 30*49, 30*40))
self.assertEqual(grid.data_bbox(), (5*30, 0, 30*49, 30*40))

def test_add_rgrid(self):
rast2 = RegularGrid(self.rast.transform,
Expand Down Expand Up @@ -335,33 +335,32 @@ def test_vertex_coords_skewed(self):
self.assertTrue(np.sum(self.rast.vertex_coords()[0] - ans[0]) < 1e-10)
self.assertTrue(np.sum(self.rast.vertex_coords()[1] - ans[1]) < 1e-10)

def test_get_extent(self):
def test_extent(self):
ereg = (0.0, 1470.0, 0.0, 1470.0)
creg = (15.0, 1455.0, 15.0, 1455.0)
self.assertEqual(self.rast.get_extent(reference='center'), creg)
self.assertEqual(self.rast.get_extent(reference='edge'), ereg)
self.assertEqual(self.rast.extent(reference='center'), creg)
self.assertEqual(self.rast.extent(reference='edge'), ereg)

def test_get_extent_crs(self):
def test_extent_crs(self):
pe = peaks(n=49)
crs = karta.crs.ProjectedCRS("+proj=utm +zone=12 +ellps=WGS84 +north=True", "UTM 12N (WGS 84)")
rast_utm12N = RegularGrid((0.0, 0.0, 10000.0, 10000.0, 0.0, 0.0),
values=pe,
crs=crs)
a,b,c,d = rast_utm12N.get_extent(reference='center',
crs=karta.crs.LonLatWGS84)
a,b,c,d = rast_utm12N.extent(reference='center', crs=karta.crs.LonLatWGS84)
self.assertAlmostEqual(a, -115.45687156)
self.assertAlmostEqual(b, -111.13480112)
self.assertAlmostEqual(c, 0.0450996517)
self.assertAlmostEqual(d, 4.3878488543)

def test_get_data_extent(self):
def test_data_extent(self):
grid = RegularGrid((0, 0, 1, 1, 0, 0), values=np.zeros((128, 128), dtype=np.float64))
grid[:,:4] = grid.nodata
grid[:,-7:] = grid.nodata
grid[:21,:] = grid.nodata
grid[-17:,:] = grid.nodata
self.assertEqual(grid.get_data_extent("edge"), (4, 121, 21, 111))
self.assertEqual(grid.get_data_extent("center"), (4.5, 120.5, 21.5, 110.5))
self.assertEqual(grid.data_extent("edge"), (4, 121, 21, 111))
self.assertEqual(grid.data_extent("center"), (4.5, 120.5, 21.5, 110.5))

def test_minmax_nodata(self):
values = np.array([[4, 5, 3], [4, 2, -9], [3, 6, 1]])
Expand Down Expand Up @@ -402,7 +401,7 @@ def test_clip(self):

def test_clip_to_extent(self):
proto = RegularGrid((500, 500, 30, 30, 0, 0), np.zeros((15,15)))
clipped = self.rast.clip(*proto.get_extent("edge"))
clipped = self.rast.clip(*proto.extent("edge"))
self.assertEqual(clipped.size, (15, 15))
self.assertEqual(clipped.transform, (510, 510, 30, 30, 0, 0))
X, Y = clipped.center_coords()
Expand Down Expand Up @@ -548,29 +547,28 @@ def test_mask_multipoly(self):

self.assertEqual(int(np.nansum(masked_grid[:,:])), 73399874364)

def test_get_positions(self):
def test_positions(self):
grid = RegularGrid([0.0, 0.0, 1.0, 1.0, 0.0, 0.0],
values=np.zeros((3,3)))
(i, j) = grid.get_positions(1.5, 1.5)
(i, j) = grid.positions(1.5, 1.5)
self.assertEqual((i,j), (1.0, 1.0))
(i, j) = grid.get_positions(2.0, 1.5)
(i, j) = grid.positions(2.0, 1.5)
self.assertEqual((i,j), (1.0, 1.5))

def test_get_indices(self):
ind = self.rast.get_indices(15.0, 15.0)
def test_indices(self):
ind = self.rast.indices(15.0, 15.0)
self.assertEqual(tuple(ind), (0, 0))
ind = self.rast.get_indices(1455.0, 1455.0)
ind = self.rast.indices(1455.0, 1455.0)
self.assertEqual(tuple(ind), (48, 48))

def test_get_indices_onevec(self):
ind = self.rast.get_indices([15.0], [15.0])
def test_indices_onevec(self):
ind = self.rast.indices([15.0], [15.0])
self.assertEqual(tuple(ind), (0, 0))
ind = self.rast.get_indices(1455.0, 1455.0)
ind = self.rast.indices(1455.0, 1455.0)
self.assertEqual(tuple(ind), (48, 48))

def test_get_indices_vec(self):
ind = self.rast.get_indices(np.arange(15.0, 1470, 5),
np.arange(15.0, 1470, 5))
def test_indices_vec(self):
ind = self.rast.indices(np.arange(15.0, 1470, 5), np.arange(15.0, 1470, 5))

xi = np.array([ 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
Expand Down

0 comments on commit 2a58654

Please sign in to comment.