Gérer les couches d'annotation avec arcpy


10

Je souhaite accéder aux couches d'annotations en utilisant arcpy (le but est de vérifier quelques chaînes de texte dans les annotations de texte). Par annotation, je veux dire des annotations d'outils de dessin , pas des étiquettes dynamiques. Ces couches d'annotations se trouvent sous une couche de groupes nommée «Par défaut».

La documentation Esri parle d'annotation de dessin comme étant des couches elles-mêmes:

Il existe essentiellement trois catégories de couches dans un document ArcMap: les couches d'entités, les couches de groupe et les couches raster. Les propriétés isFeatureLayer, isGroupLayer et isRasterLayer vous permettent d'identifier ou d'isoler la majorité des types de calques mais pas tous les types de calques. Il existe quelques couches et jeux de données spécialisés qui ne tombent pas dans l'une de ces trois catégories: sous-classes d'annotations, entités de dimension, jeux de données réseau, jeux de données de terrain, jeux de données de topologie, etc. Dans ces cas, vous devrez peut-être tester d'autres propriétés pour isoler une couche d'intérêt avant de lui faire quelque chose.

Une chose à savoir est la façon dont ArcGIS gère les annotations de dessin , deux configurations moyennes sont possibles:

ArcGIS prend entièrement en charge deux types d'annotations: géodatabase et document cartographique

Dans mon cas, c'est un document cartographique.


À la lumière de toute cette documentation, il apparaît donc que les annotations draw ne sont que de simples couches, donc un simple code comme celui-ci devrait fonctionner:

mxd = arcpy.mapping.MapDocument("some\mxdpath\here")
df = arcpy.mapping.ListDataFrames(mxd,"Layers")
lyr = arcpy.mapping.ListLayers(mxd,"current_annotation_layer",df) 

Mais le problème est que les annotations ne semblent pas pouvoir être obtenues via dataframe (ce qui est étrange étant donné que chacune de mes couches d'annotations est associée à une couche d'entités).


Une classe arcpy spécifique pour accéder aux annotations (comparable à IAnnotationFeature2 du SDK ArcObject)? Une solution?

Merci !


Avez-vous réussi à modifier votre groupe d'annotations de documents ArcMap via des comptypes et ArcObjects? Des conseils pour plus d'informations? Merci beaucoup!!
Hélène

Réponses:


3

ArcPy n'expose pas tous les ArcObjects. D'après ce que je peux dire, c'est l'une des nombreuses interfaces qui ne sont pas exposées dans ArcPy. Seuls les éléments de mise en page sont exposés dans arcpy: ListLayoutElements (arcpy.mapping)

Si vous devez le faire, votre seul choix est ArcObjects. Si vous souhaitez utiliser Python, voir Comment accéder à ArcObjects à partir de Python?

Sinon, vous voudrez peut-être rechercher ou créer une idée ArcGIS à ce sujet (la seule idée existante pertinente que j'ai trouvée était celle-ci ).


Salut, j'attendais en quelque sorte cette réponse, mais merci et +1 pour les liens, cela pourrait aider.
Akheloes

@Akheloes Avez-vous réussi à modifier votre groupe d'annotations de documents ArcMap via comptypes et ArcObjects?
Hélène

0

J'ajoute une réponse au cas où d'autres tomberaient dessus. Les annotations SONT accessibles via arcpy et peuvent être traitées comme des couches. Le code n'a pas fonctionné car il manque un index, PAS parce que les annotations ne sont pas accessibles. Ces fonctions renvoient une liste à chaque fois, donc même si vous utilisez un caractère générique (dans ce cas " Layers " et " current_annotation_layer "), vous devez toujours spécifier l'index pour le récupérer et l'affecter à un objet ( respectivement df & lyr ).

Le code doit être:

df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
lyr = arcpy.mapping.ListDataFrames(mxd, "current_annotation_layer", df)[0]

Voici un exemple que j'ai utilisé arcpy pour accéder à ma couche d'annotation. Pour ma carte, je voulais que l'annotation soit déplacée sous un masque avec 20% de transparence si elle était en dehors de ma zone d'intérêt.

my_annotation_lyr = arcpy.mapping.Layer("Long_ProjectsAnno")
reference_lyr = arcpy.mapping.Layer("counties_mask")
arcpy.mapping.MoveLayer(df, reference_lyr, my_annotation_lyr, "AFTER")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.