Suite

Étiqueter les points avec des nombres et ajouter une étiquette de texte à la légende en tant que liste dans ArcMap ?

Étiqueter les points avec des nombres et ajouter une étiquette de texte à la légende en tant que liste dans ArcMap ?


Je développe une série de cartes dans ArcGIS 10 et je n'ai pas beaucoup d'espace pour étiqueter les entités sur la carte. C'est pourquoi j'ai pensé que je numéroterais chaque entité de la trame de données, puis exporterais les étiquettes sous forme de liste et les mettrais dans la légende de la carte.

Ainsi, une liste de la manière suivante est créée et ajoutée à la légende

SO 1 Etiquette 2 Etiquette 3 Etiquette

Mon flux de travail actuel pour ce faire est le suivant : j'ajoute un attribut « numéro » manuellement par exemple pour tous les points SO orange, puis je les étiquette avec le numéro. Je l'exporte ensuite sous forme de tableau dans Excel, puis dans Illustrator pour générer un joli tableau et le recopier dans ArcMap sous forme d'image.

Existe-t-il un moyen plus simple de le faire dans ArcGIS, j'ai beaucoup de cartes à faire et le faire manuellement prend beaucoup de temps ? Pouvez-vous penser à une meilleure solution pour le faire?


Il y a 2 scripts au travail.

Crée d'abord la pièce jointe - fichier texte - dans le polygone de pages pilotées par les données stockées dans FGDB, nom dans TOC = Pages.

Données provenant de la table de pièces jointes à partir de la couche appelée « pnts », la requête de définition de page doit être active. Pour contrôler l'apparence du futur tableau, vous aurez besoin d'un élément de texte dans votre mise en page appelé TABLE. Voici ce que l'outil attend comme paramètres :

Les valeurs de la liste des champs sont des noms de champs de 'pnts' que vous souhaitez afficher :

Oui, vous devez modifier la liste en fonction de vos besoins.

Le script parcourt les pages et effectue :

  • Supprimer la pièce jointe existante
  • Créez une pièce jointe à partir des valeurs extraites de la table pnts dans le DDP actuel.

    (Je crée généralement un petit tampon autour des pages, le croise avec des pnts. Cela crée 2 pnts où les tampons se chevauchent)

J'utilise la police Calibri Light pour le texte dans la TABLE.

Scénario:

importer arcpy, traceback, os, sys, numpy depuis arcpy importer env env.overwriteoutput=True folder=arcpy.GetParameterAsText(0) allNames=arcpy.GetParameterAsText(1) fldNames=allNames.split(';') table=r'in_memory attach' #Reference MXD et les calques essayez : def showPyMessage() : arcpy.AddMessage(str(time.ctime()) + " - " + message) def isLayerExist (mxd,lName): couches = arcpy.mapping.ListLayers( mxd,lName) if len(layers)==0: lever NameError,'
'+lName + " layer not found. Exiting… "+'
' result=layers[0] return result mxd = arcpy.mapping. MapDocument("CURRENT") thePagesLayer = isLayerExist(mxd,"Pages") thePointsLayer = isLayerExist(mxd,"pnts") ddp = mxd.dataDrivenPages fld = ddp.pageNameField.name Page_Names=arcpy.da.TableToNumPyLayer,(thedPageNumPyLayerray pour elm dans arcpy.mapping.ListLayoutElements(mxd): if elm.name == "TABLE": tableTxt = elm x=elm.elementPositionX y=elm.elementPositionY ## CHOSE À CHANGER !!!!! formatS="{:5d}{:8.2f}{:8.2f}{:8.2f}{:8.2f}{:8.2f}{:8.2f}{:8.2f}" pour l'ID de page dans range(1, ddp.pageCount+1) : arcpy.AddMessage(pageID) ddp.currentPageID = pageID arcpy.RefreshActiveView() fOut=folder+os.sep+Page_Names[pageID-1][0]+.txt" arcpy.SelectLayerByAttribute_management(thePointsLayer ) linkValue=Page_Names[pageID-1][0] attachName=Page_Names[pageID-1][0]+".txt" arcpy.CreateTable_management('in_memory', 'attach') arcpy.AddField_management(table, "Page", "TEXT", "", "", 25) arcpy.AddField_management(table, "Page2", "TEXT", "", "", 250) curT = arcpy.da.InsertCursor(table,("Page"," Page2")) theRow=(linkValue,fOut) curT.insertRow(theRow) arcpy.RemoveAttachments_management(thePagesLayer, fld, table, "Page") tbl=arcpy.da.TableToNumPyArray(thePointsLayer,fldNames) tbl=numpy.sort(tbl ) si len(tbl)>0 : m=0 pour rec dans tbl : ## CHOSE A CHANGER !!!!! bit=formatS.format(rec[0],rec[1],rec[2],rec[4],rec[6],rec[3],rec[5],rec[7]) textB+=bit+' 
' m+=1 si m>54 : break tableTxt.text = textB arcpy.SelectLayerByAttribute_management(thePointsLayer, "CLEAR_SELECTION") tableTxt.elementPositionX=x tableTxt.elementPositionY=y arcpy.RefreshActiveView() fileO = open(fOut, 'w ') fileO.write(textB) fileO.close() arcpy.AddAttachments_management(thePagesLayer, fld, table, "Page", "Page2") arcpy.Delete_management(fOut) sauf : message = "
*** ERREURS PYTHON * ** "; showPyMessage() message = "Informations de suivi Python : " + traceback.format_tb(sys.exc_info()[2])[0] ; showPyMessage() message = "Informations d'erreur Python : " + str(sys.exc_type)+ " : " + str(sys.exc_value) + "
" ; showPyMessage()

Exemple de sortie que j'utilise pour contrôler à quoi ressembleront les impressions :

Notez que la partie grise est un élément séparé ici. Vous devez également modifier la ligne de format de texte dans le script ci-dessus.

Le deuxième script effectue l'impression (exportation au format pdf, en utilisant le nom DDP), suppose que le nom de la couche DDP = Pages (celui avec pièce jointe) et qu'il y a un élément de texte appelé TABLE dans la mise en page

import arcpy, traceback, os, sys from arcpy import env env.overwriteoutput=True folder=arcpy.GetParameterAsText(0) aTable=arcpy.GetParameterAsText(1) #Reference MXD et calques essayez : def showPyMessage() : arcpy.AddMessage(str (time.ctime()) + " - " + message) def isLayerExist (mxd,lName): couches = arcpy.mapping.ListLayers(mxd,lName) if len(layers)==0: lever NameError,'
' +lName + " layer not found. Exiting… "+'
' result=layers[0] return result mxd = arcpy.mapping.MapDocument("CURRENT") thePagesLayer = isLayerExist(mxd,"Pages") ddp = mxd. dataDrivenPages fld = ddp.pageNameField.name diction={} both=arcpy.da.TableToNumPyArray(thePagesLayer, (fld,"OBJECTID")) pour la ligne dans les deux : diction[row[0]]=row[1] Page_Names=[ row[0] for row in both] del both #Référence des éléments de mise en page pour elm dans arcpy.mapping.ListLayoutElements(mxd): if elm.name == "TABLE": tableTxt = elm x=elm.elementPositionX y=elm. elementPositionY pour pageID dans range(1,ddp.pageCount+1): ## pour pageID dans range(1,3): ddp.currentPageID = pageID baseName=Page_Names[pageID-1] OID=diction[baseName] query="REL_OBJECTID = %s" %str(int(OID)) avec arcpy.da.SearchCursor(aTable,'DATA',query) comme curseur : pour la ligne dans le curseur : binaryRep = row[0] textB=binaryRep.tobytes() if len(textB)>0 : tableTxt.text = textB else : tableTxt.text = " " tableTxt.elementPositionY=y arcpy.RefreshActiveView() ddp .exportToPDF(folder+os.sep + baseName + ".pdf","CURRENT") arcpy.AddMessage('Exported %i %s' %(pageID,baseName)) sauf : message = "
*** ERREURS PYTHON *** " ; showPyMessage() message = "Informations de suivi Python : " + traceback.format_tb(sys.exc_info()[2])[0] ; showPyMessage() message = "Informations d'erreur Python : " + str(sys.exc_type)+ " : " + str(sys.exc_value) + "
" ; showPyMessage()

Dans l'exemple ci-dessus, les points sont étiquetés par SectionID et le tableau fournit une référence parfaite.

Ce couple m'a fait gagner des semaines de temps...

J'utilise 2 scripts car le formatage est une partie difficile, j'exécute donc le premier script avec seulement 2 couches - des points et des pages sur un mxd très basique. La seconde fonctionne bien et je l'exécute sur la carte avec plusieurs couches, une symbologie triée, etc.

Il s'agit du coin supérieur droit de l'une des pages de sortie :


Voici les étapes pour obtenir un numéro de clé à côté de votre étiquette dans une légende dynamique.

Vous symbolisez comme vous le souhaitez sur la carte principale, puis copiez la couche pour créer une couche factice pour la légende où il n'y a pas de symbolisation mais où toutes les entités sont répertoriées par nom ou par le champ de votre choix. Voir ci-dessous, la couche symbolisée en bas et la couche supérieure n'a pas de symbolisation, mais toutes les valeurs de nom sont ajoutées.

Double-cliquez sur la couche de légende, la couche de POI supérieure, et ajoutez une description à chaque valeur. Onglet Symbologie > Cliquez avec le bouton droit sur Valeur ou Étiquette > Modifier la description et saisissez le nombre. C'est une partie très manuelle, mais si vous avez une couche pour toute votre série de cartes, cela en vaudra la peine. Si vous avez beaucoup de couches pour cette procédure, vous devrez peut-être examiner l'une des autres solutions répertoriées.

Ajoutez une légende et n'incluez que la couche de légende. Faites un clic droit sur Légende > Propriétés > onglet Éléments > cliquez sur le calque de légende > Style et choisissez celui mis en évidence ici.

Cliquez ensuite sur Propriétés pour modifier la configuration de la description de l'étiquette comme vous le souhaitez. Pour obtenir ce qui est montré dans mon image finale ci-dessous, utilisez ces paramètres.

De retour dans l'onglet Éléments pour la police, choisissez Appliquer à la description de la classe, mettez-la en gras et justifiée à droite.

Pour limiter la légende à ce qui se trouve sur chaque carte, assurez-vous de cocher "Afficher uniquement les classes visibles dans l'étendue actuelle de la carte".

J'espère que cela a du sens.


Voir la vidéo: Viewshed analysis in ARC gis