banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 15 October 2015 15:26

Estelle_Geo
Juste Inscrit !
Date d'inscription: 15 Oct 2015
Messages: 7

Arcpy - Remplacer les sources des couches en gardant la symbologie

Bonjour à tous !

   Débutante en python, je dois terminer un script pour un outil arcpy.
   Il faudrait que je charge de nouvelles couches (générées auparavant dans le script) avec une symbologie type, puis que je fasse un export PDF.
   J'ai à ma disposition un .style, un mxd modèle comportant la symbologie et les différentes couches, mais avec des liaisons de données rompues.
   Je bloque sur la manière dont charger la symbo.

   J'étais partie sur deux hypothèses:

   Premièrement : Je charge les couches dans le mxd modèle, en prenant une couche de référence pour la symbologie (mais les liens sont rompus avec les couches modèles)...

   OU je pensais réparer les liens rompus et les remplacer par les classes d'entités voulues.

   Exemple du bout de code essayé et qui ne marche pas: (variables et mxd déjà chargée)

Code:

   for lyr in arcpy.mapping.ListLayers(mxd,"",df):
        if lyr.dataSource == r"Le chemin des classes d'entités rompues":
            arcpy.mapping.RemoveLayer(df,lyr)
            lyr.replaceDataSource(Repertoire, r'Chemin du dossier du nouveau SHP', Nom du SHP, True)
            arcpy.mapping.AddLayer(df,lyr,"TOP")
    arcpy.AddMessage(replaceDataSource)
    mxd.save
    del mxd

Je ne comprends pas pourquoi ce bout de script ne marche pas?
Et peut-être que l'utilisation du fichier style est possible sous Python aussi? Si vous avez quelques conseils ou d'autres idées pour charger une symbologie en python, je suis preneuse !
Toute aide sera la bienvenue smile

Dernière modification par Estelle_Geo (Thu 15 October 2015 15:33)

Hors ligne

 

#2 Fri 16 October 2015 10:13

lebon henri
Participant actif
Lieu: Vendée
Date d'inscription: 14 Jan 2008
Messages: 99

Re: Arcpy - Remplacer les sources des couches en gardant la symbologie

Salut,

Voici quelques éléments de réponse en commentaire dans ton code.

Code:

   for lyr in arcpy.mapping.ListLayers(mxd,"",df):
        ##met une condition if lyr.supports("DATASOURCE"):
        if lyr.dataSource == r"Le chemin des classes d'entités rompues": ## met plutôt lyr.isBroken
            arcpy.mapping.RemoveLayer(df,lyr) ##pourquoi enlever une couche dont tu veux réparer le lien la ligne suivante ?
            lyr.replaceDataSource(Repertoire, r'Chemin du dossier du nouveau SHP', Nom du SHP, True)
            arcpy.mapping.AddLayer(df,lyr,"TOP") ## si tu ne supprimes pas le layer, t'auras pas besoin de le réajouter.
            ##si ton but est de remplacer un layer cassé par un layer tout neuf, il faut plutôt insérer le layer correctif puis supprimer l'ancien, en utilisant l'ancien d'abords comme référence de positionnement.
    arcpy.AddMessage(replaceDataSource)
    mxd.save
    del mxd

Cordialement.

Dernière modification par lebon henri (Fri 16 October 2015 10:13)

Hors ligne

 

#3 Wed 21 October 2015 10:27

Estelle_Geo
Juste Inscrit !
Date d'inscription: 15 Oct 2015
Messages: 7

Re: Arcpy - Remplacer les sources des couches en gardant la symbologie

Merci beaucoup pour cette réponse !

Ca m'a permis de comprendre les erreurs de mon script, mais effectivement je vais essayer avec l'autre méthode (insérer le layer) qui paraît plus appropriée.

Du coup, j'ai essayé avec ce script et une nouvelle fois des erreurs :

(J'ai l'impression que ça bug au niveau de ma boucle for)


Code:

# Conversion et création de la couche en .lyr et de la nouvelle couche
    arcpy.MakeFeatureLayer_management(SHP_AXE, LYR_AXE)
   
# Charge le mxd déjà déclaré auparavant
    mxd = arcpy.mapping.MapDocument(MXD_93)

# Liste des couches du mxd
    df = arcpy.mapping.ListDataFrames(mxd, "Couches")
    Couches = df [0]

# Référence et ajout d'une nouvelle couche
    newLayer = arcpy.mapping.Layer(LYR_AXE)
    arcpy.mapping.AddLayer =(Couches, newLayer, "")
    newLayer.visible = True
    
# Verifier liste des couches et appliquer symbologie 
    L = []
    for layer in df :
        arcpy.mapping.ListLayers(mxd, "", df)
        arcpy.AddMessage(layer.visible)
        L.append (layer)
        for elt in L :
            if elt.name == "AXE_xxx_rc":
                arcpy.MakeFeatureLayer_management("AXE_xxx_rc", LYR_AXE_xxx)
                arcpy.ApplySymbologyFromLayer_management (newLayer, LYR_AXE_xxx, True)
                arcpy.mapping.InsertLayer(Couches, "AXE_xxx_rc", newLayer, "BEFORE")

Hors ligne

 

#4 Wed 21 October 2015 10:52

lebon henri
Participant actif
Lieu: Vendée
Date d'inscription: 14 Jan 2008
Messages: 99

Re: Arcpy - Remplacer les sources des couches en gardant la symbologie

Bonjour, si je comprend bien votre problème, un script comme ça devrait le faire.


Code:

mxd = arcpy.mapping.MapDocument(MXD_93)

df = arcpy.mapping.ListDataFrames(mxd, "Couches")[0]

newLayer = arcpy.mapping.Layer(r"C:\toto.lyr") ##préparer votre .lyr avant histoire de faire simple


for lyr in arcpy.mapping.ListLayers(mxd, "", df)[:]: ## en utilisant [:] à la fin d'une liste, on travail sur une copie de la liste. Pratique quand on agit sur la liste lors de la boucle. C'est le cas ici en agissant sur la liste des couches.

    if lyr.name == "AXE_xxx_rc":

        arcpy.mapping.InsertLayer(df, lyr, newLayer, "BEFORE")

        arcpy.mapping.RemoveLayer(df, lyr)

Hors ligne

 

#5 Wed 02 December 2015 10:51

Estelle_Geo
Juste Inscrit !
Date d'inscription: 15 Oct 2015
Messages: 7

Re: Arcpy - Remplacer les sources des couches en gardant la symbologie

Réponse un peu tardive de ma part, mais je vous remercie pour la votre qui m'a bien aidé !
Je mets à disposition un bout de la trame de mon code final. Finalement j'ai supprimé l'idée de la boucle for (en enregistrant les couches modèles préalablement comme fichier de couche en .lyr).

Code:

    if PRJ == "RGF93" :
        
        arcpy.env.overwriteOutput = True # pour pouvoir remplacer les resultats
    
# Conversion des couches :
        arcpy.MakeFeatureLayer_management(SHP_AXE, 'Nouveau nom de couche')      
        
# Chargement mxd et couches de référence :
        mxd = arcpy.mapping.MapDocument(Nom_MXD)
        LYR_REF_AXE = (r'\chemin de la couche de référence)

# Chargement des différentes couches :
        newLayer1 = arcpy.mapping.Layer('Nouveau nom de couche')

# Insertion et symbologie des couches :
        df = arcpy.mapping.ListDataFrames(mxd, "Couches")[0]
        
        arcpy.mapping.AddLayer(df, newLayer1, "TOP")
        arcpy.ApplySymbologyFromLayer_management(newLayer1, LYR_REF_AXE)
        arcpy.AddMessage("Symbologie couche 1 => OK")

# Visibilités des couches ajoutées :
        newLayer1.visible = True

# Sauvergarde mxd :
        mxd.save()
        del mxd

Dernière modification par Estelle_Geo (Wed 02 December 2015 10:53)

Hors ligne

 

Pied de page des forums

Powered by FluxBB