差し込みマップのあるマップ ブックの作成

マップ スクリプトをデータ ドリブン ページと統合して、1 つのマップ ドキュメントを使用しながら、複数のページにカスタム差し込みマップを組み込んだマップ ブックを作成することができます。カスタム ロジックを導入すると、差し込みマップの表示設定だけでなく、そのサイズ、場所、範囲も制御できます。

差し込みマップのあるマップ ブックの単純な画像

マップ ブックの作成

最初の手順は、マップ ドキュメントを作成し、データ ドリブン ページを設定することです。すべてのページが共有するベースライン レイアウトを設計できます。

データ ドリブン ページとは

差し込みマップのレイアウトへの追加

基本的なページ レイアウトができたら、差し込みマップ用のデータ フレームを挿入する必要があります。

手順:
  1. [挿入] メニューをクリックして、[データ フレーム] を選択します。
  2. データ フレームに一意の名前を付けます。この名前は、エクスポート スクリプト内でデータ フレームを識別するために使用されます。
  3. [OK] をクリックして [データ フレーム プロパティ] ダイアログ ボックスを閉じます。
  4. 必要なレイヤを追加したり、必要に応じてシンボル化したりして、差し込みマップを引き続き作成します。

個別ページ用のカスタム差し込みマップの設定

差し込みマップの範囲、サイズ、位置は、エクスポート中は個別ページに対して設定されるため、これらの値をエクスポート スクリプト内で使用できるように、事前に知っておく必要があります。つまり、差し込みマップを組み込むページを最初に決めておく必要があります。次に、それらのページに移動し、最終製品での表示に合わせてレイアウトを設定してから、最終スクリプトに使用する適切な設定を記録する必要があります。

次の手順は、マップ シリーズ内にある 1 つのページにおいて、必要な差し込みマップ情報を手動で記録するプロセスの概要を示したものです。差し込みマップのある各ページに対して、これらの手順を繰り返す必要があります。

手順:
  1. 差し込みマップのあるページに移動します。[データ ドリブン ページ] ツールバーを開き、表示を [ページの表示] に変更して、ページのインデックス値を記録します。
    [データ ドリブン ページ] ツールバーのドロップダウン メニュー
  2. 差し込みマップのデータ フレームの位置、サイズ、範囲を設定します。
  3. 差し込みマップの現在の範囲の [上]、[左]、[右]、[下] の値を記録します。この情報を調べるには、差し込みマップの [データ フレーム プロパティ] ダイアログ ボックスを開き、[データ フレーム] タブをクリックしてから、範囲を [固定範囲] に変更して、座標値を表示します。
    [データ フレーム プロパティ] ダイアログ ボックスの [データ フレーム] タブの [固定範囲] オプション
  4. 必要な情報を記録し、範囲を [自動] に戻します。範囲が [自動] 以外に設定されている場合、スクリプトで範囲を変更できません。それ以外の範囲のタイプである固定にすると、ランタイム エラーとなります。
  5. [サイズと位置] タブをクリックして、位置の X 値と Y 値を記録します。これらは現在のアンカー位置を反映していて、アンカー位置が変更された場合は更新する必要があるので注意してください。
  6. データ フレームの幅と高さの値も記録します。
  7. 不要な変更が適用されないように注意して、[データ フレーム プロパティ] ダイアログ ボックスを閉じます。

注意注意:

すべての情報は手動で記録できますが、次のスクリプトを ArcMap Python ウィンドウ内で実行して、情報をテキスト ファイルに書き込むこともできます。変数名は調整する必要があるかもしれませんが、情報はスクリプトにコピーおよび貼り付けするだけで済むように書き込まれます。

次のコード ブロックを ArcMap Python ウィンドウ内で実行すると、現在のページ レイアウトに関する情報が指定したテキスト ファイルに書き込まれます。

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()
注意注意:

差し込みマップの縮尺テキストなど、ページごとに変更したいエレメントや設定がある場合もあります。その場合、差し込みマップに対して以下のような手順を実行して、エレメントをマップに追加し、その情報を記録します。そして、コードをスクリプトに追加し、エクスポート中にこれらのエレメントを必要に応じて追加または削除します。

表示範囲枠の追加

メイン マップに表示範囲枠を追加して、差し込みマップ内に表示されたエリアをハイライト表示することができます。

手順:
  1. メイン マップの [データ フレーム プロパティ] ダイアログ ボックスを開き、[表示範囲枠] タブをクリックします。
  2. [差し込みマップ] データ フレームを追加します。
    [これらのデータ フレームの表示範囲枠を表示] リストに追加されたデータ フレーム
  3. オプションを使用して、外観を設定します。

マップ ドキュメントのエクスポートの準備

範囲表示枠を作成し、スクリプトに必要な情報を記録したら、範囲表示枠や差し込みマップがすべてのページに表示されないように、マップ ドキュメントを設定します。

手順:
  1. 差し込みマップのデータ フレームをページの印刷可能エリア外に移動します。
  2. 特定のページで範囲表示枠が表示されないように、差し込みマップの範囲をメイン データ フレームよりも十分大きな範囲に変更します。
    差し込みマップがページ外に位置し、大きな範囲にズームされたページ レイアウトの例
  3. マップ ドキュメントを保存します。

エクスポート スクリプトの記述

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 つのマップ ドキュメントを使用して、差し込みマップや他の特殊なフィーチャが特定のページにあるマップ ブックを作成することができます。

関連トピック

5/10/2014