Создание атласа или альбома карт с картами-врезками

Для создания в едином документе карты атласа или альбома, содержащего карты-врезки на различных страницах, могут использоваться картографические скрипты в сочетании с функцией Многостраничной компоновки. Можно задать пользовательские правила, регулирующие не только видимость карты-врезки, но и ее размер, положение и экстент.

Изображение образца атласа с картами-врезками

Создание атласа или альбома карт

Первым делом следует создать документ карты и настроить Многостраничную компоновку. Для всех страниц карты можно разработать общую компоновку.

Что такое многостраничная компоновка?

Добавление карты-врезки к компоновке

После разработки основной компоновки для всех страниц, нужно вставить фрейм данных, который будет служить картой-врезкой.

Шаги:
  1. В пункте меню Вставка (Insert) выберите Фрейм данных (Data Frame).
  2. Выберите уникальное имя для нового фрейма данных. Это имя будет служить для идентификации фрейма данных в скрипте экспорта.
  3. Щелкните ОК, чтобы закрыть диалоговое окно Свойства фрейма данных (Data Frame Properties).
  4. Продолжите работу над картой-врезкой, добавив необходимые слои и условные обозначения.

Настройка карты-врезки для отдельной страницы

Настройка экстента, размера и положения карты-врезки для отдельных страниц будет производиться в ходе экспорта карты. Необходимо заранее знать эти значения, чтобы воспользоваться ими при написании скрипта. В первую очередь, необходимо решить, на каких страницах будут располагаться карты-врезки. Далее, следует открыть каждую из этих страниц, настроить компоновку желаемым образом и записать соответствующие настройки, которые затем войдут в скрипт экспорта.

Ниже приведены этапы, которыми следует руководствоваться при записи необходимой информации о карте-врезке для одной из страниц карты. Эти этапы следует повторить для каждой страницы, которая будет содержать карту-врезку.

Шаги:
  1. Откройте страницу, на которой будет располагаться карта-врезка. Запишите значение индекса для этой страницы, открыв панель инструментов Многостраничная компоновка (Data Driven Pages) и сменив отображение на Показать страницу (Show Page).
    Ниспадающее меню на панели Многостраничная компоновка
  2. Расположите фрейм данных карты-врезки на странице, настройте его размеры и экстент.
  3. Запишите текущие значения верхней (Top), левой (Left), правой (Right) и нижней (Bottom) координаты экстента карты-врезки. Эту информацию можно получить таким образом: откройте диалоговое окно Свойства фрейма данных (Data Frame Properties), перейдите на закладку Фрейм данных (Data Frame) и измените тип экстента на Фиксированный экстент (Fixed Extent). Появятся значения координат.
    Опция Фиксированный экстент на закладке Фрейм данных окна Свойства Фрейма данных
  4. Запишите всю необходимую информацию и измените тип экстента назад на Автоматический (Automatic). Если тип экстента будет отличаться от Автоматического (Automatic), его нельзя будет изменить с помощью скрипта. Все прочие типы экстента являются фиксированными, при попытке их изменения во время выполнения скрипта произойдет ошибка.
  5. Перейдите на закладку Размер и положение (Size and Position) и запишите значения положения фрейма по X и Y. Помните, что это координаты текущей точки якоря. При изменении точки якоря все эти значения потеряют актуальность.
  6. Запишите также значения высоты и ширины фрейма данных.
  7. Закройте диалоговое окно Свойства фрейма данных (Data Frame Properties). Не забудьте отменить все нежелательные изменения.

ПримечаниеПримечание:

Вместо того, чтобы записывать всю эту информацию вручную, можно запустить следующий скрипт в окне Python в ArcMap, и все необходимые данные будут записаны в текстовый файл. Информация будет записана в таком виде, чтобы можно было сразу копировать ее в скрипт, может только потребоваться изменить имена переменных.

Ниже приведен код, который можно запустить из окна Python в ArcMap, чтобы записать информацию о компоновке текущей страницы в указанный текстовый файл.

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. Откройте диалоговое окно Свойства фрейма данных (Data Frame Properties) основной карты и перейдите на закладку Индикаторы экстента (Extent Indicators).
  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()

В заключение, ход работы, приведенный в этом разделе, позволяет создавать в едином документе карты атласы или альбомы, в которых карты-врезки или другие особые объекты присутствуют только на определенных страницах.

Связанные темы

9/11/2013