def compressImage(image_input, image_output_compress, inputBand4Found, compress_type, predictor, zlevel, format_raster): if debug >= 1: print(cyan + "compressImage() : " + endC + "Debut de la compression de %s" % (image_input)) # Preparation de la commande command = "" caseBand4 = "" if inputBand4Found: caseBand4 = "-colorinterp_4 undefined" # Selon le type de compression while switch(compress_type.upper()): if case("DEFLATE"): if debug >= 2: print("Compression DEFLATE : ") command = "gdal_translate -of %s %s -co TILED=YES -co COMPRESS=%s -co PREDICTOR=%s -co ZLEVEL=%s %s %s" % ( format_raster, caseBand4, compress_type, predictor, zlevel, image_input, image_output_compress) break if case("LZW"): if debug >= 2: print("Compression LZW : ") command = "gdal_translate -of %s %s -co TILED=YES -co COMPRESS=%s -co ZLEVEL=%s %s %s" % ( format_raster, caseBand4, compress_type, zlevel, image_input, image_output_compress) break break if command == "": raise NameError( bold + red + "compressImage() : Le type de compression n'est pas reconu : " + str(compress_type + endC)) if debug >= 1: print(cyan + "compressImage() : " + endC + "Algorithme de compressions : " + str(compress_type) + endC) print(cyan + "compressImage() : " + endC + "Predicteur : " + str(predictor) + endC) if compress_type == "DEFLATE": print(cyan + "compressImage() : " + endC + "Taux de compression : " + str(zlevel) + endC) print(cyan + "compressImage() : " + endC + "Fichier de sortie : " + image_output_compress + endC) exitCode = os.system(command) if exitCode != 0: print(command) raise NameError( bold + red + "compressImage() : An error occured during gdal_translate command. See error message above." + endC) print(bold + green + "FIN DE LA COMPRESSION DE " + image_input + endC) return
def smoothGeomGrass(input_vector, output_vector, param_generalize_dico, format_vector="ESRI_Shapefile", overwrite=True): if debug >= 2: print(cyan + "smoothGeomGrass() : " + bold + green + "Lancement de la fonction de lissage par GRASS v.generalize" + endC) format_vector = format_vector.replace(' ', '_') # Import du vecteur d'entrée leng_name_vector_input = len( os.path.splitext(os.path.basename(input_vector))[0]) if leng_name_vector_input > 16: leng_name_vector_input = 16 input_name = "VI" + os.path.splitext( os.path.basename(input_vector))[0][0:leng_name_vector_input] input_name = input_name.replace('-', '_') leng_name_vector_output = len( os.path.splitext(os.path.basename(output_vector))[0]) if leng_name_vector_output > 16: leng_name_vector_output = 16 output_name = "VO" + os.path.splitext( os.path.basename(output_vector))[0][0:leng_name_vector_output] output_name = output_name.replace('-', '_') importVectorOgr2Grass(input_vector, input_name, overwrite) # Traitement avec la fonction v.generalize method = None threshold = None for key in param_generalize_dico: while switch(key): if case("method"): method = param_generalize_dico[key] break if case("threshold"): threshold = param_generalize_dico[key] break grass.run_command('v.generalize', input=input_name, output=output_name, method=method, threshold=threshold, overwrite=overwrite, stderr=subprocess.PIPE) # Export du jeu de données traité exportVectorOgr2Grass(output_name, output_vector, format_vector, overwrite) return
def convert2dot(command_doc, struct_cmd_dico, graph_name, dot_file, debug): EXT_ERR = '.err' # Definie les parametrres du graph graph = pgv.AGraph(name=graph_name, directed=True) graph.graph_attr['outputorder'] = 'edgesfirst' graph.graph_attr['label'] = command_doc #graph.graph_attr['ratio']='1.0' graph.graph_attr['ratio'] = 'compress' graph.graph_attr['rankdir'] = 'TB' graph.node_attr['shape'] = 'ellipse' graph.node_attr['fixedsize'] = 'false' graph.node_attr['fontsize'] = '8' graph.node_attr['style'] = 'filled' graph.edge_attr['color'] = 'lightslategray' graph.edge_attr['style'] = 'setlinewidth(2)' graph.edge_attr['arrowhead'] = 'open' graph.edge_attr.update(arrowhead='vee', arrowsize='2') # Parcours du dictionaire de facon ordonnée id_command_list = struct_cmd_dico.keys() id_command_sorted_list = sorted(id_command_list) # Pour toutes les lignes du fichier commande for id_cmd in id_command_sorted_list: # Recuperer les valeurs des coordonnees info_cmd_list = struct_cmd_dico[id_cmd] state = info_cmd_list[0] dependency_list = info_cmd_list[1] name_cmd = info_cmd_list[2] start_date = info_cmd_list[3] end_date = info_cmd_list[4] name_task_list = info_cmd_list[5].split('.') name_task = name_task_list[1] + '.' + name_task_list[2] # Creation du graph if debug >= 4: print(cyan + "convert2dot() : " + endC + "Id Cmd = " + str(id_cmd) + ", state : " + state) graph.add_node(id_cmd) node = graph.get_node(id_cmd) # Dependances for dependency in dependency_list: graph.add_edge(id_cmd, dependency) # Definir la couleur selon l'etat de la commande value_color = 'white' info = "" while switch(state): if case(TAG_STATE_MAKE): # Etat A_Faire value_color = 'lightgray' break if case(TAG_STATE_WAIT): # Etat En_Attente value_color = 'gray52' break if case(TAG_STATE_LOCK): # Etat Bloqué value_color = 'darkorange' break if case(TAG_STATE_RUN): # Etat En_Cours value_color = 'deepskyblue1' info = "\n" + start_date break if case(TAG_STATE_END): # Etat Termine value_color = 'chartreuse' start_date_time = datetime.strptime(start_date, '%d/%m/%y %H:%M:%S') end_date_time = datetime.strptime(end_date, '%d/%m/%y %H:%M:%S') during_time = end_date_time - start_date_time info = "\n" + str(during_time) break if case(TAG_STATE_ERROR): # Etat En_Erreur" value_color = 'deeppink' # Definir la boite du fichier d'erreur error_file_name = os.path.splitext( os.path.basename(command_doc))[0] + str(id_cmd) + EXT_ERR id_err = str(int(id_cmd) + 10000) graph.add_node(id_err) graph.graph_attr['label'] = '' graph.edge_attr['label'] = '' node_err = graph.get_node(id_err) graph.add_edge(id_err, id_cmd) edge_err = graph.get_edge(id_err, id_cmd) node_err.attr['shape'] = 'rectangle' node_err.attr['fillcolor'] = 'red' #'lightpink' node_err.attr['label'] = error_file_name edge_err.attr['label'] = "See error file!" edge_err.attr['color'] = 'black' edge_err.attr['fontcolor'] = 'red' edge_err.attr['style'] = 'dotted' edge_err.attr['arrowhead'] = 'open' break break # Sortie du while # Assign node color node.attr['fillcolor'] = value_color # Empty labels node.attr['label'] = name_task + " - " + name_cmd + info + '\n' + str( id_cmd) # Ecriture dans le fichier graph_reverse = graph.reverse() graph_reverse.write(dot_file) return
def executeCommand(ip_serveur, port, id_command, command_to_execute, type_execution, error_management, base_name_shell_command, ip_remote="", login="", password=""): EXT_SHELL = '.sh' EXT_ERR = '.err' EXT_LOG = '.log' new_state = '' # Preparation du fichier d'execution en background-local ou background-remote if type_execution == TAG_ACTION_TO_MAKE_BG or type_execution == TAG_ACTION_TO_MAKE_RE: # Pour les executions a faire en background ou en remote preparation des fichiers .sh et .err shell_command = base_name_shell_command + str(id_command) + EXT_SHELL error_file = base_name_shell_command + str(id_command) + EXT_ERR log_file = base_name_shell_command + str(id_command) + EXT_LOG # Creation du fichier shell error_management_option = "" if not error_management: error_management_option = " -nem " command_to_execute = command_to_execute.replace('\n', '') if six.PY2: cmd_tmp = command_to_execute + " 1> " + log_file.encode( "utf-8") + " 2> " + error_file.encode("utf-8") + "\n" else: cmd_tmp = command_to_execute + " 1> " + log_file + " 2> " + error_file + "\n" writeTextFile(shell_command, cmd_tmp) appendTextFileCR( shell_command, FUNCTION_PYTHON + "ReplyEndCommand -ip_serveur " + str(ip_serveur) + " -port " + str(port) + " -id_command " + str(id_command) + error_management_option + " -err " + error_file) appendTextFileCR(shell_command, "rm " + shell_command) os.chmod(shell_command, stat.S_IRWXU) # Selon le type d'execution while switch(type_execution): if case(TAG_ACTION_TO_MAKE_NOW): # Execution en direct (local) exitCode = subprocess.call(command_to_execute, shell=True) new_state = TAG_STATE_END if exitCode != 0: # Si la commande command_to_execute a eu un probleme new_state = TAG_STATE_ERROR print(cyan + "executeCommand : " + endC + bold + red + "ERREUR EXECUTION DE LA COMMANDE : " + str(command_to_execute) + endC, file=sys.stderr) break if case(TAG_ACTION_TO_MAKE_BG): # Execution en back ground (local) process = subprocess.Popen(shell_command, shell=True, stderr=subprocess.STDOUT) time.sleep(0.1) if process == None: new_state = TAG_STATE_ERROR print(cyan + "executeCommand : " + endC + bold + red + "ERREUR EXECUTION DE LA COMMANDE EN BACKGROUND : " + str(command_to_execute) + endC, file=sys.stderr) else: print(cyan + "executeCommand : " + endC + " background pid = " + str(process.pid)) break if case(TAG_ACTION_TO_MAKE_RE): # Test si la machine Remote est accesible if ping(ip_remote): # Execution en remote execution try: s = pxssh.pxssh() s.login(ip_remote, login, password) time.sleep(0.5) s.sendline(shell_command + '&') time.sleep(0.01) s.logout() except pxssh.ExceptionPxssh as e: new_state = TAG_STATE_ERROR print( cyan + "executeCommand : " + endC + bold + red + "ERREUR EXECUTION DE LA COMMANDE EN REMOTE (login failed) : " + str(command_to_execute) + endC, file=sys.stderr) print(e, file=sys.stderr) else: new_state = TAG_STATE_ERROR print( cyan + "executeCommand : " + endC + bold + red + "ERREUR EXECUTION DE LA COMMANDE EN REMOTE (Computeur : " + ip_remote + " non disponible) : " + str(command_to_execute) + endC, file=sys.stderr) break break # Sortie du while return new_state
def selectSamples(image_input_list, sample_image_input, vector_output, table_statistics_output, sampler_strategy, select_ratio_floor, ratio_per_class_dico, name_column, no_data_value, path_time_log, rand_seed=0, ram_otb=0, epsg=2154, format_vector='ESRI Shapefile', extension_vector=".shp", save_results_intermediate=False, overwrite=True) : # Mise à jour du Log starting_event = "selectSamples() : Select points in raster mask macro input starting : " timeLine(path_time_log, starting_event) if debug >= 3: print(cyan + "selectSamples() : " + endC + "image_input_list : " + str(image_input_list) + endC) print(cyan + "selectSamples() : " + endC + "sample_image_input : " + str(sample_image_input) + endC) print(cyan + "selectSamples() : " + endC + "vector_output : " + str(vector_output) + endC) print(cyan + "selectSamples() : " + endC + "table_statistics_output : " + str(table_statistics_output) + endC) print(cyan + "selectSamples() : " + endC + "sampler_strategy : " + str(sampler_strategy) + endC) print(cyan + "selectSamples() : " + endC + "select_ratio_floor : " + str(select_ratio_floor) + endC) print(cyan + "selectSamples() : " + endC + "ratio_per_class_dico : " + str(ratio_per_class_dico) + endC) print(cyan + "selectSamples() : " + endC + "name_column : " + str(name_column) + endC) print(cyan + "selectSamples() : " + endC + "no_data_value : " + str(no_data_value) + endC) print(cyan + "selectSamples() : " + endC + "path_time_log : " + str(path_time_log) + endC) print(cyan + "selectSamples() : " + endC + "rand_seed : " + str(rand_seed) + endC) print(cyan + "selectSamples() : " + endC + "ram_otb : " + str(ram_otb) + endC) print(cyan + "selectSamples() : " + endC + "epsg : " + str(epsg) + endC) print(cyan + "selectSamples() : " + endC + "format_vector : " + str(format_vector) + endC) print(cyan + "selectSamples() : " + endC + "extension_vector : " + str(extension_vector) + endC) print(cyan + "selectSamples() : " + endC + "save_results_intermediate : " + str(save_results_intermediate) + endC) print(cyan + "selectSamples() : " + endC + "overwrite : " + str(overwrite) + endC) # Constantes EXT_XML = ".xml" SUFFIX_SAMPLE = "_sample" SUFFIX_STATISTICS = "_statistics" SUFFIX_POINTS = "_points" SUFFIX_VALUE = "_value" BAND_NAME = "band_" COLUMN_CLASS = "class" COLUMN_ORIGINFID = "originfid" NB_POINTS = "nb_points" AVERAGE = "average" STANDARD_DEVIATION = "st_dev" print(cyan + "selectSamples() : " + bold + green + "DEBUT DE LA SELECTION DE POINTS" + endC) # Definition variables et chemins repertory_output = os.path.dirname(vector_output) filename = os.path.splitext(os.path.basename(vector_output))[0] sample_points_output = repertory_output + os.sep + filename + SUFFIX_SAMPLE + extension_vector file_statistic_points = repertory_output + os.sep + filename + SUFFIX_STATISTICS + SUFFIX_POINTS + EXT_XML if debug >= 3: print(cyan + "selectSamples() : " + endC + "file_statistic_points : " + str(file_statistic_points) + endC) # 0. EXISTENCE DU FICHIER DE SORTIE #---------------------------------- # Si le fichier vecteur points de sortie existe deja et que overwrite n'est pas activé check = os.path.isfile(vector_output) if check and not overwrite: print(bold + yellow + "Samples points already done for file %s and will not be calculated again." %(vector_output) + endC) else: # Si non ou si la vérification est désactivée : creation du fichier d'échantillons points # Suppression de l'éventuel fichier existant if check: try: removeVectorFile(vector_output) except Exception: pass # Si le fichier ne peut pas être supprimé, on suppose qu'il n'existe pas et on passe à la suite if os.path.isfile(table_statistics_output) : try: removeFile(table_statistics_output) except Exception: pass # Si le fichier ne peut pas être supprimé, on suppose qu'il n'existe pas et on passe à la suite # 1. STATISTIQUE SUR L'IMAGE DES ECHANTILLONS RASTEUR #---------------------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start statistique sur l'image des echantillons rasteur..." + endC) id_micro_list = identifyPixelValues(sample_image_input) if 0 in id_micro_list : id_micro_list.remove(0) min_micro_class_nb_points = -1 min_micro_class_label = 0 infoStructPointSource_dico = {} writeTextFile(file_statistic_points, '<?xml version="1.0" ?>\n') appendTextFileCR(file_statistic_points, '<GeneralStatistics>') appendTextFileCR(file_statistic_points, ' <Statistic name="pointsPerClassRaw">') if debug >= 2: print("Nombre de points par micro classe :" + endC) for id_micro in id_micro_list : nb_pixels = countPixelsOfValue(sample_image_input, id_micro) if debug >= 2: print("MicroClass : " + str(id_micro) + ", nb_points = " + str(nb_pixels)) appendTextFileCR(file_statistic_points, ' <StatisticPoints class="%d" value="%d" />' %(id_micro, nb_pixels)) if min_micro_class_nb_points == -1 or min_micro_class_nb_points > nb_pixels : min_micro_class_nb_points = nb_pixels min_micro_class_label = id_micro infoStructPointSource_dico[id_micro] = StructInfoMicoClass() infoStructPointSource_dico[id_micro].label_class = id_micro infoStructPointSource_dico[id_micro].nb_points = nb_pixels infoStructPointSource_dico[id_micro].info_points_list = [] del nb_pixels if debug >= 2: print("MicroClass min points find : " + str(min_micro_class_label) + ", nb_points = " + str(min_micro_class_nb_points)) appendTextFileCR(file_statistic_points, ' </Statistic>') pending_event = cyan + "selectSamples() : " + bold + green + "End statistique sur l'image des echantillons rasteur. " + endC if debug >= 3: print(pending_event) timeLine(path_time_log,pending_event) # 2. CHARGEMENT DE L'IMAGE DES ECHANTILLONS #------------------------------------------ if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start chargement de l'image des echantillons..." + endC) # Information image cols, rows, bands = getGeometryImage(sample_image_input) xmin, xmax, ymin, ymax = getEmpriseImage(sample_image_input) pixel_width, pixel_height = getPixelWidthXYImage(sample_image_input) projection_input = getProjectionImage(sample_image_input) if projection_input == None or projection_input == 0 : projection_input = epsg else : projection_input = int(projection_input) pixel_width = abs(pixel_width) pixel_height = abs(pixel_height) # Lecture des données raw_data = getRawDataImage(sample_image_input) if debug >= 3: print("projection = " + str(projection_input)) print("cols = " + str(cols)) print("rows = " + str(rows)) # Creation d'une structure dico contenent tous les points différents de zéro progress = 0 pass_prog = False for y_row in range(rows) : for x_col in range(cols) : value_class = raw_data[y_row][x_col] if value_class != 0 : infoStructPointSource_dico[value_class].info_points_list.append(x_col + (y_row * cols)) # Barre de progression if debug >= 4: if ((float(y_row) / rows) * 100.0 > progress) and not pass_prog : progress += 1 pass_prog = True print("Progression => " + str(progress) + "%") if ((float(y_row) / rows) * 100.0 > progress + 1) : pass_prog = False del raw_data pending_event = cyan + "selectSamples() : " + bold + green + "End chargement de l'image des echantillons. " + endC if debug >= 3: print(pending_event) timeLine(path_time_log,pending_event) # 3. SELECTION DES POINTS D'ECHANTILLON #-------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start selection des points d'echantillon..." + endC) appendTextFileCR(file_statistic_points, ' <Statistic name="pointsPerClassSelect">') # Rendre deterministe la fonction aléatoire de random.sample if rand_seed > 0: random.seed( rand_seed ) # Pour toute les micro classes for id_micro in id_micro_list : # Selon la stategie de selection nb_points_ratio = 0 while switch(sampler_strategy.lower()): if case('all'): # Le mode de selection 'all' est choisi nb_points_ratio = infoStructPointSource_dico[id_micro].nb_points infoStructPointSource_dico[id_micro].sample_points_list = range(nb_points_ratio) break if case('percent'): # Le mode de selection 'percent' est choisi id_macro_class = int(math.floor(id_micro / 100) * 100) select_ratio_class = ratio_per_class_dico[id_macro_class] nb_points_ratio = int(infoStructPointSource_dico[id_micro].nb_points * select_ratio_class / 100) infoStructPointSource_dico[id_micro].sample_points_list = random.sample(range(infoStructPointSource_dico[id_micro].nb_points), nb_points_ratio) break if case('mixte'): # Le mode de selection 'mixte' est choisi nb_points_ratio = int(infoStructPointSource_dico[id_micro].nb_points * select_ratio_floor / 100) if id_micro == min_micro_class_label : # La plus petite micro classe est concervée intégralement infoStructPointSource_dico[id_micro].sample_points_list = range(infoStructPointSource_dico[id_micro].nb_points) nb_points_ratio = min_micro_class_nb_points elif nb_points_ratio <= min_micro_class_nb_points : # Les micro classes dont le ratio de selection est inferieur au nombre de points de la plus petite classe sont égement conservées intégralement infoStructPointSource_dico[id_micro].sample_points_list = random.sample(range(infoStructPointSource_dico[id_micro].nb_points), min_micro_class_nb_points) nb_points_ratio = min_micro_class_nb_points else : # Pour toutes les autres micro classes tirage aleatoire d'un nombre de points correspondant au ratio infoStructPointSource_dico[id_micro].sample_points_list = random.sample(range(infoStructPointSource_dico[id_micro].nb_points), nb_points_ratio) break break if debug >= 2: print("MicroClass = " + str(id_micro) + ", nb_points_ratio " + str(nb_points_ratio)) appendTextFileCR(file_statistic_points, ' <StatisticPoints class="%d" value="%d" />' %(id_micro, nb_points_ratio)) appendTextFileCR(file_statistic_points, ' </Statistic>') appendTextFileCR(file_statistic_points, '</GeneralStatistics>') pending_event = cyan + "selectSamples() : " + bold + green + "End selection des points d'echantillon. " + endC if debug >= 3: print(pending_event) timeLine(path_time_log,pending_event) # 4. PREPARATION DES POINTS D'ECHANTILLON #---------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start preparation des points d'echantillon..." + endC) # Création du dico de points points_random_value_dico = {} index_dico_point = 0 for micro_class in infoStructPointSource_dico : micro_class_struct = infoStructPointSource_dico[micro_class] label_class = micro_class_struct.label_class point_attr_dico = {name_column:int(label_class), COLUMN_CLASS:int(label_class), COLUMN_ORIGINFID:0} for id_point in micro_class_struct.sample_points_list: # Recuperer les valeurs des coordonnees des points coor_x = float(xmin + (int(micro_class_struct.info_points_list[id_point] % cols) * pixel_width)) + (pixel_width / 2.0) coor_y = float(ymax - (int(micro_class_struct.info_points_list[id_point] / cols) * pixel_height)) - (pixel_height / 2.0) points_random_value_dico[index_dico_point] = [[coor_x, coor_y], point_attr_dico] del coor_x del coor_y index_dico_point += 1 del point_attr_dico del infoStructPointSource_dico pending_event = cyan + "selectSamples() : " + bold + green + "End preparation des points d'echantillon. " + endC if debug >=3: print(pending_event) timeLine(path_time_log,pending_event) # 5. CREATION DU FICHIER SHAPE DE POINTS D'ECHANTILLON #----------------------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start creation du fichier shape de points d'echantillon..." + endC) # Définir les attibuts du fichier résultat attribute_dico = {name_column:ogr.OFTInteger, COLUMN_CLASS:ogr.OFTInteger, COLUMN_ORIGINFID:ogr.OFTInteger} # Creation du fichier shape createPointsFromCoordList(attribute_dico, points_random_value_dico, sample_points_output, projection_input, format_vector) del attribute_dico del points_random_value_dico pending_event = cyan + "selectSamples() : " + bold + green + "End creation du fichier shape de points d'echantillon. " + endC if debug >=3: print(pending_event) timeLine(path_time_log,pending_event) # 6. EXTRACTION DES POINTS D'ECHANTILLONS #----------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start extraction des points d'echantillon dans l'image..." + endC) # Cas ou l'on a une seule image if len(image_input_list) == 1: # Extract sample image_input = image_input_list[0] command = "otbcli_SampleExtraction -in %s -vec %s -outfield prefix -outfield.prefix.name %s -out %s -field %s" %(image_input, sample_points_output, BAND_NAME, vector_output, name_column) if ram_otb > 0: command += " -ram %d" %(ram_otb) if debug >= 3: print(command) exitCode = os.system(command) if exitCode != 0: raise NameError(cyan + "selectSamples() : " + bold + red + "An error occured during otbcli_SampleExtraction command. See error message above." + endC) # Cas de plusieurs imagettes else : # Le repertoire de sortie repertory_output = os.path.dirname(vector_output) # Initialisation de la liste pour le multi-threading et la liste de l'ensemble des echantions locaux thread_list = [] vector_local_output_list = [] # Obtenir l'emprise des images d'entrées pour redecouper le vecteur d'echantillon d'apprentissage pour chaque image for image_input in image_input_list : # Definition des fichiers sur emprise local file_name = os.path.splitext(os.path.basename(image_input))[0] emprise_local_sample = repertory_output + os.sep + file_name + SUFFIX_SAMPLE + extension_vector vector_sample_local_output = repertory_output + os.sep + file_name + SUFFIX_VALUE + extension_vector vector_local_output_list.append(vector_sample_local_output) # Gestion sans thread... #SampleLocalExtraction(image_input, sample_points_output, emprise_local_sample, vector_sample_local_output, name_column, BAND_NAME, ram_otb, format_vector, extension_vector, save_results_intermediate) # Gestion du multi threading thread = threading.Thread(target=SampleLocalExtraction, args=(image_input, sample_points_output, emprise_local_sample, vector_sample_local_output, name_column, BAND_NAME, ram_otb, format_vector, extension_vector, save_results_intermediate)) thread.start() thread_list.append(thread) # Extraction des echantions points des images try: for thread in thread_list: thread.join() except: print(cyan + "selectSamples() : " + bold + red + "Erreur lors de l'éextaction des valeurs d'echantion : impossible de demarrer le thread" + endC, file=sys.stderr) # Fusion des multi vecteurs de points contenant les valeurs des bandes de l'image fusionVectors(vector_local_output_list, vector_output, format_vector) # Clean des vecteurs point sample local file for vector_sample_local_output in vector_local_output_list : removeVectorFile(vector_sample_local_output) if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "End extraction des points d'echantillon dans l'image." + endC) # 7. CALCUL DES STATISTIQUES SUR LES VALEURS DES POINTS D'ECHANTILLONS SELECTIONNEES #----------------------------------------------------------------------------------- if debug >= 3: print(cyan + "selectSamples() : " + bold + green + "Start calcul des statistiques sur les valeurs des points d'echantillons selectionnees..." + endC) # Si le calcul des statistiques est demandé presence du fichier stat if table_statistics_output != "": # On récupère la liste de données pending_event = cyan + "selectSamples() : " + bold + green + "Encours calcul des statistiques part1... " + endC if debug >=4: print(pending_event) timeLine(path_time_log,pending_event) attribute_name_dico = {} name_field_value_list = [] names_attribut_list = getAttributeNameList(vector_output, format_vector) if debug >=4: print("names_attribut_list = " + str(names_attribut_list)) attribute_name_dico[name_column] = ogr.OFTInteger for name_attribut in names_attribut_list : if BAND_NAME in name_attribut : attribute_name_dico[name_attribut] = ogr.OFTReal name_field_value_list.append(name_attribut) name_field_value_list.sort() res_values_dico = getAttributeValues(vector_output, None, None, attribute_name_dico, format_vector) del attribute_name_dico # Trie des données par identifiant micro classes pending_event = cyan + "selectSamples() : " + bold + green + "Encours calcul des statistiques part2... " + endC if debug >=4: print(pending_event) timeLine(path_time_log,pending_event) data_value_by_micro_class_dico = {} stat_by_micro_class_dico = {} # Initilisation du dico complexe for id_micro in id_micro_list : data_value_by_micro_class_dico[id_micro] = {} stat_by_micro_class_dico[id_micro] = {} for name_field_value in res_values_dico : if name_field_value != name_column : data_value_by_micro_class_dico[id_micro][name_field_value] = [] stat_by_micro_class_dico[id_micro][name_field_value] = {} stat_by_micro_class_dico[id_micro][name_field_value][AVERAGE] = 0.0 stat_by_micro_class_dico[id_micro][name_field_value][STANDARD_DEVIATION] = 0.0 # Trie des valeurs pending_event = cyan + "selectSamples() : " + bold + green + "Encours calcul des statistiques part3... " + endC if debug >=4: print(pending_event) timeLine(path_time_log,pending_event) for index in range(len(res_values_dico[name_column])) : id_micro = res_values_dico[name_column][index] for name_field_value in name_field_value_list : data_value_by_micro_class_dico[id_micro][name_field_value].append(res_values_dico[name_field_value][index]) del res_values_dico # Calcul des statistiques pending_event = cyan + "selectSamples() : " + bold + green + "Encours calcul des statistiques part4... " + endC if debug >=4: print(pending_event) timeLine(path_time_log,pending_event) for id_micro in id_micro_list : for name_field_value in name_field_value_list : try : stat_by_micro_class_dico[id_micro][name_field_value][AVERAGE] = average(data_value_by_micro_class_dico[id_micro][name_field_value]) except: stat_by_micro_class_dico[id_micro][name_field_value][AVERAGE] = 0 try : stat_by_micro_class_dico[id_micro][name_field_value][STANDARD_DEVIATION] = standardDeviation(data_value_by_micro_class_dico[id_micro][name_field_value]) except: stat_by_micro_class_dico[id_micro][name_field_value][STANDARD_DEVIATION] = 0 try : stat_by_micro_class_dico[id_micro][name_field_value][NB_POINTS] = len(data_value_by_micro_class_dico[id_micro][name_field_value]) except: stat_by_micro_class_dico[id_micro][name_field_value][NB_POINTS] = 0 del data_value_by_micro_class_dico # Creation du fichier statistique .csv pending_event = cyan + "selectSamples() : " + bold + green + "Encours calcul des statistiques part5... " + endC if debug >= 4: print(pending_event) timeLine(path_time_log,pending_event) text_csv = " Micro classes ; Champs couche image ; Nombre de points ; Moyenne ; Ecart type \n" writeTextFile(table_statistics_output, text_csv) for id_micro in id_micro_list : for name_field_value in name_field_value_list : # Ecriture du fichier text_csv = " %d " %(id_micro) text_csv += " ; %s" %(name_field_value) text_csv += " ; %d" %(stat_by_micro_class_dico[id_micro][name_field_value][NB_POINTS]) text_csv += " ; %f" %(stat_by_micro_class_dico[id_micro][name_field_value][AVERAGE]) text_csv += " ; %f" %(stat_by_micro_class_dico[id_micro][name_field_value][STANDARD_DEVIATION]) appendTextFileCR(table_statistics_output, text_csv) del name_field_value_list else : if debug >=3: print(cyan + "selectSamples() : " + bold + green + "Pas de calcul des statistiques sur les valeurs des points demander!!!." + endC) del id_micro_list pending_event = cyan + "selectSamples() : " + bold + green + "End calcul des statistiques sur les valeurs des points d'echantillons selectionnees. " + endC if debug >= 3: print(pending_event) timeLine(path_time_log,pending_event) # 8. SUPRESSION DES FICHIERS INTERMEDIAIRES #------------------------------------------ if not save_results_intermediate: if os.path.isfile(sample_points_output) : removeVectorFile(sample_points_output) print(cyan + "selectSamples() : " + bold + green + "FIN DE LA SELECTION DE POINTS" + endC) # Mise à jour du Log ending_event = "selectSamples() : Select points in raster mask macro input ending : " timeLine(path_time_log,ending_event) return