コード例 #1
0
class Okeanos(object):
    """docstring for  Okeanos."""
    def __init__(self, params, dataset_name):
        self.params = params
        # self.dataset = dataset
        self.variables_data = dict()

        self.dataset_vars = list()

        #List with names and characteristics of the dataset variables
        self.variables_dataset = list()

        #List with names and characteristics of the template variables
        self.variables_template = list()

        dataset_var_type = self.params.template.variables_dataset['type']
        if dataset_var_type == "multiple":
            self.data_processor = DataProcessor(
                dataset_name, dataset_var_type,
                self.params.template.variables_dataset['aggregation'])
        else:
            self.data_processor = DataProcessor(dataset_name, dataset_var_type)

        self.reverse_data = False if self.params.template.variables_dataset[
            'reverse'] == "false" else True

        #Se agrega las dimensiones del dataset
        self.data_processor.add_dimensions_variables(self.params.template.variables_dataset.lat.cdata,\
                   self.params.template.variables_dataset.lon.cdata,\
                   self.params.template.variables_dataset.time.cdata,\
                   self.reverse_data)

        if self.params.template.output["type"] == "images":
            self.template_dimensions = dict()
            self.template_dimensions['max_lat'] = int(
                self.params.template.layers["max_lat"])
            self.template_dimensions['max_lon'] = int(
                self.params.template.layers["max_lon"])
            self.template_dimensions['min_lat'] = int(
                self.params.template.layers["min_lat"])
            self.template_dimensions['min_lon'] = int(
                self.params.template.layers["min_lon"])
            self.interpolation_factor = int(
                self.params.template.layers["interpolation_factor"])
        if self.params.template.output["type"] == "csv":
            self.template_dimensions = dict()
            self.template_dimensions[
                'max_lat'] = self.data_processor.raw_variables["lat"].max()
            self.template_dimensions[
                'max_lon'] = self.data_processor.raw_variables["lon"].max()
            self.template_dimensions[
                'min_lat'] = self.data_processor.raw_variables["lat"].min()
            self.template_dimensions[
                'min_lon'] = self.data_processor.raw_variables["lon"].min()
            print(self.template_dimensions)
            self.interpolation_factor = int(
                self.params.template.points["interpolation_factor"])

#this vectors are no longer necesary
#self.latitude_array = self.dataset[params.template.variables.lat.cdata][:]
#self.longitude_array = self.dataset[params.template.variables.lon.cdata][:]

#The data processor is in charge to put the data in the right format for the map creation

#this vectors are no longer necesary
#self.variables_data['time'] = self.dataset[params.template.variables.time.cdata][:]
#self.template_dimensions=list()
#self.data_processor = data_processor(dataset_name)

    def launch(self):
        self.create_collection()


#Pasar esto a data_processor

    def process_vars(self):
        #De ser necesario revertir los datos se revierten

        if not self.data_processor.add_template_dimensions(
                self.template_dimensions, self.interpolation_factor):
            return False

        #Se extraen las variables del dataset descritas en la plantilla
        variables_dataset = self.process_dataset_variables_parameters()

        #Se extraen y se revierten los datos de las variables del dataset que se van a usar
        self.data_processor.process_dataset_area(variables_dataset,
                                                 self.reverse_data)

        #Se extraen los nombres de las variables como se van a usar en la plantilla
        self.variables_template = self.process_template_variables_parameters()

        #Se procesan las variables como se van a usar en la plantilla
        self.data_processor.process_template_variables(self.variables_template)

        return True

    def process_dataset_variables_parameters(self):
        variables_dataset = list()
        for var in self.params.template.variables_dataset.var:
            dataset_var = dict()
            dataset_var["entry_name"] = var.cdata
            dataset_var["output_name"] = var["output_name"]
            if var["level"] is not None:
                dataset_var["level"] = int(var["level"])
            variables_dataset.append(dataset_var)
        return variables_dataset

    def process_template_variables_parameters(self):
        variables_template = list()
        for var in self.params.template.variables_template.var:
            dataset_var = dict()
            dataset_var["name"] = var.cdata
            dataset_var["value_u"] = var["value_u"]
            dataset_var["value_v"] = var["value_v"]
            dataset_var["magnitude"] = var["magnitude"]
            dataset_var["type"] = var["type"]
            dataset_var["angle"] = var["angle"]
            dataset_var["convention"] = var["convention"]
            variables_template.append(dataset_var)
        return variables_template

    def create_collection(self):
        collection_name = os.path.normpath(self.params.template.output.cdata)
        if not os.path.exists(collection_name):
            os.makedirs(collection_name)
        if self.params.template.output["type"] == "images":
            self.create_images(collection_name)
        if self.params.template.output["type"] == "csv":
            self.create_points(collection_name)
        self.data_processor.dataset.close()
        #Para generar una imagen cuadrada se usa una resolucion de 3.2x2.7 despues se cambia para el dpi para lo que sea necesario

    def create_images(self, collection_name):
        map_plotter = MapCreator(self.data_processor.data_output["lat"],
                                 self.data_processor.data_output["lon"])
        if self.params.template.title.cdata != "":
            map_plotter.add_title(self.params.template.title.cdata,
                                  self.params.template.title)
        draw_map = True
        if self.params.template.layers["draw_map"] is not None:
            draw_map = True if self.params.template.layers[
                "draw_map"] == "True" else False
        for layer in self.params.template.layers.layer:
            map_plotter.add_layer(layer['type'], layer['var_name'],
                                  layer.params)
        map_plotter.create_collection(self.data_processor.data_output,
                                      collection_name,
                                      draw_map=draw_map,
                                      dpi_image=150,
                                      image_width=2.7,
                                      image_height=3.2)

    def create_points(self, collection_name):
        csv_data_points = list()
        var_names = map(lambda d: d["name"], self.variables_template)
        point_creator = PointCreator(var_names)
        for point in self.params.template.points.point:
            point_csv = dict()
            print(self.template_dimensions["max_lat"],
                  self.template_dimensions["max_lon"])
            lat_index = self.data_processor.calculate_sub_index(float(point['lat']),\
                      self.template_dimensions["min_lat"],\
                      self.data_processor.data_precision_factor)

            lon_index = self.data_processor.calculate_sub_index(float(point['lon']),\
                      self.template_dimensions["min_lon"],\
                      self.data_processor.data_precision_factor)
            file_name = point.cdata
            point_creator.add_point(lat_index, lon_index, file_name)
        #print(self.data_processor.raw_variables)
        print(self.data_processor.sub_indexes)
        point_creator.create_collection(self.data_processor.data_output,
                                        collection_name)