Skip to content

Commit

Permalink
adding raster stats and fminimum methods
Browse files Browse the repository at this point in the history
  • Loading branch information
wbierbower committed Apr 30, 2015
1 parent fc34c48 commit c000d9b
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 3 deletions.
47 changes: 44 additions & 3 deletions fauxgeo/raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,18 +289,35 @@ def minimum(self, raster):
# Implement broadcast operation
def min_closure(nodata):
def mini(x):
def f(x): return np.where((np.less(x, raster)), x, raster)
def f(x): return np.where((np.minimum(x, raster)), x, raster)
return np.where((np.not_equal(x, nodata)), f(x), nodata)
return mini
return self.local_op(raster, min_closure, broadcast=True)
else:
def min_closure(nodata):
def mini(x, y):
def f(x, y): return np.where((np.less(x, y)), x, y)
def f(x, y): return np.where((np.minimum(x, y)), x, y)
return np.where((np.not_equal(x, nodata)) & (np.not_equal(y, nodata)), f(x, y), nodata)
return mini
return self.local_op(raster, min_closure)

def fminimum(self, raster):
if type(raster) in [float, int]:
# Implement broadcast operation
def min_closure(nodata):
def mini(x):
def f(x): return np.where((np.fmin(x, raster)), x, raster)
return np.where((np.not_equal(x, nodata)), f(x), nodata)
return mini
return self.local_op(raster, min_closure, broadcast=True)
else:
def min_closure(nodata):
def mini(x, y):
def f(x, y): return np.where((np.fmin(x, y)), x, y)
return np.where((np.not_equal(x, nodata)) | (np.not_equal(y, nodata)), f(x, y), nodata)
return mini
return self.local_op(raster, min_closure)

def __getitem__(self):
pass # return numpy slice? Raster object with sliced numpy array?

Expand Down Expand Up @@ -338,14 +355,38 @@ def get_grayscale_image(self):
def get_heatmap_image(self):
raise NotImplementedError

def sum(self):
# pygeo.calculate_raster_stats_uri(self.uri)
# mini, maxi, mean, stddev = pygeo.get_statistics_from_uri(self.uri)
raise NotImplementedError

def min(self):
pygeo.calculate_raster_stats_uri(self.uri)
mini, _, _, _ = pygeo.get_statistics_from_uri(self.uri)
return mini

def max(self):
pygeo.calculate_raster_stats_uri(self.uri)
_, maxi, _, _ = pygeo.get_statistics_from_uri(self.uri)
return maxi

def mean(self):
pygeo.calculate_raster_stats_uri(self.uri)
_, _, mean, _ = pygeo.get_statistics_from_uri(self.uri)
return mean

def std(self):
pygeo.calculate_raster_stats_uri(self.uri)
_, _, _, std = pygeo.get_statistics_from_uri(self.uri)
return std

def ones(self):
def ones_closure(nodata):
def ones(x):
return np.where(x == x, 1, nodata)
return ones
return self.local_op(0, ones_closure, broadcast=True)


def zeros(self):
def zeros_closure(nodata):
def zeros(x):
Expand Down
58 changes: 58 additions & 0 deletions tests/test_raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,5 +369,63 @@ def test_set_nodata(self):
assert(new_raster.get_nodata(1) == 100)
assert(new_raster.get_band(1).data[0, 0] == 100)


class TestRasterStats(unittest.TestCase):
def setUp(self):
self.shape = (4, 4)
self.array = np.ones(self.shape)
self.affine = Affine(1, 0, 0, 0, -1, 4)
self.proj = 4326
self.datatype = gdal.GDT_Float64
self.nodata_val = -9999
self.factory = RasterFactory(
self.proj, self.datatype, self.nodata_val, *self.shape, affine=self.affine)

def test_min(self):
raster = self.factory.alternating(1.0, 2.0)
assert(raster.min() == 1.0)

def test_max(self):
raster = self.factory.alternating(1.0, 2.0)
assert(raster.max() == 2.0)

def test_mean(self):
raster = self.factory.alternating(1.0, 2.0)
assert(raster.mean() == 1.5)

def test_std(self):
raster = self.factory.uniform(1.0)
assert(raster.std() == 0.0)

def test_sum(self):
raster = self.factory.alternating(1.0, -9999)
assert(raster.sum() == 8.0)

class TestRasterMinimum(unittest.TestCase):
def setUp(self):
self.shape = (4, 4)
self.array = np.ones(self.shape)
self.affine = Affine(1, 0, 0, 0, -1, 4)
self.proj = 4326
self.datatype = gdal.GDT_Float64
self.nodata_val = -9999
self.factory = RasterFactory(
self.proj, self.datatype, self.nodata_val, *self.shape, affine=self.affine)

def test_minimum(self):
raster1 = self.factory.alternating(1.0, 2.0)
raster2 = self.factory.alternating(2.0, -9999)
min_raster = raster1.minimum(raster2)
assert(min_raster.get_band(1).data[0, 0] == 1)
assert(min_raster.get_band(1).data[0, 1] == -9999)

def test_fminimum(self):
raster1 = self.factory.alternating(1.0, 2.0)
raster2 = self.factory.alternating(2.0, -9999)
min_raster = raster1.fminimum(raster2)
assert(min_raster.get_band(1).data[0, 0] == 1)
assert(min_raster.get_band(1).data[0, 1] == 2)


if __name__ == '__main__':
unittest.main()

0 comments on commit c000d9b

Please sign in to comment.