def get_visualization_image(self, data_product_id='', visualization_parameters=None, callback=''): # Error check if not data_product_id: raise BadRequest("The data_product_id parameter is missing") if visualization_parameters == {}: visualization_parameters = None # Extract the retrieval related parameters. Definitely init all parameters first query = None if visualization_parameters : query = {'parameters':[]} # Error check and damage control. Definitely need time if 'parameters' in visualization_parameters: if not 'time' in visualization_parameters['parameters']: visualization_parameters['parameters'].append('time') query['parameters'] = visualization_parameters['parameters'] if 'stride_time' in visualization_parameters: query['stride_time'] = visualization_parameters['stride_time'] if 'start_time' in visualization_parameters: query['start_time'] = visualization_parameters['start_time'] if 'end_time' in visualization_parameters: query['end_time'] = visualization_parameters['end_time'] # get the dataset_id associated with the data_product. Need it to do the data retrieval ds_ids,_ = self.clients.resource_registry.find_objects(data_product_id, PRED.hasDataset, RT.DataSet, True) if ds_ids is None or not ds_ids: return None # Ideally just need the latest granule to figure out the list of images #replay_granule = self.clients.data_retriever.retrieve(ds_ids[0],{'start_time':0,'end_time':2}) retrieved_granule = self.clients.data_retriever.retrieve(ds_ids[0], query=query) if retrieved_granule is None: return None # send the granule through the transform to get the matplotlib graphs mpl_pdict_id = self.clients.dataset_management.read_parameter_dictionary_by_name('graph_image_param_dict',id_only=True) mpl_stream_def = self.clients.pubsub_management.create_stream_definition('mpl', parameter_dictionary_id=mpl_pdict_id) mpl_data_granule = VizTransformMatplotlibGraphsAlgorithm.execute(retrieved_granule, config=visualization_parameters, params=mpl_stream_def) if mpl_data_granule == None: return None mpl_rdt = RecordDictionaryTool.load_from_granule(mpl_data_granule) ret_dict = dict() ret_dict['content_type'] = (get_safe(mpl_rdt, "content_type"))[0] ret_dict['image_name'] = (get_safe(mpl_rdt, "image_name"))[0] # reason for encoding as base64 string is otherwise message pack complains about the bit stream ret_dict['image_obj'] = base64.encodestring((get_safe(mpl_rdt, "image_obj"))[0]) if callback == '': return ret_dict else: return callback + "(" + simplejson.dumps(ret_dict) + ")"
def get_visualization_image(self, data_product_id='', visualization_parameters=None): # Error check if not data_product_id: raise BadRequest("The data_product_id parameter is missing") if visualization_parameters == {}: visualization_parameters = None # Extract the retrieval related parameters. Definitely init all parameters first query = None image_name = None if visualization_parameters : #query = {'parameters':[]} query = {} # Error check and damage control. Definitely need time if 'parameters' in visualization_parameters: if not 'time' in visualization_parameters['parameters']: visualization_parameters['parameters'].append('time') query['parameters'] = visualization_parameters['parameters'] if 'stride_time' in visualization_parameters: query['stride_time'] = visualization_parameters['stride_time'] if 'start_time' in visualization_parameters: query['start_time'] = visualization_parameters['start_time'] if 'end_time' in visualization_parameters: query['end_time'] = visualization_parameters['end_time'] # If an image_name was given, it means the image is already in the storage. Just need the latest granule. # ignore other paramters passed if 'image_name' in visualization_parameters: image_name = visualization_parameters['image_name'] # get the dataset_id associated with the data_product. Need it to do the data retrieval ds_ids,_ = self.clients.resource_registry.find_objects(data_product_id, PRED.hasDataset, RT.Dataset, True) if ds_ids is None or not ds_ids: log.warn("Specified data_product does not have an associated dataset") return None # Ideally just need the latest granule to figure out the list of images if image_name: retrieved_granule = self.clients.data_retriever.retrieve_last_data_points(ds_ids[0], 10) else: retrieved_granule = self.clients.data_retriever.retrieve(ds_ids[0], query=query) if retrieved_granule is None: return None # no need to pass data through transform if its already a pre-computed image if image_name: mpl_data_granule = retrieved_granule else: # send the granule through the transform to get the matplotlib graphs mpl_pdict_id = self.clients.dataset_management.read_parameter_dictionary_by_name('graph_image_param_dict',id_only=True) mpl_stream_def = self.clients.pubsub_management.create_stream_definition('mpl', parameter_dictionary_id=mpl_pdict_id) mpl_data_granule = VizTransformMatplotlibGraphsAlgorithm.execute(retrieved_granule, config=visualization_parameters, params=mpl_stream_def) if mpl_data_granule == None: return None mpl_rdt = RecordDictionaryTool.load_from_granule(mpl_data_granule) ret_dict = dict() ret_dict['content_type'] = (get_safe(mpl_rdt, "content_type"))[0] ret_dict['image_name'] = (get_safe(mpl_rdt, "image_name"))[0] # reason for encoding as base64 string is otherwise message pack complains about the bit stream #ret_dict['image_obj'] = base64.encodestring((get_safe(mpl_rdt, "image_obj"))[0]) ret_dict['image_obj'] = (get_safe(mpl_rdt, "image_obj"))[0] return ret_dict
def get_visualization_image(self, data_product_id='', visualization_parameters=None, callback=''): # Error check if not data_product_id: raise BadRequest("The data_product_id parameter is missing") if visualization_parameters == {}: visualization_parameters = None # Extract the retrieval related parameters. Definitely init all parameters first query = None image_name = None if visualization_parameters : #query = {'parameters':[]} query = {} # Error check and damage control. Definitely need time if 'parameters' in visualization_parameters: if not 'time' in visualization_parameters['parameters']: visualization_parameters['parameters'].append('time') query['parameters'] = visualization_parameters['parameters'] if 'stride_time' in visualization_parameters: query['stride_time'] = visualization_parameters['stride_time'] if 'start_time' in visualization_parameters: query['start_time'] = visualization_parameters['start_time'] if 'end_time' in visualization_parameters: query['end_time'] = visualization_parameters['end_time'] # If an image_name was given, it means the image is already in the storage. Just need the latest granule. # ignore other paramters passed if 'image_name' in visualization_parameters: image_name = visualization_parameters['image_name'] # get the dataset_id associated with the data_product. Need it to do the data retrieval ds_ids,_ = self.clients.resource_registry.find_objects(data_product_id, PRED.hasDataset, RT.Dataset, True) if ds_ids is None or not ds_ids: log.warn("Specified data_product does not have an associated dataset") return None # Ideally just need the latest granule to figure out the list of images if image_name: retrieved_granule = self.clients.data_retriever.retrieve_last_data_points(ds_ids[0], 10) else: retrieved_granule = self.clients.data_retriever.retrieve(ds_ids[0], query=query) #print " >>>>>>>>>>>> RETRIEVED GRANULE : " , retrieved_granule if retrieved_granule is None: return None # no need to pass data through transform if its already a pre-computed image if image_name: mpl_data_granule = retrieved_granule else: # send the granule through the transform to get the matplotlib graphs mpl_pdict_id = self.clients.dataset_management.read_parameter_dictionary_by_name('graph_image_param_dict',id_only=True) mpl_stream_def = self.clients.pubsub_management.create_stream_definition('mpl', parameter_dictionary_id=mpl_pdict_id) mpl_data_granule = VizTransformMatplotlibGraphsAlgorithm.execute(retrieved_granule, config=visualization_parameters, params=mpl_stream_def) if mpl_data_granule == None: return None mpl_rdt = RecordDictionaryTool.load_from_granule(mpl_data_granule) ret_dict = dict() ret_dict['content_type'] = (get_safe(mpl_rdt, "content_type"))[0] ret_dict['image_name'] = (get_safe(mpl_rdt, "image_name"))[0] # reason for encoding as base64 string is otherwise message pack complains about the bit stream ret_dict['image_obj'] = base64.encodestring((get_safe(mpl_rdt, "image_obj"))[0]) if callback == '': return ret_dict else: return callback + "(" + simplejson.dumps(ret_dict) + ")"