示例#1
0
    def apply_harvest_stand_model(self, inventory: Inventory, model: StandModel, operation: Operation):

        result_inventory = Inventory()

        min = operation.get_variable('min_age') if operation.has('min_age') else 0
        max = operation.get_variable('max_age') if operation.has('max_age') else 1000

        for plot in inventory.plots:

            if min <= plot.age <= max:
                
                new_plot = Plot()
                new_plot.clone(plot)

                try:
                    cut_criteria = CUTTYPES_DICT[operation.get_variable('cut_down')]
                    model.apply_cut_down_model(plot, new_plot, cut_criteria, 
                                               operation.get_variable('volumen'), operation.get_variable('time'),
                                               min, max)

                except Exception as e:
                    Tools.print_log_line(str(e), logging.ERROR)

                result_inventory.add_plot(new_plot)

        return result_inventory
示例#2
0
    def correct_plots(self, inventory, operation: Operation):

        if inventory is None:
            return

        min = operation.get_variable('min_age') if operation.has(
            'min_age') else 0
        max = operation.get_variable('max_age') if operation.has(
            'max_age') else 1000
        time = 0

        for plot in inventory.plots:

            if min <= plot.age <= max:
                time = operation.get_variable('time')

            if plot.id not in self.__plots.keys():

                new_plot = Plot()
                new_plot.clone(plot, True)
                new_plot.sum_value('AGE', time)

                self.__plots_to_print[plot.id] = False
                self.__plots[plot.id] = new_plot

            self.__plots[plot.id].sum_value('AGE', time)
            # self.__plots[plot.id].update_trees({'AGE': time}, 1)
            time = 0
示例#3
0
    def apply_harvest_model(self, inventory: Inventory, model: HarvestModel, operation: Operation):

        result_inventory: inventory = Inventory()

        min = operation.get_variable('min_age') if operation.has('min_age') else 0
        max = operation.get_variable('max_age') if operation.has('max_age') else 1000

        for plot in inventory.plots:

            if min <= plot.age <= max:

                try:
                    new_plot = model.apply_model(plot, operation.get_variable('time'), operation.get_variable('volumen'))
                    new_plot.recalculate()
                    result_inventory.add_plot(new_plot)
                except Exception as e:
                    Tools.print_log_line(str(e), logging.ERROR)

            else:
                Tools.print_log_line('Plot ' + str(plot.id) + ' was not added', logging.INFO)

        return result_inventory
示例#4
0
    def apply_tree_stand_model(self, inventory: Inventory, model: StandModel, operation: Operation):

        result_inventory = Inventory()

        min = operation.get_variable('min_age') if operation.has('min_age') else 0
        max = operation.get_variable('max_age') if operation.has('max_age') else 1000

        for plot in inventory.plots:

            if min <= plot.age <= max:

                new_plot = Plot()
                new_plot.clone(plot)

                try:
                    model.apply_tree_model(plot, new_plot, operation.get_variable('time'))
                except Exception as e:
                    Tools.print_log_line(str(e), logging.ERROR)

                result_inventory.add_plot(new_plot)

        return result_inventory
示例#5
0
    def add_step(self, step_id, inventory: Inventory, operation: Operation,
                 model):

        min_age = 0
        max_age = 0

        if len(self.__steps) == 0:
            age = operation.get_variable('init')
        else:
            last = self.get_last()
            age = last.age + operation.get_variable('time')
            min_age = operation.get_variable('min_age')
            max_age = operation.get_variable('max_age')

        model_name = ''

        if isinstance(model, HarvestModel):
            model_name = i18n.t('simanfor.general.' + model.name)

        self.__steps.append(
            Step(step_id, inventory, operation.type, operation.description,
                 age, min_age, max_age, operation, model_name))
示例#6
0
    def apply_model(self,
                    model,
                    operation: Operation,
                    inventory: Inventory = None):

        new_inventory: Inventory = None

        print(
            '##############################################################################'
        )
        print('RUN OPERATION: ' + operation.type.get_name())
        print(
            '##############################################################################'
        )

        if isinstance(model, LoadModel) and operation.type.action == LOAD:
            new_inventory = self.apply_load_model(
                operation.get_variable('input'), model, operation)
        if isinstance(model,
                      HarvestModel) and operation.type.action == HARVEST:
            new_inventory = self.apply_harvest_model(inventory, model,
                                                     operation)
        if isinstance(model, StandModel) and operation.type.action == HARVEST:
            new_inventory = self.apply_harvest_stand_model(
                inventory, model, operation)
        if isinstance(model, TreeModel) and operation.type.action == INIT:
            new_inventory = self.apply_initialize_tree_model(
                inventory, model, operation)
        if isinstance(model, StandModel) and operation.type.action == INIT:
            new_inventory = self.apply_initialize_stand_model(
                inventory, model, operation)
        if isinstance(model, TreeModel) and operation.type.action == EXECUTION:
            new_inventory = self.apply_tree_model(inventory, model, operation)
        if isinstance(model,
                      StandModel) and operation.type.action == EXECUTION:
            new_inventory = self.apply_tree_stand_model(
                inventory, model, operation)

        new_inventory.correct_plots(inventory, operation)

        return new_inventory
示例#7
0
    def __init__(self,
                 id: int,
                 inventory: Inventory,
                 op: OperationType,
                 description: str,
                 age: int,
                 min_age: int,
                 max_age: int,
                 operation: Operation,
                 cut_name: str):

        self.__id = id
        self.__operation = op
        self.__description = description
        self.__inventory = inventory
        self.__age = age
        self.__min_age = min_age
        self.__max_age = max_age
        self.__years = operation.get_variable('time') if operation.has('time') else 0
        self.__cut = cut_name
        self.__quantity = operation.get_variable('volumen') if operation.has('volumen') else None
        self.__by_means = CUTTYPES_DICT[operation.get_variable('cut_down')] if operation.has('cut_down') else 'Empty'
        self.__generate_output = True
        self.__full_operation = operation
示例#8
0
 def apply_load_model(self, file_path: str, model: LoadModel, operation: Operation):
     return model.apply_model(file_path, operation.get_variable('init'))
示例#9
0
    def apply_tree_model(self, inventory: Inventory, model: TreeModel, operation: Operation):

        result_inventory = Inventory()

        min = operation.get_variable('min_age') if operation.has('min_age') else 0
        max = operation.get_variable('max_age') if operation.has('max_age') else 1000

        for plot in inventory.plots:

            cut_pies_mayores = list()
            dead_pies_mayores = list()
            result_pies_mayores = list()
            add_pies_mayores = list()  # aquí recojo árboles de masa añadida, con status = I

            if min <= plot.age <= max:

                new_plot = Plot()
                new_plot.clone(plot)

                search_criteria = SearchCriteria()
                search_criteria.add_criteria('status', None, EQUAL)

                source_trees = Tree.get_sord_and_order_tree_list(plot.trees, search_criteria=search_criteria)

                for tree in source_trees:

                    survives_ratio: float = 0.0

                    try:
                        survives_ratio = model.survives(operation.get_variable('time'), new_plot, tree)
                    except Exception as e:
                        Tools.print_log_line(str(e), logging.ERROR)

                    if survives_ratio > 0:

                        new_tree = Tree()
                        new_tree.clone(tree)
                        new_tree.add_value('expan', survives_ratio * new_tree.expan)

                        new_tree_dead = Tree()
                        new_tree_dead.clone(tree)
                        new_tree_dead.add_value('status', 'M')
                        new_tree_dead.add_value('expan', (1 - survives_ratio) * new_tree_dead.expan)

                        try:
                            model.grow(operation.get_variable('time'), new_plot, tree, new_tree)
                        except Exception as e:
                            Tools.print_log_line(str(e), logging.ERROR)

                        #ActualizaDatosPieMayor(new_tree);

                        #source_trees.update_tree(tree)

                        result_pies_mayores.append(new_tree)
                        dead_pies_mayores.append(new_tree_dead)


                # Aquí comienza el código correspondiente a la masa añadida (ingrowth) en las ejecuciones
                # Su funcionamiento, en principio, será similar a la función de supervivencia
                # Se añadirá el EXPAN que se considere a cada árbol directamente en las ejecuciones, y mostraremos en el output un "clon" de cada árbol con el valor del 
                # EXPAN añadido, y con el status = I (Ingrowth) para poder identificarlo (como con árboles muertos)



                new_area_basimetrica: float = 0
                distribution: float = 0  # creo esta variable, que estaba sin crear

                try:
                    new_area_basimetrica = model.add_tree(operation.get_variable('time'), new_plot);
                except Exception as e:
                    Tools.print_log_line(str(e), logging.ERROR)

                if new_area_basimetrica > 0:  # si no se añade masa, se omite este paso

                    try:
                        distribution = model.new_tree_distribution(operation.get_variable('time'), new_plot, new_area_basimetrica)

                    except Exception as e:
                        Tools.print_log_line(str(e), logging.ERROR)


                    order_criteria = OrderCriteria()
                    order_criteria.add_criteria('dbh')  # cambio add_variable por add_criteria

                    tree_to_add: Tree = Tree.get_sord_and_order_tree_list(result_pies_mayores, order_criteria=order_criteria)

                    sum_g = 0  # esta variable recoge el sumatorio de secciones normales de la parcela, para usar el valor en los cálculos posteriores
                    for tree in tree_to_add:
                        sum_g += tree.basal_area  # * tree.expan  -->  no se multiplica por tree.expan 

                    if distribution == None:  # si no existe una función de distribución

                        # n_trees = len(tree_to_add)  # calculamos el nº de árboles de la parcela  -->  ahora ya no hace falta, pero lo dejo de momento

                        for tree in tree_to_add:  # para los árboles que quiero añadir (todos los de la parcela serán modificados, en principio)
                            # voy a añadir una parte proporcional a cada uno; duplico la lista de árboles para que en el output se añada la masa y además se pueda
                            # mostrar que expan se ha añadido a cada árbol, tal cual se hace con los árboles muertos

                            new_d_tree = Tree()  # estos árboles serán los que se muestran sin status y pasan a la siguiente ejecución
                            new_d_tree.clone(tree)
                            new_d_tree.add_value('expan', (new_area_basimetrica*10000) / sum_g + new_d_tree.expan)  ### hay que revisar este cálculo

                            new_tree_add = Tree()  # estos árboles serán los que se muestran con status = I
                            new_tree_add.clone(tree)
                            new_tree_add.add_value('status', 'I')  # habría que conseguir que estos árboles aparecieran pintados en el output
                            new_tree_add.add_value('expan', (new_area_basimetrica*10000) / sum_g)  ### hay que revisar este cálculo

                            result_pies_mayores.append(new_d_tree)  # añado los árboles con EXPAN modificado a la lista
                            add_pies_mayores.append(new_tree_add)  # añado los árboles con status = I a una nueva lista



                    # para los modelos en los que sí hay unas condiciones establecidas en new_tree_distribution, entonces se aplica lo siguiente

                    else:  # si existe una función de distribución definida por el usuario

                        # var = 0  # acumulador del nº de árboles de cada CD  -->  ya no es necesario, lo silencio de momento
                        sum_g = 0  # acumulador del sumatorio de secciones normales para cada CD
                        count = 0  # contador para entrar en la posición de la lista que deseamos

                        for tree in tree_to_add:  # con este bucle añado el nº de árboles que hay para cada CD puesta por el usuario                     
                            
                            for k in distribution:  # para cada CD puesta por el usuario

                                if tree.dbh >= distribution[count][0] and tree.dbh < distribution[count][1]:  # si se cumplen los límites de diámetro

                                    # var += 1  # añadimos 1 al nº de árboles que cumplen la condición 
                                    sum_g += tree.basal_area  # * tree.expan  -->  no se multiplica por tree.expan                             
                                    break  # pasamos al siguiente árbol

                                else:  # si se deja de cumplir la condición de diámetro (los árboles están ordenados por dbh, de menor a mayor)

                                    # distribution[count].append(var)  # añadimos el nº de árboles a la lista
                                    distribution[count].append(sum_g)  # añadimos la suma de secciones normales por CD a la lista
                                    count += 1  # avanzamos una posición en la lista
                                    # var = 0  # comenzamos la cuenta desde 0
                                    sum_g = 0  # comenzamos la cuenta desde 0

                        # distribution[count].append(var)  # esto es necesario para añadir el valor a la última CD
                        distribution[count].append(sum_g)  # esto es necesario para añadir el valor a la última CD

                        for tree in tree_to_add:
                        # aquí se repartirá el valor del área basimétrica en las distintas clases diamétricas (propuestas en el modelo), de manera equitativa para cada árbol

                            for k in distribution:  # para cada CD

                                if tree.dbh >= k[0] and tree.dbh < k[1]:  # si se cumplen los límites de diámetro (ordenados de menor a mayor)

                                    new_d_tree = Tree()  # estos árboles serán los que se muestran sin status y pasan a la siguiente ejecución
                                    new_d_tree.clone(tree)
                                    new_d_tree.add_value('expan', (k[2]*10000) / k[3] + new_d_tree.expan)  # añadimos la parte proporcional del expan a cada árbol
                                    # OJO! Si hubiera que meter de nuevo el nº de pies en cada CD, entonces las posiciones de las listas variarían!
                                    new_tree_add = Tree()  # estos árboles serán los que se muestran con status = I
                                    new_tree_add.clone(tree)
                                    new_tree_add.add_value('status', 'I')  # habría que conseguir que estos árboles aparecieran pintados en el output
                                    new_tree_add.add_value('expan', (k[2]*10000) / k[3])  # añadimos la parte proporcional del expan a cada árbol

                                    result_pies_mayores.append(new_d_tree)  # añado los árboles con EXPAN modificado a la lista
                                    add_pies_mayores.append(new_tree_add)  # añado los árboles con status = I a una nueva lista
                                    
                                    break  # salto al árbol siguiente
                                                

                result_pies_mayores.extend(cut_pies_mayores)  # se añaden los pies cortados
                result_pies_mayores.extend(dead_pies_mayores)  # se añaden los pies muertos
                result_pies_mayores.extend(add_pies_mayores)  # añado árboles con status = I
                
                new_plot.add_trees(result_pies_mayores)
                # new_plot.recalculate()  --> Spiros

                try:
                    model.process_plot(operation.get_variable('time'), new_plot, result_pies_mayores)
                except Exception as e:
                    Tools.print_log_line(str(e), logging.ERROR)

                new_plot.recalculate()

                result_inventory.add_plot(new_plot)

            else:
                Tools.print_log_line('Plot ' + str(plot.id) + ' was not added', logging.INFO)

        return result_inventory