Suite

Réinitialisation de l'élément de texte arcpy.mapping

Réinitialisation de l'élément de texte arcpy.mapping


J'écris un script pour créer des milliers de cartes et j'essaie de créer une table qui se met à jour pour chaque carte. En gros un tableau de mise à jour des informations spécifiques à chaque carte. J'ai essayé de lier un tableau Excel à la vue de mise en page, mais arc ne semble pas avoir cette fonctionnalité. Donc, ce que je fais à la place, c'est de créer un tableau manuel dans la vue de la mise en page. J'ai 27 valeurs pour chaque carte que j'ai stockée dans un dictionnaire (en utilisant des curseurs de recherche pour extraire les informations et les stocker dans le dictionnaire).

Je ne peux pas copier et coller mon tableau ici, mais il ressemble essentiellement à ceci :

Récepteurs AEGbuffer CONbuffer ERGbuffer buffer 1 10 19 écoles 2 11 20 garderies 3 12 21 hôpitaux 4 13 22 maisons de retraite 5 14 23 critique 6 15 24 sw 7 16 25 streams 8 17 26 respop 9 18 27

pour k,v dans triés(table.items()): pour elm dans arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT") : if elm.text == "1": if k == 'AEGbuffer': elm. text= v if elm.text == "2": if k == 'AEGschools': elm.text = v if elm.text == "3": if k == 'AEGchildcares': elm.text = v if elm.text == "4": if k == 'AEGhospitals': elm.text = v if elm.text == "5": if k == 'AEGnursinghomes': elm.text = v if elm.text = = "6": if k == 'AEGcritical': elm.text = v if elm.text == "7": if k == 'AEGsw': elm.text = v if elm.text == "8" : if k == 'AEGstreams': elm.text = v if elm.text == "9": if k == 'AEGrespop': elm.text = v

c'est juste pour la première ligne, le reste du code est le même processus pour le collage des valeurs du dictionnaire.

où je suis bloqué: je ne sais pas comment réinitialiser correctement les valeurs nouvellement modifiées à leurs valeurs d'origine 1-27 afin que la carte suivante puisse être facilement produite. y a-t-il un outil ou une astuce pour cela?

ce que j'ai essayé : après avoir exporté la carte, je rouvre les éléments de texte et inverse le processus comme…

pour k,v dans triés(table.items()) : pour elm dans arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT") : if k == 'AEGbuffer' : if elm.text == v : elm.text = "1" et ainsi de suite…

mais cette approche n'a pas très bien fonctionné. certaines valeurs sont fausses lorsqu'il y a plusieurs fois les mêmes valeurs sur la table.


Au lieu de définir le contenu du texte de chaque élément, définissez leur nom sur quelque chose comme "Text1" ou encore mieux, vous pouvez faire correspondre les noms des éléments avec les noms de clé de votre table comme "AEGbuffer". Si c'était moi, j'ajouterais également un suffixe aux champs afin de m'assurer que je n'opère que sur les éléments du tableau. Vous pouvez revenir plus tard et ajouter des éléments de texte que vous ne souhaitez pas inclure dans votre boucle de table.

Alors votre boucle géante pourrait ressembler à ceci

pour table_elm dans arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "*_table") : if text_elm.name == k : text_elm.text = v

Pour te réinitialiser juste

pour table_elm dans arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "*_table") : table_elm.text = ""

EDIT : Sur la base de vos commentaires, je pense que votre vrai problème est le format de vos données.

{'hôpitaux' :{'AEGBuffer' : 'Aucun','ConBuffer' : '65 200', 'ERGBuffer' : 'Aucun'}, 'écoles' :{'AEGBuffer' : '600','ConBuffer' : '7 300 ', 'ERGBuffer' : '550'},'respop' :{}}

vous permet de faire :

#votre k va maintenant être le nom de la ligne, c'est-à-dire que les hôpitaux et v vont être un autre dictionnaire pour k,v dans trié(table.items()): #cela repose sur les éléments nommés hospitalERGBuffer, schoolCONBuffer etc. pour bufferType , bufferValue dans v.items() : fieldName = str(k + bufferType) # c'est-à-dire 'hospitalsERGBuffer' table_elm = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", fieldName + "*")[0] #il ne va soyez-en un si vous avez bien fait les choses. table_elm.text = valeur tampon

J'ai trouvé une astuce intéressante en essayant de réinitialiser des éléments de texte. Si vous mettez votre chemin mxd dans la boucle que vous parcourez, vous n'avez pas besoin d'écrire de code pour réinitialiser vos éléments de texte

première façon que vous devez réinitialiser manuellement :

mxd = "path" for lay in fc: ##extract info for map for x in text_elements: if x == "word": x = "number" arcpy.export_pdf("map") for x in for x in text_elements: si x == "nombre": x = "mot"

mais vous n'avez pas besoin de réinitialiser les éléments de texte si vous placez le chemin mxd dans votre boucle principale !

for lay in fc: mxd = "path" ##extract info for map for x in text_elements: if x == "word": x = "number"

Voir la vidéo: Week13: 6 scripts for Arcmap layouts