def get_algebra(self, data, formula): parser = RasterAlgebraParser() # Evaluate raster algebra expression, return 400 if not successful try: # Evaluate raster algebra expression result = parser.evaluate_raster_algebra(data, formula) except: raise RasterAlgebraException('Failed to evaluate raster algebra.') # Get array from algebra result if result.bands[0].nodata_value is None: result = result.bands[0].data() else: result = numpy.ma.masked_values( result.bands[0].data(), result.bands[0].nodata_value, ) # Get colormap. colormap = self.get_colormap() # Render tile using the legend data img, stats = band_data_to_image(result, colormap) # Return rendered image return self.write_img_to_response(img, stats)
def get(self, *args, **kwargs): """ Returns an image rendered from a raster tile. """ # Get layer layer = self.get_layer() # Get colormap. colormap = self.get_colormap(layer) # Get tile tile = self.get_tile(layer.id) # Render tile if tile and colormap: data = numpy.ma.masked_values( tile.bands[0].data(), tile.bands[0].nodata_value, ) # Render tile using the legend data img, stats = band_data_to_image(data, colormap) else: # Create empty image if tile cant be found img = Image.new("RGBA", (WEB_MERCATOR_TILESIZE, WEB_MERCATOR_TILESIZE), (0, 0, 0, 0)) stats = {} return self.write_img_to_response(img, stats)
def get(self, *args, **kwargs): """ Returns an image rendered from a raster tile. """ # Get layer layer = self.get_layer() # Override color map if arg provided colormap = self.get_colormap(layer) # Get tile tile = self.get_tile(layer.id) # Render tile if tile and colormap: data = numpy.ma.masked_values( tile.bands[0].data(), tile.bands[0].nodata_value, ) # Render tile using the legend data img, stats = band_data_to_image(data, colormap) else: # Create empty image if tile cant be found img = Image.new("RGBA", (WEB_MERCATOR_TILESIZE, WEB_MERCATOR_TILESIZE), (0, 0, 0, 0)) stats = {} return self.write_img_to_response(img, stats)
def get(self, request, *args, **kwargs): parser = RasterAlgebraParser() # Get layer ids ids = self.get_ids() # Get raster data as 1D arrays and store in dict that can be used # for formula evaluation. data = {} for name, layerid in ids.items(): tile = self.get_tile(layerid) if tile: data[name] = tile else: # Create empty image if any layer misses the required tile img = Image.new("RGBA", (WEB_MERCATOR_TILESIZE, WEB_MERCATOR_TILESIZE), (0, 0, 0, 0)) return self.write_img_to_response(img, {}) # Get formula from request formula = request.GET.get('formula') # Evaluate raster algebra expression, return 400 if not successful try: # Evaluate raster algebra expression result = parser.evaluate_raster_algebra(data, formula) except: raise RasterAlgebraException('Failed to evaluate raster algebra.') # Get array from algebra result result = numpy.ma.masked_values( result.bands[0].data(), result.bands[0].nodata_value, ) # Render tile colormap = self.get_colormap() if colormap: # Render tile using the legend data img, stats = band_data_to_image(result, colormap) else: # Scale to grayscale rgb (can be colorscheme later on) result = result.astype('float').ravel() result = 255 * (result - numpy.min(result)) / (numpy.max(result) - numpy.min(result)) # Create rgba matrix from grayscale array result = numpy.array((result, result, result, numpy.repeat(255, len(result)))).T rgba = result.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)
def get_algebra(self, data, formula): parser = RasterAlgebraParser() # Evaluate raster algebra expression, return 400 if not successful try: # Evaluate raster algebra expression result = parser.evaluate_raster_algebra(data, formula) except: raise RasterAlgebraException('Failed to evaluate raster algebra.') # For pixel value requests, return result as json. if self.is_pixel_request: xcoord = float(self.kwargs.get('xcoord')) ycoord = float(self.kwargs.get('ycoord')) val = pixel_value_from_point(result, [xcoord, ycoord]) return HttpResponse( json.dumps({ 'x': xcoord, 'y': ycoord, 'value': val }), content_type='application/json', ) # For tif requests, skip colormap and return georeferenced tif file. if self.kwargs.get('frmt') == 'tif': vsi_path = os.path.join(VSI_FILESYSTEM_BASE_PATH, str(uuid.uuid4())) rast = result.warp({ 'name': vsi_path, 'driver': 'tif', 'compress': 'DEFLATE', }) content_type = IMG_FORMATS['tif'][1] return HttpResponse(rast.vsi_buffer, content_type) # Get array from algebra result if result.bands[0].nodata_value is None: result = result.bands[0].data() else: result = numpy.ma.masked_values( result.bands[0].data(), result.bands[0].nodata_value, ) # Get colormap. colormap = self.get_colormap() # Render tile using the legend data img, stats = band_data_to_image(result, colormap) # Return rendered image return self.write_img_to_response(img, stats)
def get_algebra(self, data, formula): parser = RasterAlgebraParser() # Evaluate raster algebra expression, return 400 if not successful try: # Evaluate raster algebra expression result = parser.evaluate_raster_algebra(data, formula) except: raise RasterAlgebraException('Failed to evaluate raster algebra.') # For pixel value requests, return result as json. if self.is_pixel_request: xcoord = float(self.kwargs.get('xcoord')) ycoord = float(self.kwargs.get('ycoord')) val = pixel_value_from_point(result, [xcoord, ycoord]) return HttpResponse( json.dumps({ 'x': xcoord, 'y': ycoord, 'value': val }), content_type='application/json', ) # Get array from algebra result if result.bands[0].nodata_value is None: result = result.bands[0].data() else: result = numpy.ma.masked_values( result.bands[0].data(), result.bands[0].nodata_value, ) # Get colormap. colormap = self.get_colormap() # Render tile using the legend data img, stats = band_data_to_image(result, colormap) # Return rendered image return self.write_img_to_response(img, stats)
def get_algebra(self, data, formula): parser = RasterAlgebraParser() # Evaluate raster algebra expression, return 400 if not successful try: # Evaluate raster algebra expression result = parser.evaluate_raster_algebra(data, formula) except: raise RasterAlgebraException('Failed to evaluate raster algebra.') # Get array from algebra result result = numpy.ma.masked_values( result.bands[0].data(), result.bands[0].nodata_value, ) # Render tile colormap = self.get_colormap() if colormap: # Render tile using the legend data img, stats = band_data_to_image(result, colormap) else: # Scale to grayscale rgb (can be colorscheme later on) result = result.astype('float').ravel() result = 255 * (result - numpy.min(result)) / (numpy.max(result) - numpy.min(result)) # Create rgba matrix from grayscale array result = numpy.array( (result, result, result, numpy.repeat(255, len(result)))).T rgba = result.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)