Erstellen einer Kartensammlung mit Nebenkarten
Kartenskripte können in Kartenserien integriert werden, um eine Kartensammlung zu erstellen, die auf verschiedenen Seiten benutzerdefinierte Nebenkarten enthält, unter Verwendung eines einzigen Kartendokuments. Die benutzerdefinierte Logik kann eingesetzt werden, um sowohl die Sichtbarkeit der Nebenkarte als auch ihre Größe, Position und Ausdehnung zu steuern.
Erstellen einer Kartensammlung
Der erste Schritt ist das Erstellen des Kartendokuments und das Einrichten der Kartenserie. Sie sollten ein Basislinien-Layout entwerfen, das für alle Seiten gilt.
Hinzufügen der Nebenkarte zum Layout
Nachdem Sie das grundlegende Seitenlayout entworfen haben, fügen Sie einen Datenrahmen ein, der als Nebenkarte dient.
- Öffnen Sie das Menü Einfügen, und klicken Sie auf Datenrahmen.
- Geben Sie dem Datenrahmen einen eindeutigen Namen. Mit diesem Namen wird der Datenrahmen im Exportskript identifiziert.
- Klicken Sie auf OK, um das Dialogfeld Eigenschaften: Datenrahmen zu schließen.
- Fahren Sie mit der Erstellung der Nebenkarte fort, indem Sie die erforderlichen Layer hinzufügen und sie nach Bedarf mit Symbolen versehen.
Einrichten der benutzerdefinierten Nebenkarten für einzelne Seiten
Da die Ausdehnung, Größe und Position der Nebenkarte beim Export für einzelne Seiten festgelegt werden, müssen Sie diese Werte vorab kennen, damit Sie sie im Exportskript verwenden können. Das bedeutet, dass Sie zuerst entscheiden müssen, welche Seiten eine Nebenkarte enthalten sollen. Anschließend müssen Sie zu jeder dieser Seiten navigieren, das Layout so einrichten, wie es im Endprodukt dargestellt werden sollen, und dann die entsprechenden Einstellungen aufzeichnen, um sie im endgültigen Skript zu verwenden.
Die folgenden Schritte leiten Sie durch den Prozess des manuellen Aufzeichnens der erforderlichen Nebenkarteninformationen für eine Seite in der Kartenserie. Diese Schritte müssen für jede Seite wiederholt werden, die eine Nebenkarte enthält.
- Navigieren Sie zu einer Seite, die eine Nebenkarte enthält. Erfassen Sie den Indexwert der Seite, indem Sie die Werkzeugleiste Kartenserie öffnen und die Anzeige in Seite anzeigen ändern.
- Bestimmen Sie die Position und Größe des Nebenkarten-Datenrahmens auf der Seite, und legen Sie die Ausdehnung fest.
- Zeichnen Sie die Werte für Oben, Unten, Links und Rechts der aktuellen Ausdehnung der Nebenkarte auf. Um diese Informationen anzuzeigen, öffnen Sie das Dialogfeld Eigenschaften: Datenrahmen der Nebenkarte, klicken auf die Registerkarte Datenrahmen und ändern die Ausdehnung in Feste Ausdehnung, damit die Koordinatenwerte angezeigt werden.
- Zeichnen Sie die benötigten Informationen auf, und ändern Sie die Ausdehnung zurück in Automatisch. Wenn die Ausdehnung auf einen anderen Wert als Automatisch gesetzt ist, können Sie sie im Skript nicht ändern. Die anderen Ausdehnungstypen sind fest und führen zu einem Laufzeitfehler.
- Klicken Sie auf die Registerkarte Größe und Position, und zeichnen Sie die X- und Y-Positionswerte auf. Beachten Sie, dass diese den aktuellen Ankerpunkt widerspiegeln und aktualisiert werden müssen, falls sich der Ankerpunkt ändert.
- Zeichnen Sie außerdem die Werte für die Breite und Höhe des Datenrahmens auf.
- Schließen Sie das Dialogfeld Eigenschaften: Datenrahmen, und achten Sie dabei darauf, keine ungewollten Änderungen zu übernehmen.
Sie können all diese Informationen manuell aufzeichnen oder das folgende Skript im ArcMap Python-Fenster ausführen, um die Informationen in eine Textdatei zu schreiben. Sie müssen ggf. die Variablennamen anpassen, aber die Informationen werden so geschrieben, dass Sie sie ganz einfach kopieren und in Ihr Skript einfügen können.
Der folgende Codeblock kann im ArcMap Python-Fenster ausgeführt werden; er schreibt die Informationen über das aktuelle Seitenlayout in eine angegebene Textdatei.
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()
Es gibt möglicherweise weitere Elemente und Einstellungen, die Sie je nach Seite ändern möchten, z. B. den Maßstabstext für die Nebenkarte. Befolgen Sie dazu die für die Nebenkarte beschriebenen Schritte, um diese Elemente zur Karte hinzuzufügen, und zeichnen Sie die entsprechenden Informationen auf. Fügen Sie anschließend den Code zum Skript hinzu, um diese Elemente nach Bedarf beim Export hinzuzufügen oder zu entfernen.
Hinzufügen eines Ausdehnungsindikators
Sie können einen Ausdehnungsindikator zur Hauptkarte hinzufügen, um den Bereich hervorzuheben, der auf der Nebenkarte dargestellt ist.
- Öffnen Sie das Dialogfeld Eigenschaften: Datenrahmen der Hauptkarte, und klicken Sie auf die Registerkarte Ausdehnungsindikatoren.
- Hinzufügen des Nebenkarten-Datenrahmens
- Verwenden Sie die verfügbaren Optionen, um das Erscheinungsbild festzulegen.
Vorbereiten des Kartendokuments für den Export
Nachdem Sie den Ausdehnungsindikator erstellt und die erforderlichen Informationen für das Skript aufgezeichnet haben, richten Sie das Kartendokument so ein, dass der Ausdehnungsindikator oder die Nebenkarte nicht auf jeder Seite angezeigt wird.
- Verschieben Sie den Datenrahmen, der die Nebenkarte enthält, aus dem druckbaren Bereich der Seite.
- Ändern Sie die Ausdehnung der Nebenkarte so, dass sie sehr viel größer als die Ausdehnung des Hauptdatenrahmens ist, damit der Ausdehnungsindikator nicht auf den Seiten angezeigt wird, auf denen Sie es nicht möchten.
- Speichern Sie das Kartendokument.
Schreiben eines Exportskripts
Nachfolgend sehen Sie ein Beispielskript, das eine Kartensammlung mit Nebenkarten auf den Seiten 1 und 3 exportiert.
Das folgende Skript exportiert eine Kartensammlung mit Nebenkarten auf den Seiten 1 und 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()
Zusammenfassung: Mithilfe dieses Arbeitsablaufs können Sie Kartensammlungen mit Nebenkarten oder anderen speziellen Features auf bestimmten Seiten anhand eines einzigen Kartendokuments erstellen.