Création d'un atlas avec cartes en encart
Un script de carte peut être intégré à des pages dynamiques afin de créer un atlas comportant des cartes en encart personnalisées sur différentes pages, tout en utilisant une carte unique. Une logique personnalisée peut être utilisée afin de contrôler non seulement la visibilité de la carte en encart, mais aussi ses dimensions, son emplacement et son étendue.
Création de votre atlas
La première étape consiste à créer une carte et à définir des pages dynamiques. Il est recommandé de concevoir une mise en page de base qui sera partagée par toutes les pages.
Ajout d'une carte en encart à la mise en page
Après avoir défini une mise en page de base, vous devez insérer un bloc de données qui servira de carte en encart.
- Ouvrez le menu Insérer et choisissez Bloc de données.
- Donnez un nom unique au bloc de données. Ce nom servira à identifier le bloc de données dans le script d'exportation.
- Cliquez sur OK pour fermer la boîte de dialogue Propriétés du bloc de données.
- Poursuivez la création de votre carte en encart en ajoutant les couches nécessaires et en leur attribuant les symboles désirés.
Configuration de cartes en encart personnalisées pour des pages individuelles
Puisque l'étendue, les dimensions et la position de la carte en encart sont définies pour des pages individuelles durant l'exportation, vous devez connaître ces valeurs à l'avance afin de les utiliser dans votre script d'exportation. Cela signifie que vous devez d'abord choisir les pages qui comporteront une carte en encart. Vous devez ensuite accéder à chacune de ces pages, configurer la mise en page comme elle apparaîtra dans votre produit final, puis enregistrer les paramètres appropriés qui seront utilisés dans le script final.
Les étapes ci-dessous décrivent le processus d'enregistrement manuel des informations sur la carte en encart pour une page dans la série de cartes. Ces étapes doivent être répétées pour chaque page contenant une carte en encart.
- Accédez à une page qui contiendra une carte en encart. Enregistrez la valeur d'index de la page en ouvrant la barre d'outils Pages dynamiques et en choisissant l'option d'affichage Afficher la page.
- Positionnez et redimensionnez le bloc de données de la carte en encart sur votre page et définissez son étendue.
- Enregistrez les coordonnées supérieure, inférieure, gauche et droite de l'étendue actuelle de la carte en encart. Pour trouver cette information, ouvrez la boîte de dialogue Propriétés du bloc de données de la carte en encart, cliquez sur l'onglet Bloc de données, puis réglez l'étendue à Emprise constante afin que les coordonnées soient affichées.
- Enregistrez l'information dont vous avez besoin, puis rétablissez l'étendue Automatique. Si l'étendue est réglée à une valeur autre que Automatique, vous ne pourrez pas la changer dans un script. Les autres types d'étendue sont fixes, et provoqueront une erreur d'exécution.
- Cliquez sur l'onglet Taille et position et enregistrez les valeurs de position x et y. Gardez à l'esprit que ces valeurs désignent le point d'ancrage courant et qu'elles devront être mises à jour si le point d'ancrage est ultérieurement modifié.
- Enregistrez également les valeurs de largeur et hauteur du bloc de données.
- Fermez la boîte de dialogue Propriétés du bloc de données en vous assurant de ne pas appliquer de modifications non souhaitées.
Vous pouvez noter toutes ces valeurs manuellement ou exécuter le script ci-dessous dans la fenêtre Python d'ArcMap afin de consigner les données dans un fichier texte. Vous pourriez devoir modifier les noms des variables, mais l'information sera consignée de telle manière que vous pourrez simplement la copier et la coller dans votre script.
Le bloc de code ci-dessous peut être exécuté dans la fenêtre Python d'ArcMap, et il consignera l'information relative à la mise en page actuelle dans le fichier texte spécifié.
import os
# Create an output location variable
outputDirectory = r"C:\temp"
# Open a text file to append info to
insetTxt = outputDirectory + r"\insetInfo.txt"
FILE = open(insetTxt, "a")
try:
mxd = arcpy.mapping.MapDocument("current")
df = arcpy.mapping.ListDataFrames(mxd, "Inset*")[0]
ddp = mxd.dataDrivenPages
infoList = []
infoList.append("\n")
# The following is information you would like to record
# The text is written so it can be pasted directly into your script
# This example assumes that 'pgIndex' is the variable for the current page id
# and that 'dataFrame' is the variable for the data frame containing the inset map
infoList.append("if (pgIndex == " + str(ddp.currentPageID) + "):\n")
infoList.append("\tdataFrame.elementPositionX = " + str(df.elementPositionX) + "\n")
infoList.append("\tdataFrame.elementPositionY = " + str(df.elementPositionY) + "\n")
infoList.append("\tdataFrame.elementHeight = " + str(df.elementHeight) + "\n")
infoList.append("\tdataFrame.elementWidth = " + str(df.elementWidth) + "\n")
infoList.append("\tinsetExtent_" + str(ddp.currentPageID) + " = arcpy.Extent(" +
str(df.extent.XMin) + ", " + str(df.extent.YMin) + ", " +
str(df.extent.XMax) + ", " + str(df.extent.YMax) + ")" + "\n")
infoList.append("\tdataFrame.extent = insetExtent_" + str(ddp.currentPageID) + "\n")
FILE.writelines(infoList)
except:
print "Writing to file failed"
# Close the text file
FILE.close()
Vous pouvez également modifier d'autres éléments et paramètres dans des pages individuelles, par exemple le texte d'échelle pour la carte en encart. Pour cela, suivez des étapes semblables à celles décrites pour la carte en encart afin d'ajouter les éléments à votre carte et d'enregistrer leurs informations. Ajoutez ensuite le code à votre script afin d'ajouter ou de supprimer ces éléments au besoin durant l'exportation.
Ajout d'un indicateur d'étendue
Vous pouvez ajouter un indicateur d'étendue à votre carte principale pour mettre en évidence la zone figurant sur votre carte en encart.
- Ouvrez la boîte de dialogue Propriétés du bloc de données de votre carte principale et cliquez sur l'onglet Indicateurs d'étendue.
- Ajoutez le bloc de données de la carte en encart.
- Utilisez les options disponibles pour définir son apparence.
Préparation de la carte pour l'exportation
Après avoir créé votre indicateur d'étendue et enregistré les informations nécessaires à votre script, configurez la carte de manière à ne pas afficher l'indicateur d'étendue ou la carte en encart sur chaque page.
- Déplacez le bloc de données contenant la carte en encart hors de la zone imprimable de la page.
- Augmentez l'étendue de la carte en encart à une valeur dépassant largement celle de votre bloc de données principal afin que l'indicateur d'étendue n'apparaisse pas sur les pages où vous ne le souhaitez pas.
- Enregistrez votre carte.
Rédaction d'un script d'exportation
Voici un exemple de script qui exporte un atlas comportant des cartes en encart aux pages 1 et 3.
Le script ci-dessous exporte un atlas comportant des cartes en encart aux pages 1 et 3.
import arcpy, os
# Create an output directory variable
#
outDir = r"C:\Project\MapBook\final_output"
# Create a new, empty pdf document in the specified output directory
# This will be your final product
finalpdf_filename = outDir + r"\FinalMapBook.pdf"
if os.path.exists(finalpdf_filename): # Check to see if file already exists, delete if it does
os.remove(finalpdf_filename)
finalPdf = arcpy.mapping.PDFDocumentCreate(finalpdf_filename)
# Create a Data Driven Pages object from the mxd you wish to export
#
mxdPath = r"C:\Project\MapBook\zipCodePopulation.mxd"
tempMap = arcpy.mapping.MapDocument(mxdPath)
tempDDP = tempMap.dataDrivenPages
# Create objects for the layout elements that will be moving, e.g., inset data frame, scale text
dataFrame = arcpy.mapping.ListDataFrames(tempMap, "Inset Map")[0]
# Instead of exporting all pages at once, you will need to use a loop to export one at a time
# This allows you to check each index and execute code to add inset maps to the correct pages
#
for pgIndex in range(1, tempDDP.pageCount + 1, 1):
# Create a name for the pdf file you will create for each page
temp_filename = r"C:\Project\MapBook\temp_pdfs\MB_" + \
str(pgIndex) + ".pdf"
if os.path.exists(temp_filename):
os.remove(temp_filename)
# The following if statements check the current page index against given values
# If the current page index matches, it will execute code to set up that page
# If not, the page remains as is
# Note: If you created a text file containing this information, this is where
# you would paste in that code
# Code for setting up the inset map on the first page #
if (pgIndex == 1):
# Set position of inset map to place it on the page layout
dataFrame.elementPositionX = 0.5
dataFrame.elementPositionY = 0.6
# Set the desired size of the inset map for this page
dataFrame.elementHeight = 2.0
dataFrame.elementWidth = 2.0
# Set the desired extent for the inset map
insetExtent_1 = arcpy.Extent(-88.306778229417176, 41.590293951894907, -87.609922645465474, 42.300975912784295)
dataFrame.extent = insetExtent_1
# Code for setting up the inset map on the third page #
if (pgIndex == 3):
# Set up inset map
dataFrame.elementPositionX = 3.25
dataFrame.elementPositionY = 7
dataFrame.elementHeight = 2.45
dataFrame.elementWidth = 3.0
insetExtent_3 = arcpy.Extent(-83.889191535, 41.870516098, -82.875460656, 42.72572048)
dataFrame.extent = insetExtent_3
# Code to export current page and add it to mapbook
tempDDP.exportToPDF(temp_filename, "RANGE", pgIndex)
finalPdf.appendPages(temp_filename)
# Clean up your page layout by moving the data frame and resetting its extent after exporting the page
# This will reset the page to the basic layout before exporting the next page
#
dataFrame.elementPositionX = 10 # Move inset data frame off the page
dataFrame.scale = 350000000 # Change scale so extent indicator no longer visible in main data frame
arcpy.RefreshActiveView()
# Clean up
#
del tempMap
# Update the properties of the final pdf
#
finalPdf.updateDocProperties(pdf_open_view="USE_THUMBS",
pdf_layout="SINGLE_PAGE")
# Save your result
#
finalPdf.saveAndClose()
En conclusion, en suivant ce workflow, vous pouvez créer des atlas avec cartes en encart ou d'autres entités spéciales sur certaines pages à partir d'une seule carte.