def physiocap_creer_donnees_resultats(self, dialogue, laProjection, EXT_CRS_SHP, EXT_CRS_PRJ, details="NO", histogrammes="NO", recursif="NO"): """ Récupération des paramètres saisies et creation de l'arbre "source" "texte" et du fichier "resultats" Ce sont les résultats de l'analyse filtration des données brutes""" # Récupérer les paramètres saisies Repertoire_Donnees_Brutes = dialogue.lineEditDirectoryPhysiocap.text( ) #___recuperer le repertoire des donnes brutes Repertoire_Donnees_Cibles = dialogue.lineEditDirectoryFiltre.text( ) #___recuperer le repertoire cible ou enregistrer les resultats Nom_Projet = dialogue.lineEditProjet.text( ) #___recuperer le nom de projet mindiam = float(dialogue.spinBoxMinDiametre.value() ) #___recuperer la valeur de diametre min maxdiam = float(dialogue.spinBoxMaxDiametre.value() ) #___recuperer le valeur de diametre max max_sarments_metre = float(dialogue.spinBoxMaxSarmentsParMetre.value( )) #___recuperer la valeur du nombre de sarments max par metre if details == "YES": #___Execute si details sont demandes interrangs = float(dialogue.spinBoxInterrangs.value() ) #___recuperer la valeur d interrangs interceps = float(dialogue.spinBoxInterceps.value() ) #___recuperer la valeur d interceps hauteur = float(dialogue.spinBoxHauteur.value() ) #___recuperer la valeur d hauteur densite = float(dialogue.doubleSpinBoxDensite.value() ) #___recuperer la valeur de densite leCepage = dialogue.fieldComboCepage.currentText( ) #___recuperer la valeur de Cepage laTaille = dialogue.fieldComboTaille.currentText( ) #___recuperer la valeur de Taille # Vérification de l'existance ou création du répertoire projet chemin_projet = os.path.join(Repertoire_Donnees_Cibles, Nom_Projet) if not (os.path.exists(chemin_projet)): try: os.mkdir( chemin_projet ) #___ si le repertoire projet n existe pas--> le creer except: raise physiocap_exception_rep(Nom_Projet) else: # Le répertoire existant est renommé en (+1) try: chemin_projet = physiocap_rename_create_dir( chemin_projet ) #___ si le repertoire projet existe deja--> le renommer en ajoutant des nums a la fin du nom de dossier except: raise physiocap_exception_rep(chemin_projet) # Stocker dans la fenetre de synthese le nom du projet chemin_base_projet = os.path.basename(chemin_projet) dialogue.lineEditDernierProjet.setText( chemin_base_projet ) #___ Ecrire dans l onglet Synthese le dernier nom de projet dialogue.settings = QSettings(PHYSIOCAP_NOM, PHYSIOCAP_NOM) dialogue.settings.setValue( "Physiocap/dernier_repertoire", chemin_base_projet ) #___definir les valeurs des variables : derneir_repertoire physiocap_log( self.trUtf8( "** {0} Début du traitement pour le projet Physiocap {1}").\ format( PHYSIOCAP_UNI, chemin_base_projet)) physiocap_log( self.trUtf8( "Paramètres pour filtrer les diamètres min : {0} max : {1}").\ format( str( mindiam), str( maxdiam))) # Progress BAR 2 % dialogue.progressBar.setValue(2) # Verification de l'existance ou création du répertoire des sources MID et fichier csv chemin_sources = os.path.join( chemin_projet, REPERTOIRE_SOURCES ) #___recuperer le chemin des Fichiers MID : fichiers sources if not (os.path.exists(chemin_sources)): try: os.mkdir(chemin_sources ) #___si le dossier n existe pas , le creer??? except: raise physiocap_exception_rep(REPERTOIRE_SOURCES) # Fichier de concaténations CSV des résultats bruts nom_court_csv_concat = Nom_Projet + SUFFIXE_BRUT_CSV #___construiree le nom de fichier de concatenation csv = nomProjet_RAW.csv try: nom_csv_concat, csv_concat = physiocap_open_file( nom_court_csv_concat, chemin_sources, "w") #___ creer/ouvrir le fichier en ecriture except physiocap_exception_fic as e: raise physiocap_exception_csv(nom_court_csv_concat) # Création du fichier concaténé nom_fichiers_recherches = os.path.join( Repertoire_Donnees_Brutes, EXTENSION_MID) #___construire le chemin d acces au fichiers MID # Assert le nombre de MID > 0 # le Tri pour retomber dans l'ordre de Physiocap_V8 if (recursif == "YES"): # On appelle la fonction de recherche récursive listeTriee = physiocap_look_for_MID( Repertoire_Donnees_Brutes, "YES", REPERTOIRE_SOURCES ) #___ lise = recuperer tous les fichiers dans le repertoire de donnes brutes avec l extention .MID else: # Non recursif listeTriee = sorted(glob.glob( nom_fichiers_recherches)) #___Trier les noms de fichiers if len( listeTriee ) == 0: #___ exception s il y a pas de fichiers MID dans le repertoire de donnes brutes raise physiocap_exception_no_mid() # Verification si plus de 10 MIDs if len(listeTriee) >= 15: # Beaucoup de MIDs Poser une question si cancel, on stoppe uMsg = self.trUtf8( "Plus de 15 fichier MIDs sont à analyser. Temps de traitement > à 1 minute. Voulez-vous continuer ?" ) #___ afficher le message si le nombre des fichires depasse 15 if (physiocap_question_box(self, uMsg)): pass #___ si arret non demande --> rien faire else: # Arret demandé raise physiocap_exception_stop_user( ) #___ si l arret est demande par l utilisateur for mid in listeTriee: try: shutil.copyfileobj( open(mid, "r"), csv_concat ) #___ copier les fichiers MID dand le fichier de concatenation csv # et copie des MID nom_cible = os.path.join(chemin_sources, os.path.basename(mid)) if os.path.exists(nom_cible): nouveau_long = physiocap_rename_existing_file(nom_cible) shutil.copyfile( mid, nouveau_long ) #___si le fihciers MID existe deja creer un autre en renommant+1 else: shutil.copy( mid, chemin_sources ) #___copier les fichiers MID dand le repertoire fichiers_source except: raise physiocap_exception_mid(mid) csv_concat.close() #___ close file handler #___verifier si le fichier de concaténation des données n'est pas vide if os.path.getsize(nom_csv_concat) == 0: uMsg = self.trUtf8( "Le fichier {0} a une taille nulle !").\ format( nom_court_csv_concat) physiocap_message_box(self, uMsg) return physiocap_error(self, uMsg) # Création la première partie du fichier de synthèse fichier_resultat_analyse = chemin_base_projet + SEPARATEUR_ + FICHIER_RESULTAT nom_fichier_synthese, fichier_synthese = physiocap_open_file( fichier_resultat_analyse, chemin_projet, "w") fichier_synthese.write("SYNTHESE PHYSIOCAP\n\n") fichier_synthese.write("Générée le : ") a_time = time.strftime("%d/%m/%y %H:%M\n", time.localtime()) fichier_synthese.write(a_time) fichier_synthese.write("Répertoire de base ") fichier_synthese.write(chemin_base_projet.encode("Utf-8") + "\n") fichier_synthese.write( "Nom des MID \t\t Date et heures\n=>Nb. Valeurs brutes\tVitesse km/h" ) if (CENTROIDES == "YES"): fichier_synthese.write("\nCentroïdes") fichier_synthese.write("\n") info_mid = physiocap_list_MID(Repertoire_Donnees_Brutes, listeTriee) for all_info in info_mid: info = all_info.split(";") fichier_synthese.write( str(info[0]) + "\t" + str(info[1]) + "->" + str(info[2]) + "\n") # une seule décimale pour vitesse fichier_synthese.write("=>\t{0}\t{1:.1f}".format( info[3], float(info[4]))) if (CENTROIDES == "YES"): # Centroides fichier_synthese.write("\n" + str(info[5]) + "--" + str(info[6])) fichier_synthese.write("\n") ## nom_mid = "" ## for fichier_mid in listeTriee: ## nom_mid = nom_mid + os.path.basename( fichier_mid) + " & " ## fichier_synthese.write("Liste des fichiers MID : " + nom_mid[:-3] + "\n") ## physiocap_log( "Liste des MID : " + nom_mid[:-3]) #___Nadia___ Création du fichier de sortie csv fichier_resultat_CSV = chemin_base_projet + SEPARATEUR_ + FICHIER_RESULTAT_CSV nom_fichier_synthese_CSV, fichier_synthese_CSV = physiocap_open_file( fichier_resultat_CSV, chemin_projet, "w") dialogue.settings.setValue("Physiocap/chemin_fichier_synthese_CSV", nom_fichier_synthese_CSV) # Progress BAR 5 % dialogue.progressBar.setValue(5) physiocap_log( self.trUtf8("Fin de la création csv et début de synthèse") ) #___ fin ecriture de la permiere partie du fichiers de synthese # Verification de l'existance ou création du répertoire textes chemin_textes = os.path.join(chemin_projet, REPERTOIRE_TEXTES) if not (os.path.exists(chemin_textes)): try: os.mkdir( chemin_textes ) #___si le repertoire des fichers_texte(resultats) n existe pas --> le creer except: raise physiocap_exception_rep(REPERTOIRE_TEXTES) # Ouverture du fichier des diamètres nom_court_fichier_diametre = "diam" + SUFFIXE_BRUT_CSV #___ fichier diam_RAW.csv nom_data_histo_diametre, data_histo_diametre = physiocap_open_file( nom_court_fichier_diametre, chemin_textes ) #___ Creer ou detruit et re-cree un fichier diam_RAW.csv # Appel fonction de creation de fichier nom_court_fichier_sarment = "nbsarm" + SUFFIXE_BRUT_CSV #___fichier nbsarm_RAW.csv nom_data_histo_sarment, data_histo_sarment = physiocap_open_file( nom_court_fichier_sarment, chemin_textes ) #___ Creer ou detruit et re-cree un fichier nbsarm_RAW.csv # Todo: V3 ? Supprimer le fichier erreur nom_fichier_erreur, erreur = physiocap_open_file( "erreurs.csv", chemin_textes) # ouverture du fichier source csv_concat = open( nom_csv_concat, "r" ) #___ Ouverture du fichier concatenation et verification s il ya des erreurs # Appeler la fonction de vérification du format du fichier csv # Si plus de 20 % d'erreur exception est monté try: pourcentage_erreurs = physiocap_assert_csv(self, csv_concat, erreur) if (pourcentage_erreurs > TAUX_LIGNES_ERREUR): fichier_synthese.write( "\nTrop d'erreurs dans les données brutes") # Todo : V3 question selon le taux de lignes en erreur autorisées #raise physiocap_exception_err_csv( pourcentage_erreurs) except: raise # Progress BAR 10 % dialogue.progressBar.setValue(10) fichier_synthese.write("\n\nPARAMETRES SAISIS " ) #___ Deuxieme partie du fichier de synthese if os.path.getsize( nom_csv_concat ) == 0: #___ si le fichier concatention est vide, raise error uMsg = self.trUtf8( "Le fichier {0} a une taille nulle !").\ format( nom_court_csv_concat) physiocap_message_box(self, uMsg) return physiocap_error(self, uMsg) # ouverture du fichier source csv_concat = open(nom_csv_concat, "r") # Appeler la fonction de traitement if histogrammes == "YES": #___ si les histogrammes sont demandes --> appeler la fonction qui fait le traitement ################# physiocap_fichier_histo(self, csv_concat, data_histo_diametre, data_histo_sarment, erreur) ################# # Fermerture des fichiers data_histo_diametre.close() data_histo_sarment.close() csv_concat.close() erreur.close() # Progress BAR 12 % dialogue.progressBar.setValue(12) # Verification de l'existance chemin_histos = os.path.join(chemin_projet, REPERTOIRE_HISTOS) if not (os.path.exists(chemin_histos)): try: os.mkdir( chemin_histos ) #___ si le dossier histogrammes n existe pas --> le creer except: raise physiocap_exception_rep(REPERTOIRE_HISTOS) if histogrammes == "YES": # creation d'un histo nom_data_histo_sarment, data_histo_sarment = physiocap_open_file( nom_court_fichier_sarment, chemin_textes, 'r') nom_histo_sarment, histo_sarment = physiocap_open_file( FICHIER_HISTO_SARMENT, chemin_histos) name = nom_histo_sarment physiocap_tracer_histo( data_histo_sarment, name, 0, 50, "SARMENT au m", "FREQUENCE en %", "HISTOGRAMME NBSARM AVANT TRAITEMENT" ) #___appel de la fonction qui trace l histogramme NBSARM AVANT TRAITEMENT histo_sarment.close() nom_data_histo_diametre, data_histo_diametre = physiocap_open_file( nom_court_fichier_diametre, chemin_textes, 'r') nom_histo_diametre, histo_diametre = physiocap_open_file( FICHIER_HISTO_DIAMETRE, chemin_histos) name = nom_histo_diametre physiocap_tracer_histo( data_histo_diametre, name, 0, 30, "DIAMETRE en mm", "FREQUENCE en %", "HISTOGRAMME DIAMETRE AVANT TRAITEMENT" ) #___appel de la fonction qui trace l histogramme DIAMETRE AVANT TRAITEMENT histo_diametre.close() physiocap_log( self.trUtf8("Fin de la création des histogrammes bruts")) else: physiocap_log(self.trUtf8("Pas de création des histogrammes")) # Progress BAR 15 % dialogue.progressBar.setValue(15) # Création des csv nom_court_csv_sans_0 = Nom_Projet + SEPARATEUR_ + "OUT.csv" #___creation du fichier NomProjet_OUT.csv --> fichier sans zeros nom_csv_sans_0, csv_sans_0 = physiocap_open_file( nom_court_csv_sans_0, chemin_textes) nom_court_csv_avec_0 = Nom_Projet + SEPARATEUR_ + "OUT0.csv" #___creation du fichier NomProjet_OUT0.csv --> fichier avec zeros nom_csv_avec_0, csv_avec_0 = physiocap_open_file( nom_court_csv_avec_0, chemin_textes) nom_court_fichier_diametre_filtre = "diam_FILTERED.csv" #___diam_FILTERED.csv nom_fichier_diametre_filtre, diametre_filtre = physiocap_open_file( nom_court_fichier_diametre_filtre, chemin_textes) # Ouverture du fichier source et re ouverture du ficheir erreur csv_concat = open(nom_csv_concat, "r") erreur = open(nom_fichier_erreur, "a") # Filtrage des données Physiocap ################# if details == "NO": #___ si les details ne sont pas demandes--> donner des valeurs par defaut pour les parametres details interrangs = 1 interceps = 1 densite = 1 hauteur = 1 retour_filtre = physiocap_filtrer( dialogue, csv_concat, csv_sans_0, csv_avec_0, \ diametre_filtre, nom_fichier_synthese, erreur, \ mindiam, maxdiam, max_sarments_metre, details, interrangs, interceps, densite, hauteur)#___*********Appel de la fonction physiocap_filtrer de Physiocap_CIVC pour remplir le ficier csv qui va etre utilse pour le creation du shapefile********** ################# # Fermeture du fichier destination csv_sans_0.close() csv_avec_0.close() diametre_filtre.close() erreur.close() # Fermerture du fichier source csv_concat.close() # Todo : V3 ? Gerer cette erreur par exception if retour_filtre != 0: uMsg = self.trUtf8( "Erreur bloquante : problème lors du filtrage des données de {0}").\ format( nom_court_csv_concat) return physiocap_error(self, uMsg) # Progress BAR 60 % dialogue.progressBar.setValue(41) if histogrammes == "YES": #___ si histogrammes sont demandes --> tracer le troisieme : DIAMETRE APRES TRAITEMENT # Histo apres filtration nom_fichier_diametre_filtre, diametre_filtre = physiocap_open_file( nom_court_fichier_diametre_filtre, chemin_textes, "r") nom_histo_diametre_filtre, histo_diametre = physiocap_open_file( FICHIER_HISTO_DIAMETRE_FILTRE, chemin_histos) physiocap_tracer_histo( diametre_filtre, nom_histo_diametre_filtre, 0, 30, \ "DIAMETRE en mm", "FREQUENCE en %", "HISTOGRAMME DIAMETRE APRES TRAITEMENT") diametre_filtre.close() physiocap_log( self.trUtf8("Fin de la création de l'histogramme filtré")) # On écrit dans le fichiers résultats les paramètres du modéle #___ 3 eme partie du fichier de synthese fichier_synthese = open(nom_fichier_synthese, "a") if details == "NO": fichier_synthese.write("\nAucune information parcellaire saisie\n") else: fichier_synthese.write("\n") msg = "Cépage : %s \n" % leCepage.encode("Utf-8") fichier_synthese.write(msg) fichier_synthese.write("Type de taille : %s\n" % laTaille) fichier_synthese.write("Hauteur de végétation : %s cm\n" % hauteur) fichier_synthese.write("Densité des bois de taille : %s \n" % densite) fichier_synthese.write("Ecartement entre rangs : %s cm\n" % interrangs) fichier_synthese.write("Ecartement entre ceps : %s cm\n" % interceps) fichier_synthese.write("\n") fichier_synthese.write( "Nombre de sarments max au mètre linéaire: %s \n" % max_sarments_metre) fichier_synthese.write("Diamètre minimal : %s mm\n" % mindiam) fichier_synthese.write("Diamètre maximal : %s mm\n" % maxdiam) fichier_synthese.close() # Progress BAR 42% dialogue.progressBar.setValue(42) # Verification de l'existance ou création du répertoire des sources MID et fichier csv chemin_shapes = os.path.join(chemin_projet, REPERTOIRE_SHAPEFILE) if not (os.path.exists(chemin_shapes)): try: os.mkdir( chemin_shapes ) #____si le dossier shapefile n existe pas --> le creer dialogue.settings.setValue("Physiocap/chemin_shapes", chemin_shapes) except: raise physiocap_exception_rep(REPERTOIRE_SHAPEFILE) # Création des shapes sans 0 nom_court_shape_sans_0 = Nom_Projet + NOM_POINTS + EXT_CRS_SHP #___ construire ele nom du fichier NomProjet_POINTS.shp nom_shape_sans_0 = os.path.join(chemin_shapes, nom_court_shape_sans_0) dialogue.settings.setValue("Physiocap/nom_shape_sans_0", nom_shape_sans_0) nom_court_prj_sans_0 = Nom_Projet + NOM_POINTS + EXT_CRS_PRJ nom_prj_sans_0 = os.path.join(chemin_shapes, nom_court_prj_sans_0) # Si le shape existe dejà il faut le détruire if os.path.isfile(nom_shape_sans_0): physiocap_log( self.trUtf8("Le shape file existant déjà, il est détruit.")) os.remove(nom_shape_sans_0) # cas sans 0, on demande la synthese en passant le nom du fichier retour = physiocap_csv_vers_shapefile(dialogue, 45, nom_csv_sans_0, nom_shape_sans_0, nom_prj_sans_0, laProjection, nom_fichier_synthese, details) if retour != 0: return physiocap_error( self, self.trUtf8(\ "Erreur bloquante : problème lors de la création du shapefile {0}").\ format(str ( nom_court_shape_sans_0))) # Progress BAR 65 % dialogue.progressBar.setValue(65) # Création des shapes avec 0 nom_court_shape_avec_0 = Nom_Projet + NOM_POINTS + EXTENSION_POUR_ZERO + EXT_CRS_SHP nom_shape_avec_0 = os.path.join(chemin_shapes, nom_court_shape_avec_0) nom_court_prj_avec_0 = Nom_Projet + NOM_POINTS + EXTENSION_POUR_ZERO + EXT_CRS_PRJ nom_prj_avec_0 = os.path.join(chemin_shapes, nom_court_prj_avec_0) # Si le shape existe dejà il faut le détruire if os.path.isfile(nom_shape_avec_0): physiocap_log( self.trUtf8("Le shape file existant déjà, il est détruit.")) os.remove(nom_shape_avec_0) # cas avec 0, pas de demande de synthese retour = physiocap_csv_vers_shapefile(dialogue, 65, nom_csv_avec_0, nom_shape_avec_0, nom_prj_avec_0, laProjection, "NO", details) if retour != 0: return physiocap_error( self, self.trUtf8( \ "Erreur bloquante : problème lors de la création du shapefile {0}").\ format( str ( nom_court_shape_avec_0))) # Progress BAR 95% dialogue.progressBar.setValue(95) # Creer un groupe pour cette analyse # Attention il faut qgis > 2.4 metadata demande V2.4 mini root = QgsProject.instance().layerTreeRoot() # Nommmer le groupe chemin_base_projet sous_groupe = root.addGroup(chemin_base_projet) # Récupérer des styles pour chaque shape dir_template = dialogue.fieldComboThematiques.currentText() # Affichage des différents shapes dans Qgis SHAPE_A_AFFICHER = [] qml_is = "" if dialogue.checkBoxDiametre.isChecked(): qml_is = dialogue.lineEditThematiqueDiametre.text().strip( '"') + EXTENSION_QML # Pas de choix du shape, car il faut pour Inter un diam sans 0 SHAPE_A_AFFICHER.append((nom_shape_sans_0, 'DIAMETRE mm', qml_is)) if dialogue.checkBoxSarment.isChecked(): qml_is = dialogue.lineEditThematiqueSarment.text().strip( '"') + EXTENSION_QML # Choix du shape à afficher if (dialogue.fieldComboShapeSarment.currentIndex() == 0): SHAPE_A_AFFICHER.append( (nom_shape_sans_0, 'SARMENT par m', qml_is)) else: SHAPE_A_AFFICHER.append( (nom_shape_avec_0, 'SARMENT par m', qml_is)) if dialogue.checkBoxBiomasse.isChecked(): qml_is = dialogue.lineEditThematiqueBiomasse.text().strip( '"') + EXTENSION_QML # Choix du shape à afficher if (dialogue.fieldComboShapeBiomasse.currentIndex() == 0): SHAPE_A_AFFICHER.append((nom_shape_sans_0, 'BIOMASSE', qml_is)) else: SHAPE_A_AFFICHER.append((nom_shape_avec_0, 'BIOMASSE', qml_is)) if dialogue.checkBoxVitesse.isChecked(): qml_is = dialogue.lineEditThematiqueVitesse.text().strip( '"') + EXTENSION_QML # Choix du shape à afficher if (dialogue.fieldComboShapeVitesse.currentIndex() == 0): SHAPE_A_AFFICHER.append( (nom_shape_sans_0, 'VITESSE km/h', qml_is)) else: SHAPE_A_AFFICHER.append( (nom_shape_avec_0, 'VITESSE km/h', qml_is)) for shapename, titre, un_template in SHAPE_A_AFFICHER: ## if ( dialogue.fieldComboFormats.currentText() == POSTGRES_NOM ): ## uri_nom = physiocap_quel_uriname( dialogue) ## #physiocap_log( u"URI nom : " + str( uri_nom)) ## uri_modele = physiocap_get_uri_by_layer( dialogue, uri_nom ) ## if uri_modele != None: ## uri_connect, uri_deb, uri_srid, uri_fin = physiocap_tester_uri( dialogue, uri_modele) ## nom_court_shp = os.path.basename( shapename) ## #TABLES = "public." + nom_court_shp ## uri = uri_deb + uri_srid + \ ## " key='gid' type='POINTS' table=" + nom_court_shp[ :-4] + " (geom) sql=" ## ## "dbname='testpostgis' host='localhost' port='5432'" + \ ## ## " user='******' password='******' SRID='2154'" + \ ## ## " key='gid' type='POINTS' table=" + nom_court_shp[ :-4] + " (geom) sql=" ## ## physiocap_log ( "Création dans POSTGRES : >>" + uri + "<<") ## ## vectorPG = QgsVectorLayer( uri, titre, POSTGRES_NOM) ## else: ## aText = self.trUtf8( "Pas de connecteur vers Postgres : {0}. On continue avec des shapefiles").\ ## format ((str( uri_nom))) ## physiocap_log( aText) ## # Remettre le choix vers ESRI shape file ## dialogue.fieldComboFormats.setCurrentIndex( 0) #physiocap_log( u"Physiocap : Afficher layer ") vector = QgsVectorLayer(shapename, titre, 'ogr') QgsMapLayerRegistry.instance().addMapLayer(vector, False) # Ajouter le vecteur dans un groupe vector_node = sous_groupe.addLayer(vector) le_template = os.path.join(dir_template, un_template) if (os.path.exists(le_template)): #physiocap_log( u"Physiocap le template : " + os.path.basename( le_template)) vector.loadNamedStyle(le_template) # Créer un ficher de sortie CSV de synthese___Nadia___ retour_gen_cont = generer_contour_fin(dialogue, nom_fichier_synthese_CSV, nom_shape_sans_0, sous_groupe) if retour_gen_cont != 0: return physiocap_error(self, self.trUtf8( \ "Erreur bloquante : problème lors de la génération du contour ")) # Fichier de synthese dans la fenetre resultats fichier_synthese = open(nom_fichier_synthese, "r") while True: ligne = fichier_synthese.readline() # lit les lignes 1 à 1 physiocap_write_in_synthese(dialogue, ligne) if not ligne: fichier_synthese.close break # Progress BAR 95 % dialogue.progressBar.setValue(95) # Mettre à jour les histogrammes dans fenetre resultat if histogrammes == "YES": if (dialogue.label_histo_sarment.setPixmap( QPixmap(nom_histo_sarment))): physiocap_log( self.trUtf8("Physiocap histogramme sarment chargé")) if (dialogue.label_histo_diametre_avant.setPixmap( QPixmap(nom_histo_diametre))): physiocap_log( self.trUtf8("Physiocap histogramme diamètre chargé")) if (dialogue.label_histo_diametre_apres.setPixmap( QPixmap(nom_histo_diametre_filtre))): physiocap_log( self.trUtf8( "Physiocap histogramme diamètre filtré chargé")) else: dialogue.label_histo_sarment.setPixmap( QPixmap(FICHIER_HISTO_NON_CALCULE)) dialogue.label_histo_diametre_avant.setPixmap( QPixmap(FICHIER_HISTO_NON_CALCULE)) dialogue.label_histo_diametre_apres.setPixmap( QPixmap(FICHIER_HISTO_NON_CALCULE)) physiocap_log(self.trUtf8("Physiocap pas d'histogramme calculé")) # Progress BAR 100 % dialogue.progressBar.setValue(100) # Fin physiocap_log ( self.trUtf8( "** {0} a affiché des couches dans le groupe {1}").\ format( PHYSIOCAP_UNI, chemin_base_projet)) physiocap_fill_combo_poly_or_point(dialogue) #physiocap_log ( u"Mise à jour des poly et points") return 0
def physiocap_moyenne_InterParcelles( self, dialogue): """Verification et requete spatiale""" physiocap_log( self.trUtf8( "== Début du calcul des moyennes à partir de vos contours" )) # QT Confiance repertoire_data = dialogue.lineEditDirectoryPhysiocap.text() # Attention peut être non renseigné repertoire_projet = dialogue.lineEditDernierProjet.text() if ((repertoire_data == "") or ( not os.path.exists( repertoire_data))): aText = self.trUtf8( "Pas de répertoire de données brutes spécifié" ) physiocap_error( self, aText) return physiocap_message_box( dialogue, aText, "information") details = "NO" if dialogue.checkBoxInfoVignoble.isChecked(): details = "YES" # Récupérer des styles pour chaque shape dans Affichage #dir_template = os.path.join( os.path.dirname(__file__), 'modeleQgis') dir_template = dialogue.fieldComboThematiques.currentText() qml_is = dialogue.lineEditThematiqueInterMoyenne.text().strip('"') + EXTENSION_QML le_template_moyenne = os.path.join( dir_template, qml_is) qml_is = dialogue.lineEditThematiqueInterPoints.text().strip('"') + EXTENSION_QML le_template_point = os.path.join( dir_template, qml_is) # Pour polygone de contour nom_complet_poly = dialogue.comboBoxPolygone.currentText().split( SEPARATEUR_NOEUD) if ( len( nom_complet_poly) != 2): aText = self.trUtf8( "Le polygone de contour n'est pas choisi.") physiocap_error( self, aText) aText = aText + "\n" + self.trUtf8( "Avez-vous créer votre shapefile de contour ?") return physiocap_message_box( dialogue, aText) nom_poly = nom_complet_poly[ 0] id_poly = nom_complet_poly[ 1] vecteur_poly = physiocap_get_layer_by_ID( id_poly) leChampPoly = dialogue.fieldComboContours.currentText() # Pour les points nom_complet_point = dialogue.comboBoxPoints.currentText().split( SEPARATEUR_NOEUD) if ( len( nom_complet_point) != 2): aText = self.trUtf8( "Le shape de points n'est pas choisi. ") aText = aText + self.trUtf8( "Créer une nouvelle instance de projet - bouton OK - ") aText = aText + self.trUtf8( "avant de faire votre calcul de Moyenne Inter Parcellaire") physiocap_error( self, aText, "CRITICAL") return physiocap_message_box( dialogue, aText, "information" ) nom_noeud_arbre = nom_complet_point[ 0] id_point = nom_complet_point[ 1] vecteur_point = physiocap_get_layer_by_ID( id_point) # Verification de l'arbre root = QgsProject.instance().layerTreeRoot( ) un_groupe = root.findGroup( nom_noeud_arbre) if ( not isinstance( un_groupe, QgsLayerTreeGroup)): aText = self.trUtf8( "Le projet {0} n'existe pas. ").\ format( nom_noeud_arbre) aText = aText + self.trUtf8( "Créer une nouvelle instance de projet - bouton OK - ") aText = aText + self.trUtf8( "avant de faire votre calcul de Moyenne Inter Parcellaire") physiocap_error( self, aText, "CRITICAL") return physiocap_message_box( dialogue, aText, "information" ) # Vérification if ( vecteur_point == None): aText = self.trUtf8( "Le jeu de points choisi n'est pas valide. ") aText = aText + self.trUtf8( "Créer une nouvelle instance de projet - bouton OK - ") aText = aText + self.trUtf8( "avant de faire votre calcul de Moyenne Inter Parcellaire") physiocap_error( self, aText, "CRITICAL") return physiocap_message_box( dialogue, aText, "information" ) if ( vecteur_poly == None) or ( not vecteur_poly.isValid()): aText = self.trUtf8( "Le contour choisi n'est pas valide. ") aText = aText + self.trUtf8( "Créer une nouvelle instance de projet - bouton OK - ") aText = aText + self.trUtf8( "avant de faire votre calcul de Moyenne Inter Parcellaire") physiocap_error( self, aText, "CRITICAL") return physiocap_message_box( dialogue, aText, "information" ) # Verifier SRCs sont les même crs_poly = vecteur_poly.crs().authid() crs_point = vecteur_point.crs().authid() if ( crs_poly != crs_point): mes = self.trUtf8( "Les projections (CRS) des coutours ({0}) et mesures brutes ({1}) sont différentes !").\ format( crs_poly, crs_point) physiocap_error( self, mes) return physiocap_message_box( dialogue, mes,"information") laProjection, EXT_CRS_SHP, EXT_CRS_PRJ, EXT_CRS_RASTER, EPSG_NUMBER = \ physiocap_quelle_projection_demandee(dialogue) crs = QgsCoordinateReferenceSystem( EPSG_NUMBER, QgsCoordinateReferenceSystem.PostgisCrsId) # Verification du repertoire shape pro = vecteur_point.dataProvider() if ( pro.name() == POSTGRES_NOM): # On construit le chemin depuis data/projet... chemin_projet = os.path.join( repertoire_data, nom_noeud_arbre) chemin_shapes = os.path.join( chemin_projet, REPERTOIRE_SHAPEFILE) else: # Assert repertoire shapfile : c'est le repertoire qui contient le vecteur point chemin_shapes = os.path.dirname( unicode( vecteur_point.dataProvider().dataSourceUri() ) ) ; if ( not os.path.exists( chemin_shapes)): raise physiocap_exception_rep( chemin_shapes) # On passe sur les differents contours id = 0 contour_avec_point = 0 les_geoms_poly = [] les_parcelles = [] les_parcelles_ID = [] les_dates_parcelle = [] les_heures_parcelle = [] les_moyennes_vitesse = [] les_moyennes_sarment = [] les_moyennes_diametre = [] les_moyennes_biom = [] les_moyennes_biomgm2 = [] les_moyennes_biomgcep = [] les_moyennes_biomm2 = [] les_moyennes_nbsarmm2 = [] les_moyennes_nbsarcep= [] for un_contour in vecteur_poly.getFeatures(): #iterate poly features id = id + 1 try: un_nom = str( un_contour[ leChampPoly]) #get attribute of poly layer except: un_nom = "PHY_ID_" + str(id) pass physiocap_log ( self.trUtf8( "== Début Inter pour {0} >>>> ").\ format( un_nom)) un_autre_ID = "PHY_ID" + str(id) geom_poly = un_contour.geometry() #get geometry of poly layer # Todo : WT DATA BUG contour : test validé geom_poly #physiocap_log ( "Dans polygone geom multipart : " + str(geom_poly.wkbType())) if geom_poly.wkbType() == QGis.WKBPolygon: physiocap_log ( self.trUtf8( "== Layer (Polygone) simple: {0} ".\ format( un_nom))) elif geom_poly.wkbType() == QGis.WKBMultiPolygon: physiocap_log ( self.trUtf8("== Layer (Polygone) multiple:{0} ".\ format( un_nom))) else: aText = self.trUtf8( "== Cette forme n'est pas un polygone : {0}").\ format( un_nom) physiocap_log( aText) physiocap_error( self, aText) physiocap_message_box( dialogue, aText, "information") continue # on initialise pour ce contour les_geom_point_feat = [] les_dates = [] les_GID = [] les_vitesses = [] les_sarments = [] les_diametres = [] nb_dia = 0 nb_sar = 0 les_biom = [] les_biomgm2 = [] les_biomgcep = [] les_biomm2 = [] les_nbsarmm2 = [] les_nbsarcep= [] i = 0 date_debut = "" heure_fin = "" # Préfiltre dans un rectangle # Récupération des entites qui concerne ce coutours for un_point in vecteur_point.getFeatures(QgsFeatureRequest(). setFilterRect(geom_poly.boundingBox())): # un_point est un feature ! if un_point.geometry().within(geom_poly): # Cas du premier point d'un contour if i == 0: contour_avec_point = contour_avec_point + 1 i = i + 1 try: if i == 2: # Attraper date début date_debut = un_point["DATE"] les_geom_point_feat.append( un_point.geometry().asPoint()) les_dates.append( un_point["DATE"]) les_GID.append( un_point["GID"]) les_vitesses.append( un_point["VITESSE"]) les_sarments.append( un_point["NBSARM"]) les_diametres.append( un_point["DIAM"]) les_biom.append( un_point["BIOM"]) if ( details == "YES"): try: les_biomgm2.append( un_point["BIOMGM2"]) les_biomgcep.append( un_point["BIOMGCEP"]) les_biomm2.append( un_point["BIOMM2"]) les_nbsarmm2.append( un_point["NBSARMM2"]) les_nbsarcep.append( un_point["NBSARCEP"]) except KeyError: # Se remettre en détails non details = "NO" except KeyError: raise physiocap_exception_points_invalid( un_nom) # en sortie de boucle on attrape la derniere heure if i > 10: heure_fin = un_point["DATE"][-8:] nb_dia = len( les_diametres) nb_sar = len( les_sarments) if ( (nb_dia > 0) and ( nb_dia == nb_sar )): moyenne_vitesse = sum(les_vitesses) / len( les_vitesses) moyenne_sar = sum(les_sarments) / nb_sar moyenne_dia = sum(les_diametres) / nb_dia moyenne_biom = sum(les_biom) / len( les_biom) moyenne_biomgm2 = sum(les_biomgm2) / len( les_biom) moyenne_biomgcep = sum(les_biomgcep) / len( les_biom) moyenne_biomm2 = sum(les_biomm2) / len( les_biom) moyenne_nbsarmm2 = sum(les_nbsarmm2) / nb_sar moyenne_nbsarcep = sum(les_nbsarcep) / nb_sar physiocap_log ( self.trUtf8( "== Date : {0}").\ format( date_debut)) physiocap_log ( self.trUtf8( "== Moyenne des sarments : {:6.2f}").\ format( moyenne_sar)) physiocap_log ( self.trUtf8( "== Moyenne des diamètres : {:5.2f}").\ format( moyenne_dia)) physiocap_log ( self.trUtf8( "== Fin Inter pour {0} <<<< ").\ format( un_nom)) #physiocap_log( u"Fin du calcul des moyennes à partir de vos contours" ) # ################### # CRÉATION groupe INTER _ PROJET # ################### if ( contour_avec_point == 1): if un_groupe != None: vignette_projet = nom_noeud_arbre + SEPARATEUR_ + VIGNETTES_INTER vignette_existante = un_groupe.findGroup( vignette_projet) if ( vignette_existante == None ): vignette_group_inter = un_groupe.addGroup( vignette_projet) else: # Si vignette preexiste, on ne recommence pas raise physiocap_exception_vignette_exists( nom_noeud_arbre) chemin_vignettes = os.path.join( chemin_shapes, VIGNETTES_INTER) if not (os.path.exists( chemin_vignettes)): try: os.mkdir( chemin_vignettes) except: raise physiocap_exception_rep( VIGNETTES_INTER) # Création du Shape moyenne et prj # vignette - nom_noeud_arbre + SEPARATEUR_ nom_court_vignette = nom_noeud_arbre + NOM_MOYENNE + un_nom + EXT_CRS_SHP nom_court_prj = nom_noeud_arbre + NOM_MOYENNE + un_nom + EXT_CRS_PRJ #physiocap_log( u"== Vignette court : " + nom_court_vignette ) nom_vignette = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_vignette)) nom_prj = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_prj)) physiocap_moyenne_vers_vignette( crs, EPSG_NUMBER, nom_vignette, nom_prj, geom_poly, un_nom, un_autre_ID, date_debut, heure_fin, moyenne_vitesse, moyenne_sar, moyenne_dia, moyenne_biom, moyenne_biomgm2, moyenne_biomgcep, moyenne_biomm2, moyenne_nbsarmm2, moyenne_nbsarcep, details) # Memorisation de la parcelle du contour et des moyennes les_geoms_poly.append( geom_poly.asPolygon()) les_parcelles.append( un_nom) les_parcelles_ID.append( un_autre_ID) les_dates_parcelle.append( date_debut) les_heures_parcelle.append( heure_fin) les_moyennes_vitesse.append( moyenne_vitesse) les_moyennes_sarment.append( moyenne_sar) les_moyennes_diametre.append( moyenne_dia) les_moyennes_biom.append( moyenne_biom) les_moyennes_biomgm2.append( moyenne_biomgm2) les_moyennes_biomgcep.append( moyenne_biomgcep) les_moyennes_biomm2.append( moyenne_biomm2) les_moyennes_nbsarmm2.append( moyenne_nbsarmm2) les_moyennes_nbsarcep.append( moyenne_nbsarcep) # ################### # CRÉATION point # ################### # point nom_court_point = nom_noeud_arbre + NOM_POINTS + SEPARATEUR_ + un_nom + EXT_CRS_SHP nom_court_point_prj = nom_noeud_arbre + NOM_POINTS + SEPARATEUR_ + un_nom + EXT_CRS_PRJ #physiocap_log( u"== Vignette court : " + nom_court_vignette ) nom_point = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_point)) nom_point_prj = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_point_prj)) physiocap_moyenne_vers_point( crs, EPSG_NUMBER, nom_point, nom_point_prj, les_geom_point_feat, les_GID, les_dates, les_vitesses, les_sarments, les_diametres, les_biom, les_biomgm2, les_biomgcep, les_biomm2, les_nbsarmm2, les_nbsarcep, details) # Affichage dans arbre "vignettes" selon les chack dans onglet Affichage SHAPE_MOYENNE_PAR_CONTOUR = "NO" if dialogue.checkBoxInterMoyennes.isChecked(): SHAPE_MOYENNE_PAR_CONTOUR = "YES" SHAPE_POINTS_PAR_CONTOUR = "NO" if dialogue.checkBoxInterPoints.isChecked(): SHAPE_POINTS_PAR_CONTOUR = "YES" if SHAPE_MOYENNE_PAR_CONTOUR == "YES": vignette_vector = QgsVectorLayer( nom_vignette, nom_court_vignette, 'ogr') if SHAPE_POINTS_PAR_CONTOUR == "YES": points_vector = QgsVectorLayer( nom_point, nom_court_point, 'ogr') if vignette_group_inter != None: if SHAPE_MOYENNE_PAR_CONTOUR == "YES": QgsMapLayerRegistry.instance().addMapLayer( vignette_vector, False) vector_node = vignette_group_inter.addLayer( vignette_vector) if SHAPE_POINTS_PAR_CONTOUR == "YES": QgsMapLayerRegistry.instance().addMapLayer( points_vector, False) # Ajouter le vecteur dans un groupe vector_point_node = vignette_group_inter.addLayer( points_vector) else: # Pas de vignette ... if SHAPE_MOYENNE_PAR_CONTOUR == "YES": QgsMapLayerRegistry.instance().addMapLayer( vignette_vector) if SHAPE_POINTS_PAR_CONTOUR == "YES": QgsMapLayerRegistry.instance().addMapLayer( points_vector) # Mise en action du template if SHAPE_MOYENNE_PAR_CONTOUR == "YES": if ( os.path.exists( le_template_moyenne)): vignette_vector.loadNamedStyle( le_template_moyenne) if SHAPE_POINTS_PAR_CONTOUR == "YES": if ( os.path.exists( le_template_point)): points_vector.loadNamedStyle( le_template_point) else: physiocap_log( self.trUtf8( "== Aucune point dans {0}. Pas de comparaison inter parcellaire").\ format( un_nom)) if ( contour_avec_point == 0): return physiocap_message_box( dialogue, self.trUtf8( "== Aucune point dans {0}. Pas de comparaison inter parcellaire").\ format( self.trUtf8( "vos contours")), "information") else: # On a des parcelles dans le contour avec des moyennes nom_court_du_contour = os.path.basename( vecteur_poly.name() + EXTENSION_SHP) # Inserer "MOYENNES" nom_court_du_contour_moyenne = nom_noeud_arbre + NOM_MOYENNE + nom_court_du_contour nom_court_du_contour_moyenne_prj = nom_court_du_contour_moyenne [:-4] + EXT_CRS_PRJ[ -4:] nom_contour_moyenne = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_du_contour_moyenne)) nom_contour_moyenne_prj = physiocap_rename_existing_file( os.path.join( chemin_vignettes, nom_court_du_contour_moyenne_prj)) physiocap_moyenne_vers_contour( crs, EPSG_NUMBER, nom_contour_moyenne, nom_contour_moyenne_prj, les_geoms_poly, les_parcelles, les_parcelles_ID, les_dates_parcelle, les_heures_parcelle, les_moyennes_vitesse, les_moyennes_sarment, les_moyennes_diametre, les_moyennes_biom, les_moyennes_biomgm2, les_moyennes_biomgcep, les_moyennes_biomm2, les_moyennes_nbsarmm2, les_moyennes_nbsarcep, details) # Affichage du resultat nom_court_affichage = nom_noeud_arbre + SEPARATEUR_ SHAPE_A_AFFICHER = [] if dialogue.checkBoxInterDiametre.isChecked(): nom_affichage = nom_court_affichage + 'DIAMETRE' + SEPARATEUR_ + nom_court_du_contour qml_is = dialogue.lineEditThematiqueInterDiametre.text().strip('"') + EXTENSION_QML SHAPE_A_AFFICHER.append( (nom_affichage, qml_is)) if dialogue.checkBoxInterBiomasse.isChecked(): nom_affichage = nom_court_affichage + 'BIOMASSE' + SEPARATEUR_ + nom_court_du_contour qml_is = dialogue.lineEditThematiqueInterBiomasse.text().strip('"') + EXTENSION_QML SHAPE_A_AFFICHER.append( (nom_affichage, qml_is)) if dialogue.checkBoxInterLibelle.isChecked(): nom_affichage = nom_court_affichage + 'LIBELLE' + SEPARATEUR_ + nom_court_du_contour qml_is = dialogue.lineEditThematiqueInterLibelle.text().strip('"') + EXTENSION_QML SHAPE_A_AFFICHER.append( (nom_affichage, qml_is)) # Afficher ce contour_moyennes dans arbre "projet" k=0 for titre, unTemplate in SHAPE_A_AFFICHER: vector = QgsVectorLayer( nom_contour_moyenne, titre, 'ogr') # On se positionne dans l'arbre if vignette_group_inter != None: QgsMapLayerRegistry.instance().addMapLayer( vector, False) vector_node = vignette_group_inter.addLayer( vector) else: QgsMapLayerRegistry.instance().addMapLayer( vector) le_template = os.path.join( dir_template, unTemplate) if ( os.path.exists( le_template)): #physiocap_log ( u"Physiocap le template : " + os.path.basename( leTemplate) ) vector.loadNamedStyle( le_template) return physiocap_message_box( dialogue, self.trUtf8( "== Fin des traitements inter-parcellaires"), "information")
def physiocap_csv_vers_shapefile( self, progress_barre, csv_name, shape_name, prj_name, laProjection, nom_fichier_synthese = "NO", details = "NO"): """ Creation de shape file à partir des données des CSV Si nom_fichier_synthese n'est pas "NO", on produit les moyennes dans le fichier qui se nomme nom_fichier_synthese Selon la valeur de détails , on crée les 5 premiers ("NO") ou tous les attibuts ("YES") """ crs = None #Préparation de la liste d'arguments x,y,nbsarmshp,diamshp,biomshp,dateshp,vitesseshp= [],[],[],[],[],[],[] nbsarmm2,nbsarcep,biommm2,biomgm2,biomgcep=[],[],[],[],[] un_fic = open( csv_name, "r") lignes = un_fic.readlines() nombre_ligne = len( lignes) un_fic.close() progress_step = int( nombre_ligne / 19) barre = 1 #Lecture des data dans le csv et stockage dans une liste with open(csv_name, "rt") as csvfile: try: r = csv.reader(csvfile, delimiter=";") except NameError: uText = u"Erreur bloquante : module csv n'est pas accessible." physiocap_error( self, uText) return -1 for jj, row in enumerate( r): #skip header if jj > 0: # ON fait avancer la barre de progression de 19 points if ( jj > progress_step * barre): barre = barre + 1 progress_barre = progress_barre + 1 self.progressBar.setValue( progress_barre) crs = None if ( laProjection == "L93"): x.append(float(row[2])) y.append(float(row[3])) crs = QgsCoordinateReferenceSystem(EPSG_NUMBER_L93, QgsCoordinateReferenceSystem.PostgisCrsId) if ( laProjection == "GPS"): x.append(float(row[0])) y.append(float(row[1])) crs = QgsCoordinateReferenceSystem(EPSG_NUMBER_GPS, QgsCoordinateReferenceSystem.PostgisCrsId) nbsarmshp.append(float(row[4])) diamshp.append(float(row[5])) biomshp.append(float(row[6])) dateshp.append(str(row[7])) vitesseshp.append(float(row[8])) if details == "YES": # Niveau de detail demandé # assert sur len row if len(row) != 14: return physiocap_error( self, u"Le nombre de colonnes :" + str( len(row)) + u" du cvs ne permet pas le calcul détaillé") nbsarmm2.append(float(row[9])) nbsarcep.append(float(row[10])) biommm2.append(float(row[11])) biomgm2.append(float(row[12])) biomgcep.append(float(row[13])) # Prepare les attributs les_champs = QgsFields() # V1.0 Ajout du GID ## les_champs.append( QgsField("gid", QVariant.Int, "integer", 10)) ## les_champs.append( QgsField("date", QVariant.String, "string", 25)) ## les_champs.append( QgsField("vitesse", QVariant.Double, "double", 10,2)) ## les_champs.append(QgsField("nbsarm", QVariant.Double, "double", 10,2)) ## les_champs.append(QgsField("diam", QVariant.Double, "double", 10,2)) ## les_champs.append(QgsField("biom", QVariant.Double,"double", 10,2)) ## if details == "YES": ## # Niveau de detail demandé ## les_champs.append(QgsField("nbsarmm2", QVariant.Double,"double", 10,2)) ## les_champs.append(QgsField("nbsarmcep", QVariant.Double,"double", 10,2)) ## les_champs.append(QgsField("biomm2", QVariant.Double,"double", 10,2)) ## les_champs.append(QgsField("biomgm2", QVariant.Double,"double", 10,2)) ## les_champs.append(QgsField("biomgcep", QVariant.Double,"double", 10,2)) ## # V1.0 Ajout du GID les_champs.append( QgsField("GID", QVariant.Int, "integer", 10)) les_champs.append( QgsField("DATE", QVariant.String, "string", 25)) les_champs.append( QgsField("VITESSE", QVariant.Double, "double", 10,2)) les_champs.append(QgsField("NBSARM", QVariant.Double, "double", 10,2)) les_champs.append(QgsField("DIAM", QVariant.Double, "double", 10,2)) les_champs.append(QgsField("BIOM", QVariant.Double,"double", 10,2)) if details == "YES": # Niveau de detail demandé les_champs.append(QgsField("NBSARMM2", QVariant.Double,"double", 10,2)) les_champs.append(QgsField("NBSARCEP", QVariant.Double,"double", 10,2)) les_champs.append(QgsField("BIOMM2", QVariant.Double,"double", 10,2)) les_champs.append(QgsField("BIOMGM2", QVariant.Double,"double", 10,2)) les_champs.append(QgsField("BIOMGCEP", QVariant.Double,"double", 10,2)) # Creation du Shape writer = QgsVectorFileWriter( shape_name, "utf-8", les_champs, QGis.WKBPoint, crs , "ESRI Shapefile") #Ecriture du shp for j,k in enumerate(x): feat = QgsFeature() feat.setGeometry( QgsGeometry.fromPoint(QgsPoint(k,y[j]))) #écrit la géométrie if details == "YES": # Ecrit tous les attributs feat.setAttributes( [ j, dateshp[j], vitesseshp[j], nbsarmshp[j], diamshp[j], biomshp[j], nbsarmm2[j], nbsarcep[j], biommm2[j], biomgm2[j], biomgcep[j]]) else: # Ecrit les 5 premiers attributs feat.setAttributes( [ j, dateshp[j], vitesseshp[j], nbsarmshp[j], diamshp[j], biomshp[j]]) # Ecrit le feature writer.addFeature( feat) # Flush vector del writer # Cas PG ## if (self.fieldComboFormats.currentText() == POSTGRES_NOM ): ## # Todo ; fonction physiocap_creer_PG_par_copie_vecteur( uri_nom, shape_modele) ## # Vérifier si une connexion Physiocap existe ## uri_nom = physiocap_quel_uriname( self) ## uri_modele = physiocap_get_uri_by_layer( self, uri_nom ) ## if uri_modele != None: ## uri_connect, uri_deb, uri_srid, uri_fin = physiocap_tester_uri( self, uri_modele) ## if uri_deb != None: ## nom_court_shp = os.path.basename( shape_name) ## #laTable = "'public.\"" + nom_court_shp[ :-4] + "\"'" ## laTable = "'\"" + nom_court_shp[ :-4] + "\"'" ## reponse = physiocap_existe_table_uri( self, uri_deb, laTable) ## if reponse != None: ## if reponse == True: ## laTable = "\"" + nom_court_shp[ :-4] + "\"" ## #physiocap_log( u"Table existe déjà : " + str( laTable)) ## # Cette table existe déjà = > drop ## reponse_drop = physiocap_detruit_table_uri( self, uri_deb, laTable) ## if reponse_drop == None: ## aText = u"Problème lors de la destruction de la table : " + str( laTable) ## physiocap_log( aText) ## physiocap_error( self, aText) ## # Todo : gérer par exception physiocap_exception_pg ## return physiocap_message_box( self, ## self.tr( aText), ## "warning") ## # Creer la table ## laTable = nom_court_shp[ :-4] ## vector = QgsVectorLayer( shape_name, "INUTILE", 'ogr') ## uri = uri_deb + uri_srid + \ ## " key=gid type=POINTS table=" + laTable + uri_fin ## # uri = "dbname='testpostgis' host=localhost port=5432" + \ ## # " user='******' password='******'" + \ ## # " key=gid type=POINTS table=" + nom_court_shp[ :-4] + " (geom) sql=" ## error = QgsVectorLayerImport.importLayer( vector, uri, POSTGRES_NOM, crs, False, False) ## if error[0] != 0: ## physiocap_error( self, u"Problème Postgres : " + str(error[0]) + " => " + str(error[1])) ## #iface.messageBar().pushMessage(u'Phyqiocap Error', error[1], QgsMessageBar.CRITICAL, 5) ## # else: ## # # Sans erreur on détruit le shape file ## # if os.path.isfile( shape_name): ## # os.remove( shape_name) ## else: ## aText = u"Vérification problématique pour la table : " + \ ## str( laTable) + \ ## u". On continue avec des shapefiles" ## physiocap_log( aText) ## piocap_error( aText) ## # Remettre le choix vers ESRI shape file ## self.fieldComboFormats.setCurrentIndex( 0) ## else: ## aText = u"Pas de connection possible à Postgres : " + \ ## str( uri_nom) + \ ## u". On continue avec des shapefiles" ## physiocap_log( aText) ## physiocap_error( self, aText) ## # Remettre le choix vers ESRI shape file ## self.fieldComboFormats.setCurrentIndex( 0) ## ## else: ## aText = u"Pas de connecteur vers Postgres : " + \ ## str( uri_nom) + \ ## u". On continue avec des shapefiles" ## physiocap_log( aText) ## physiocap_error( self, aText) ## # Remettre le choix vers ESRI shape file ## self.fieldComboFormats.setCurrentIndex( 0) ## else: # Create the PRJ file prj = open(prj_name, "w") epsg = 'inconnu' if ( laProjection == PROJECTION_L93): # Todo: V1.x ? Faire aussi un fichier de metadata epsg = EPSG_TEXT_L93 if ( laProjection == PROJECTION_GPS): # prj pour GPS 4326 epsg = EPSG_TEXT_GPS prj.write(epsg) prj.close() # Création de la synthese if nom_fichier_synthese != "NO": # ASSERT Le fichier de synthese existe if not os.path.isfile( nom_fichier_synthese): uMsg =u"Le fichier de synthese " + nom_fichier_synthese + "n'existe pas" physiocap_log( uMsg) return physiocap_error( self, uMsg) # Ecriture des resulats fichier_synthese = open(nom_fichier_synthese, "a") try: fichier_synthese.write("\n\nSTATISTIQUES\n") fichier_synthese.write("Vitesse moyenne d'avancement \n mean : %0.1f km/h\n" %np.mean(vitesseshp)) fichier_synthese.write("Section moyenne \n mean : %0.2f mm\t std : %0.1f\n" %(np.mean(diamshp), np.std(diamshp))) fichier_synthese.write("Nombre de sarments au m \n mean : %0.2f \t std : %0.1f\n" %(np.mean(nbsarmshp), np.std(nbsarmshp))) fichier_synthese.write("Biomasse en mm²/m linéaire \n mean : %0.1f\t std : %0.1f\n" %(np.mean(biomshp), np.std(biomshp))) if details == "YES": fichier_synthese.write("Nombre de sarments au m² \n mean : %0.1f \t std : %0.1f\n" %(np.mean(nbsarmm2), np.std(nbsarmm2))) fichier_synthese.write("Nombre de sarments par cep \n mean : %0.1f \t\t std : %0.1f\n" %(np.mean(nbsarcep), np.std(nbsarcep))) fichier_synthese.write("Biomasse en mm²/m² \n mean : %0.1f\t std : %0.1f\n" %(np.mean(biommm2), np.std(biommm2))) fichier_synthese.write("Biomasse en gramme/m² \n mean : %0.1f\t std : %0.1f\n" %(np.mean(biomgm2), np.std(biomgm2))) fichier_synthese.write("Biomasse en gramme/cep \n mean : %0.1f\t std : %0.1f\n" %(np.mean(biomgcep), np.std(biomgcep))) except: msg = "Erreur bloquante durant les calculs de moyennes\n" physiocap_error( self, msg ) return -1 fichier_synthese.close() return 0