マップ スクリプトをデータ ドリブン ページと統合して、1 つのマップ ドキュメントを使用しながら、複数のページにカスタム差し込みマップを組み込んだマップ ブックを作成することができます。カスタム ロジックを導入すると、差し込みマップの表示設定だけでなく、そのサイズ、場所、範囲も制御できます。
マップ ブックの作成
最初の手順は、マップ ドキュメントを作成し、データ ドリブン ページを設定することです。すべてのページが共有するベースライン レイアウトを設計できます。
差し込みマップのレイアウトへの追加
基本的なページ レイアウトができたら、差し込みマップ用のデータ フレームを挿入する必要があります。
- [挿入] メニューをクリックして、[データ フレーム] を選択します。
- データ フレームに一意の名前を付けます。この名前は、エクスポート スクリプト内でデータ フレームを識別するために使用されます。
- [OK] をクリックして [データ フレーム プロパティ] ダイアログ ボックスを閉じます。
- 必要なレイヤーを追加したり、必要に応じてシンボル化したりして、差し込みマップを引き続き作成します。
個別ページ用のカスタム差し込みマップの設定
差し込みマップの範囲、サイズ、位置は、エクスポート中は個別ページに対して設定されるため、これらの値をエクスポート スクリプト内で使用できるように、事前に知っておく必要があります。つまり、差し込みマップを組み込むページを最初に決めておく必要があります。次に、それらのページに移動し、最終製品での表示に合わせてレイアウトを設定してから、最終スクリプトに使用する適切な設定を記録する必要があります。
次の手順は、マップ シリーズ内にある 1 つのページにおいて、必要な差し込みマップ情報を手動で記録するプロセスの概要を示したものです。差し込みマップのある各ページに対して、これらの手順を繰り返す必要があります。
- 差し込みマップのあるページに移動します。[データ ドリブン ページ] ツールバーを開き、表示を [ページの表示] に変更して、ページのインデックス値を記録します。
- 差し込みマップのデータ フレームの位置、サイズ、範囲を設定します。
- 差し込みマップの現在の範囲の [上]、[左]、[右]、[下] の値を記録します。この情報を調べるには、差し込みマップの [データ フレーム プロパティ] ダイアログ ボックスを開き、[データ フレーム] タブをクリックしてから、範囲を [固定範囲] に変更して、座標値を表示します。
- 必要な情報を記録し、範囲を [自動] に戻します。範囲が [自動] 以外に設定されている場合、スクリプトで範囲を変更できません。それ以外の範囲のタイプである固定にすると、ランタイム エラーとなります。
- [サイズと位置] タブをクリックして、位置の X 値と Y 値を記録します。これらは現在のアンカー位置を反映していて、アンカー位置が変更された場合は更新する必要があるので注意してください。
- データ フレームの幅と高さの値も記録します。
- 不要な変更が適用されないように注意して、[データ フレーム プロパティ] ダイアログ ボックスを閉じます。
表示範囲枠の追加
メイン マップに表示範囲枠を追加して、差し込みマップ内に表示されたエリアをハイライト表示することができます。
- メイン マップの [データ フレーム プロパティ] ダイアログ ボックスを開き、[表示範囲枠] タブをクリックします。
- [差し込みマップ] データ フレームを追加します。
- オプションを使用して、外観を設定します。
マップ ドキュメントのエクスポートの準備
範囲表示枠を作成し、スクリプトに必要な情報を記録したら、範囲表示枠や差し込みマップがすべてのページに表示されないように、マップ ドキュメントを設定します。
- 差し込みマップのデータ フレームをページの印刷可能エリア外に移動します。
- 特定のページで範囲表示枠が表示されないように、差し込みマップの範囲をメイン データ フレームよりも十分大きな範囲に変更します。
- マップ ドキュメントを保存します。
エクスポート スクリプトの記述
1 ページと 3 ページに差し込みマップのあるマップ ブックをエクスポートするスクリプトの例を次に示します。
次のスクリプトは、1 ページと 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()
こうして、このワークフローに従うと、1 つのマップ ドキュメントを使用して、差し込みマップや他の特殊なフィーチャが特定のページにあるマップ ブックを作成することができます。