Bienvenue! Inscrivez-vous et rejoignez notre communauté :)
  • Login:

Bienvenue sur Forum SIG - Systèmes d'Information Géographique et Géomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre première visite, assurez vous de faire une recherche préalable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des résultats 1 à 5 sur 5
  1. #1

    Date d'inscription
    septembre 2010
    Localisation
    Montpellier
    Emploi
    Géomaticien
    Messages
    162

    Unhappy [Python] Limite liste arcpy.ListFeatureClasses

    Bonjour,

    Je bosse toujours sur la même moulinette qui "fonctionne" mais ne donne pas le résultat escompté.

    En effet lors d'une partie où elle doit créer des features class dans une GDB à partir de shapes dans un fichier, j'ai un souci.
    Pour effectuer cette action, ma moulinette se base sur une liste des shapes faite avec la fonction arcpy.ListFeatureClasses.
    Lorsque je donne à ma moulinette 15-20 shapes tout fonctionne nickel. Lorsque j'en donne plus d'une centaine elle essaye de me créer toujours le même shape...

    Est-ce que d'une manière ou d'une autre j'ai saturé ma liste ?

    Je ne comprend pas comment résoudre ce problème qui me rend fou car ma moulinette fonctionne sur 15-20 objets mais pas sur des centaines...

    Merci d'avance

  2. #2
    Modérateur et rédacteur Supporter(rice)


    Date d'inscription
    octobre 2005
    Localisation
    Louvain-la-neuve
    Emploi
    Géologue
    Organisme
    Université Catholique de Louvain - Région Wallonne
    Messages
    2 652

    Par défaut Re : [Python] Limite liste arcpy.ListFeatureClasses

    Une liste Python ne se sature jamais. Peux-tu fournir ton script modifié de [Python] Séléction de toutes les entité d'une feature class de gdb
    "Caminante, no hay camino, el camino se hace al andar" A. Machado

  3. #3

    Date d'inscription
    septembre 2010
    Localisation
    Montpellier
    Emploi
    Géomaticien
    Messages
    162

    Par défaut Re : [Python] Limite liste arcpy.ListFeatureClasses

    Ok merci pour l'info

    Voici mon script :
    Code:
    # -*- coding: utf-8 -*-
    # ---------------------------------------------------------------------------
    # Update_DCZUbase
    # Created on: 2016-11-07
    # Description : Permet la mise à jour de la base DCZU
    # ---------------------------------------------------------------------------
    
    # Import arcpy module
    import arcpy, os, sys, re
    
    # Script arguments
    Extract_Folder = arcpy.GetParameterAsText(0) # Dossier contenant les SHP extract
    GDB = arcpy.GetParameterAsText(1) # Geodatabase etude initiale
    Date = arcpy.GetParameterAsText(2) # Date de l'extraction
    
    
    #Fonctions
    def getTime ():
        now = datetime.datetime.now().strftime(" %d/%m %I:%M%p")
        return now
    	
    def UpdateDCZU ():
                #Select
    
        fc_lyr = "toto"
        extract_lyr = "pedro"
        arcpy.MakeFeatureLayer_management (fc, fc_lyr)
        arcpy.MakeFeatureLayer_management (os.path.join(Extract_Folder, ExtractSHP), extract_lyr)
        Extract_Select = arcpy.SelectLayerByLocation_management (fc_lyr, "are_identical_to", extract_lyr)
        result = arcpy.GetCount_management(fc_lyr)
        count = int(result.getOutput(0))
        arcpy.AddMessage (str(count)+ " zone(s)\n")
                
    			#Delete
        	
        arcpy.DeleteFeatures_management(Extract_Select)
            
                #Append
        arcpy.Append_management(inputs = os.path.join(Extract_Folder, ExtractSHP), target = os.path.join(GDB, fc), schema_type = "NO_TEST", field_mapping = "", subtype = "")
    
        arcpy.AddMessage(str(getTime ()) + " : Update done !")
    		
        del (fc_lyr)
        del (extract_lyr)
        listSHP.remove (ExtractSHP)
    
    
    def CreateFCfromSHP ():
            New_FC = shp[20:-4]
            arcpy.CreateFeatureclass_management(GDB, New_FC, "POLYGON", FC_Template)
            arcpy.AddMessage("------> "+ New_FC + " created")
            arcpy.Append_management(inputs = os.path.join(Extract_Folder, ExtractSHP), target = os.path.join(GDB, New_FC), schema_type = "NO_TEST", field_mapping = "", subtype = "")
            arcpy.AddMessage("------> "+ New_FC + " filled with new data")
    
    
    		
    #Process	
    arcpy.env.workspace = Extract_Folder
    listSHP = arcpy.ListFeatureClasses()
    
    arcpy.env.workspace = GDB
    listFC = arcpy.ListFeatureClasses()
    
    #Declaration variable
    CountFCupdated = 0
    CountFCnotUpdated = 0
    CountNewFC = 0
    CountFCnotAdded = 0
    
    arcpy.AddMessage("\nSTART UPDATING" + str(getTime ()))
    arcpy.AddMessage("\n>>> " + str(len(listSHP)) + " shapes")
    
    #Loop update FC with shape
    for fc in listFC:
    
        arcpy.AddMessage("\n>>> START "+ fc +"\n")
        # Exists Test
        ExtractSHP = "Extract_DCZU_" + Date + "_" + fc + ".shp"
        arcpy.AddMessage(ExtractSHP + "\n")
    
        if arcpy.Exists(os.path.join(Extract_Folder, ExtractSHP)):
    
            arcpy.AddMessage("Shape exists, updating in progress " + os.path.join(Extract_Folder, ExtractSHP) + "\n")
    	    
            UpdateDCZU()
            CountFCupdated += 1
            
        elif arcpy.Exists(os.path.join(Extract_Folder,"Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp")):
            arcpy.AddMessage(str(getTime ()) + " : Shape doesn't exist, trying D+1")
    		
            ExtractSHP = "Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp"
            arcpy.AddMessage(ExtractSHP)
    		
            UpdateDCZU()
            CountFCupdated += 1
            
        else:
            arcpy.AddMessage(str(getTime ()) + " : Shape doesn't exist")
            CountFCnotUpdated += 1
    
        arcpy.AddMessage("---------------------------------------\n")
    
    arcpy.AddMessage("\n>>> " + str(CountFCupdated) + " / " + str(len(listFC)) + " FC updated in GDB\n")
    arcpy.AddMessage(">>> " + str(CountFCnotUpdated) + " / " + str(len(listFC)) + " FC not updated in GDB (shape doesn't exist)\n")
    
    #Loop create new FC with shape
    if len(listSHP) <> 0:
        arcpy.AddMessage(str(len(listSHP))+" shapes haven't match feature class in GDB\n")
        FC_Template = listFC[1]
        
        for shp in listSHP:
    
            if arcpy.Exists(os.path.join(Extract_Folder, ExtractSHP)):
                CreateFCfromSHP()
                CountNewFC += 1
    		
            elif arcpy.Exists(os.path.join(Extract_Folder,"Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp")):
                ExtractSHP = "Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp"
                CreateFCfromSHP()
                CountNewFC += 1
        
            else:
                arcpy.AddMessage(str(getTime ()) + " " + ExtractSHP + " : Shape doesn't exist")
                CountFCnotAdded += 1
    
    arcpy.AddMessage("\n>>> " + str(CountNewFC) + " / " + str(len(listSHP)) + " new features class in GDB\n")
    arcpy.AddMessage(">>> " + str(CountFCnotAdded) + " / " + str(len(listSHP)) + " features class not created in GDB\n")
    
    arcpy.AddMessage("\n  >>> Well done ! Update complete <<<\n")
    l'erreur provient de la seconde partie "#Loop create new FC with shape"

  4. #4
    Modérateur et rédacteur Supporter(rice)


    Date d'inscription
    octobre 2005
    Localisation
    Louvain-la-neuve
    Emploi
    Géologue
    Organisme
    Université Catholique de Louvain - Région Wallonne
    Messages
    2 652

    Par défaut Re : [Python] Limite liste arcpy.ListFeatureClasses

    Bonjour, comme premier contrôle de ce que fait la boucle dans le script suivant est ce que tot est égal à la longueur de la liste (comme ça tu es sûr de passer par tous les éléments de la liste avec tes tests). Je précise que je connais Python, mais pas ArcPy.


    tot = 0
    longliste = len(listFC)
    for fc in listFC:
    arcpy.AddMessage("\n>>> START "+ fc +"\n")
    # Exists Test
    ExtractSHP = "Extract_DCZU_" + Date + "_" + fc + ".shp"
    arcpy.AddMessage(ExtractSHP + "\n")
    if arcpy.Exists(os.path.join(Extract_Folder, ExtractSHP)):
    arcpy.AddMessage("Shape exists, updating in progress " + os.path.join(Extract_Folder, ExtractSHP) + "\n")
    UpdateDCZU()
    CountFCupdated += 1
    tot += 1
    elif arcpy.Exists(os.path.join(Extract_Folder,"Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp")):
    arcpy.AddMessage(str(getTime ()) + " : Shape doesn't exist, trying D+1")
    ExtractSHP = "Extract_DCZU_" + str(int(Date)+1) + "_" + fc + ".shp"
    arcpy.AddMessage(ExtractSHP)
    UpdateDCZU()
    CountFCupdated += 1
    tot += 1
    else:
    arcpy.AddMessage(str(getTime ()) + " : Shape doesn't exist")
    CountFCnotUpdated += 1
    tot += 1
    Dernière modification par gene ; 16/11/2016 à 10h38.
    "Caminante, no hay camino, el camino se hace al andar" A. Machado

  5. #5
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    33
    Messages
    1 909

    Par défaut Re : [Python] Limite liste arcpy.ListFeatureClasses

    Bonjour,
    A mon avis, tu devrais vraiment passer les variables à tes fonctions UpdateDCZU et CreateFCfromSHP plutôt que d'utiliser des variables globales qui changent de valeur tout le temps.
    Les variables globales ne sont pas faites pour çà et cette écriture est source d'erreur (sans compter que çà rend le programme beaucoup moins lisible et maintenable).

    Donc avec très peu de modif :
    def UpdateDCZU(fc, ExtractSHP)
    def CreateFCfromSHP(shp, ExtractSHP, FC_Template)
    Et à chaque appel de fonction, tu précises bien les bonnes valeurs.
    Sans oublier de déclarer dans UpdateDCZU que listSHP est une variable globale car tu la modifies dans la fonction (ou alors tu la modifies après chaque appel de la fonction).

    PS : Extract_Folder, listSHP et listFC : c'est par contre logique que ces variables soient globales : elles sont initialisées en début de programme et leur valeur reste constante.
    PS2 : http://www.journaldunet.com/developp...-fonction.html

 

 

Discussions similaires

  1. [ArcGIS 10.x] Arcpy - Alignement de polygones en Python
    Par hemehef dans le forum Programmation
    Réponses: 0
    Dernier message: 15/06/2015, 08h00
  2. [ArcGIS 10.x] Python, arcpy et Data Interoperability
    Par MacGeol dans le forum Programmation
    Réponses: 19
    Dernier message: 26/06/2014, 17h59
  3. [ArcGIS 10.x] arcpy.da.InsertCursor avec une liste
    Par bernards111 dans le forum Programmation
    Réponses: 5
    Dernier message: 13/01/2014, 21h44
  4. [ArcGIS 10.x] Une liste ou bien un dictionnaire python
    Par hajarsig dans le forum Assistance Technique
    Réponses: 8
    Dernier message: 21/03/2013, 01h06
  5. Réponses: 1
    Dernier message: 30/06/2005, 13h32

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •