Modifier les styles d'étiquette (police, couleur, taille, etc.) à l'aide d'ArcPy?

9

J'essaie d'écrire une macro python pour ArcGIS 10.2 qui automatisera le processus d'étiquetage des points dans une couche en fonction de différents types d'appartements. Par exemple, un style d'appartements aurait un carré bleu avec du texte en gras blanc comme une étiquette; un autre aurait un carré rose avec du texte en gras noir; un autre aurait un carré rouge avec un texte en gras blanc, etc.

Quelle expression ou fonction utiliseriez-vous dans arcpy pour modifier le style de ces étiquettes?

Actuellement, le script étiquette les appartements par un code de carte et change son nom dans la table des matières en appartements, comme il se doit.

entrez la description de l'image ici

Maintenant, je veux changer la police, le graphique et la taille des étiquettes pour créer une étiquette unique pour chacune, puis créer un bouton à appuyer et simplement automatiser le processus chaque fois que nous devons effectuer l'une de ces couches.

Existe-t-il un moyen de modifier les polices, les étiquettes et les graphiques à l'aide de scripts Python (ArcPy, IDLE, etc.)?


J'ai décidé de modifier ce post pour donner une description finale de ce que je vais faire ici, donc il n'y a pas de confusion. Essentiellement, les points sur la carte passeront de l'image ci-dessus à ceci:

entrez la description de l'image ici


J'ai essayé d'utiliser la lblClass.expressionfonction, mais le code que j'essaie d'utiliser ne fonctionne pas. Je pense que c'est probablement le pas dans la bonne direction. Ci-dessous se trouve du code que j'ai essayé d'utiliser juste pour obtenir le labelClass.expression pour changer les polices des étiquettes.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Tyler Spears
la source

Réponses:

7

L'API arcpy.mapping ne donne accès qu'à un nombre limité de propriétés de couche qui peuvent être directement modifiées, mais toutes les propriétés trouvées dans la boîte de dialogue Propriétés de la couche peuvent être modifiées à l'aide de la fonction UpdateLayer. Les informations sont extraites d'une couche source et appliquées à la couche dans un document ArcMap qui doit être mis à jour. La couche source peut être soit un fichier de couches (.lyr), soit une couche dans un document ArcMap. UpdateLayer est une fonction robuste car elle peut être utilisée de différentes manières pour produire des résultats différents.

Vous devez créer la symbologie / les étiquettes comme vous le souhaitez et l'enregistrer dans un fichier de couche. Chargez ensuite ce fichier de couche à l'aide de arcpy.mapping.UpdateLayer () .

Si plusieurs personnes doivent exécuter le complément python, vous devez rendre le fichier de couche accessible à tous, comme un lecteur de réseau public.


J'ai fini par créer une boîte à outils de mise à jour des propriétés de la couche personnalisée . Il vous permet de sélectionner une couche dans la table des matières ArcMap, puis de sélectionner un fichier de couche d'entrée. Il met ensuite à jour le calque avec toutes les propriétés dans le fichier de calque, et re-sources à la classe d'entités d'origine. Cela fonctionnera avec des données qui sont en gdb, mdb, shp ou sde.

Afficher le code source

Veuillez me faire savoir si vous avez des questions.

entrez la description de l'image ici

ianbroad
la source
J'ai créé un fichier de couches distinct à partir d'une autre couche de données basée sur des points avec tout ce qui est défini (symbologie et étiquettes), il s'exécute, mais tout ce qu'il semble faire est de remplacer complètement le fichier d'appartement non étiqueté et non symbolisé (celui que je choisis d'ajouter) par le fichier d'appartement sourceLayer. Je suppose que c'est à cause de la valeur False dans la section "Mettre à jour la symbologie uniquement". Existe-t-il un moyen pour que cela puisse être exécuté de manière à appliquer simplement la symbologie et les étiquettes mais pas à déplacer les points vers un emplacement différent?
Tyler Spears
Quel genre de fonctions devrais-je rechercher pour le faire? Je ne connais pas trop le réapprovisionnement. Soit dit en passant, j'apprécie votre aide jusqu'à présent.
Tyler Spears
J'ai essayé de l'ajuster pour l'adapter à mon code. Il fonctionne via la fonction UpdateLayer, mais à la ligne 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]il génère une erreur indiquant que l'index est hors de portée.
Tyler Spears du
Cela signifie que la arcpy.mapping.ListLayersméthode ne trouve pas une couche dans le mxd actuel avec le même nom que votre input_layer_file(un index de [0]retour d'index hors plage signifie qu'il n'y a aucun élément dans la liste).
XIY
Je l'ai fait, et j'ai l'impression que c'est très proche, mais le problème est, après la fin de la partie UpdateLayer, il génère l'erreur suivante: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears
6

Une autre option consiste à définir l'expression d'étiquette personnalisée sur le calque (modification de la taille et de la couleur ... etc.) à l'aide de python:

par exemple

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Création d'expressions d'étiquette

Ils peuvent être définis via:

LabelClass (arcpy.mapping)

ÉDITER:

Essaye ça:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Vous pouvez supprimer vos autres instructions de ligne (pour loop, labClass et call to function). En outre, la fonction doit être appelée FindLabel.

oeuvre21
la source
J'ai essayé d'utiliser quelque chose de similaire à une fonction comme celle-ci. J'ai créé une définition appelée def getLabel (Code, Type)puis après avoir configuré les instructions if-else pour les différents codes de carte que j'utilise, j'ai ensuite défini 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")', qui renvoie simplement une erreur, TypeError: unsupported operand type(s) for &: 'str' and 'str'je suis essentiellement en suivant les exemples du site Web Esri. Si je peux simplement prouver que je peux changer la police, je peux ensuite passer aux réglages les plus difficiles (tels que la forme, l'arrière-plan et la couleur des étiquettes).
Tyler Spears du
@Tyler Spears, essayez de supprimer les guillemets doubles autour des noms de champs.
artwork21
Quand je fais ça, ça dit que les paramètres ne sont pas définis.
Tyler Spears
@Tyler Spears, pouvez-vous publier votre code dans votre question? Vous avez un guillemet simple en dehors des parenthèses de fonction.
artwork21
Absolument, j'ai mis à jour ma question pour montrer mon code.
Tyler Spears