Suite

Pages basées sur les données avec légende mobile/carte en médaillon

Pages basées sur les données avec légende mobile/carte en médaillon


J'ai créé un outil de script pour ArcMap 10.3.1 qui déplacera une légende autour d'un bloc de données afin de ne pas masquer une couche de carte spécifiée lors de l'utilisation de pages pilotées par les données. Cependant, je rencontre un problème intéressant lorsque j'essaie d'aligner la légende sur le bord droit du bloc de données.

Voici le code que j'utilise pour aligner la légende (la légende est ancrée en bas à gauche):

inset.elementPositionX = (DataFrame.elementPositionX + DataFrame.elementWidth) - inset.elementWidth

Maintenant, ce script fonctionne parfaitement jusqu'à ce que la case "Afficher uniquement les classes visibles dans l'étendue actuelle de la carte" soit cochée dans les propriétés de la légende. Le fait de cocher cette case entraîne le redimensionnement de la légende au fur et à mesure que le programme parcourt chaque page (en fonction de ce qui est visible sur la carte), et lorsqu'il le fait, il laisse un espace ou dépasse le bord du bloc de données.

Ce qui est intéressant, c'est que si l'option "Afficher uniquement les classes visibles dans l'étendue actuelle de la carte" est cochée dans les propriétés de la légende, si je parcourt chaque page manuellement, en exécutant ce petit extrait d'alignement dans la fenêtre python après avoir changé de page, cela fonctionne parfaitement.

Donc, ma question est la suivante : pourquoi cela ne fonctionne-t-il pas lorsqu'il s'exécute dans un outil de script, mais le fait-il lorsqu'il s'exécute manuellement ? C'est presque comme si ArcMap n'était pas capable de se maintenir (si cela a du sens… )

Remarque* cet outil a été conçu pour fonctionner sur un MXD ouvert, pas en dehors d'un.

Pour tester, essayez ceci :

Ouvrez un MXD, ajoutez deux couches - une couche d'indexation pour DDP et une deuxième couche symbolisée par des catégories. Assurez-vous que toutes les catégories n'apparaissent pas dans chaque DDP. Ensuite, insérez une légende, accédez à ses propriétés, cochez la case "Afficher uniquement les classes visibles dans l'étendue actuelle de la carte". Ensuite, lorsque vous cliquez sur vos DDP, votre légende devrait (sauf si toutes les descriptions d'éléments ont la même largeur) changer de forme.

Ensuite, ajoutez ceci à la fenêtre python :

mxd = arcpy.mapping.MapDocument("Current") SecondaryObject = "Legend" encart = arcpy.mapping.ListLayoutElements(mxd, "", SecondaryObject)[0] PrimeObject = "Main View" DataFrame = arcpy.mapping.ListDataFrames(mxd , PrimeObject)[0] inset.elementPositionX = (DataFrame.elementPositionX + DataFrame.elementWidth) - inset.elementWidth

Ensuite, parcourez votre DDP pour observer l'extrait en action, en train de fonctionner.


Dans la version complète du DDP avec script de légende mobile, l'alignement a lieu après le passage du DDP à chaque nouvelle page. Tout d'abord, la légende est ramenée à sa position de départ, et si la fonction "intersection" renvoie > 0 à partir de là, elle passe à une nouvelle position :

for pageNum in range (1, mxd.dataDrivenPages.pageCount + 1) : #setup naming et path for output map path = mxd.filePath bn = os.path.basename(path)[:-4] mxd.dataDrivenPages.currentPageID = pageNum insetDefaultX = inset.elementPositionX insetDefaultY = inset.elementPositionY #vérifier la position par défaut pour l'intersection intersect = checkIntersect(inset) if intersect == 0: #si elle n'intersecte pas, imprime la carte arcpy.mapping.ExportToEPS(mxd, exportFolder "" + bn + "_"+ str(pageNum) + ".eps", "Page_Layout",640,480,300,"BETTER","RGB",3,,"ADAPTIVE","RASTERIZE_BITMAP",True,False) else : #intersect != 0: #déplacer l'encart vers le coin SE inset.elementPositionX = (DataFrame.elementPositionX + DataFrame.elementWidth) - inset.elementWidth inset.elementPositionY = DataFrame.elementPositionY

L'utilisation de l'actualisation de la vue active n'a pas résolu mon problème. Via l'aide esri : « RefreshActiveView n'est nécessaire que si vous souhaitez voir la vue active de la carte actuelle mise à jour. Les fonctions d'exportation, d'enregistrement et d'impression arcpy.mapping généreront les résultats mis à jour attendus sans utiliser RefreshActiveView. »

Au lieu de cela, le problème était avec l'emplacement dans mon code où j'ai d'abord identifié la légende et attribué sa taille et sa position aux variables. Je faisais cela en dehors de mes pages pilotées par les données vérifier-intersection/exportationpourboucle, il utilisait donc toujours les dimensions de la légende dans son état d'origine - c'est-à-dire ses dimensions où qu'elles se trouvent lorsque j'ai commencé le code - et non ses dimensions après le passage à une nouvelle page.

Une fois que j'ai déplacé cette section dans mon check-intersect/exportpourboucle, le problème a été résolu.


Insérerarcpy.RefreshActiveView()dans votre script avant de tester le chevauchement des légendes.


Voir la vidéo: #02 Création de notre première application de 3 pages de A à Z avec GlideApp français