Skip to content

Commit

Permalink
Added rgb option to algebra endpoint.
Browse files Browse the repository at this point in the history
  • Loading branch information
yellowcap committed Jul 13, 2016
1 parent 4f30b08 commit a36411f
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 3 deletions.
50 changes: 47 additions & 3 deletions raster/views.py
Expand Up @@ -162,8 +162,6 @@ def get_ids(self):
return ids

def get(self, request, *args, **kwargs):
parser = RasterAlgebraParser()

# Get layer ids
ids = self.get_ids()

Expand All @@ -180,7 +178,21 @@ def get(self, request, *args, **kwargs):
return self.write_img_to_response(img, {})

# Get formula from request
formula = request.GET.get('formula')
formula = request.GET.get('formula', None)

# Dispatch by request type. If a formula was provided, use raster
# algebra otherwise look for rgb request.
if formula:
return self.get_algebra(data, formula)
elif 'r' in data and 'g' in data and 'b' in data:
return self.get_rgb(data)
else:
raise RasterAlgebraException(
'Specify raster algebra formula or provide rgb layer keys.'
)

def get_algebra(self, data, formula):
parser = RasterAlgebraParser()

# Evaluate raster algebra expression, return 400 if not successful
try:
Expand Down Expand Up @@ -216,6 +228,38 @@ def get(self, request, *args, **kwargs):
# Return rendered image
return self.write_img_to_response(img, stats)

def get_rgb(self, data):
red = data['r']
green = data['g']
blue = data['b']

red = red.bands[0].data()
green = green.bands[0].data()
blue = blue.bands[0].data()

scale = float(self.request.GET.get('scale', 255))

red[red > scale] = scale
green[green > scale] = scale
blue[blue > scale] = scale

red = red * 255.0 / scale
green = green * 255.0 / scale
blue = blue * 255.0 / scale

# Create zeros array.
alpha = 255 * (red > 0) * (blue > 0) * (green > 0)

rgba = numpy.array((red.ravel(), green.ravel(), blue.ravel(), alpha.ravel())).T
rgba = rgba.reshape(WEB_MERCATOR_TILESIZE, WEB_MERCATOR_TILESIZE, 4).astype('uint8')

# Create image from array
img = Image.fromarray(rgba)
stats = {}

# Return rendered image
return self.write_img_to_response(img, stats)


class TmsView(RasterView):

Expand Down
4 changes: 4 additions & 0 deletions tests/test_algebra.py
Expand Up @@ -120,3 +120,7 @@ def test_band_level_algebra_request(self):
# Try getting band that does not exist.
response = self.client.get(self.algebra_tile_url + '?layers=a{0}1={1}&formula=a'.format(BAND_INDEX_SEPARATOR, self.rasterlayer.id))
self.assertEqual(response.status_code, 400)

def test_rgb_request(self):
response = self.client.get(self.algebra_tile_url + '?layers=r={0},g={0},b={0}'.format(self.rasterlayer.id))
self.assertEqual(response.status_code, 200)

0 comments on commit a36411f

Please sign in to comment.