Создание атласа или альбома карт с картами-врезками
Для создания в едином документе карты атласа или альбома, содержащего карты-врезки на различных страницах, могут использоваться картографические скрипты в сочетании с функцией Многостраничной компоновки. Можно задать пользовательские правила, регулирующие не только видимость карты-врезки, но и ее размер, положение и экстент.
Создание атласа или альбома карт
Первым делом следует создать документ карты и настроить Многостраничную компоновку. Для всех страниц карты можно разработать общую компоновку.
Добавление карты-врезки к компоновке
После разработки основной компоновки для всех страниц, нужно вставить фрейм данных, который будет служить картой-врезкой.
- В пункте меню Вставка (Insert) выберите Фрейм данных (Data Frame).
- Выберите уникальное имя для нового фрейма данных. Это имя будет служить для идентификации фрейма данных в скрипте экспорта.
- Щелкните ОК, чтобы закрыть диалоговое окно Свойства фрейма данных (Data Frame Properties).
- Продолжите работу над картой-врезкой, добавив необходимые слои и условные обозначения.
Настройка карты-врезки для отдельной страницы
Настройка экстента, размера и положения карты-врезки для отдельных страниц будет производиться в ходе экспорта карты. Необходимо заранее знать эти значения, чтобы воспользоваться ими при написании скрипта. В первую очередь, необходимо решить, на каких страницах будут располагаться карты-врезки. Далее, следует открыть каждую из этих страниц, настроить компоновку желаемым образом и записать соответствующие настройки, которые затем войдут в скрипт экспорта.
Ниже приведены этапы, которыми следует руководствоваться при записи необходимой информации о карте-врезке для одной из страниц карты. Эти этапы следует повторить для каждой страницы, которая будет содержать карту-врезку.
- Откройте страницу, на которой будет располагаться карта-врезка. Запишите значение индекса для этой страницы, открыв панель инструментов Многостраничная компоновка (Data Driven Pages) и сменив отображение на Показать страницу (Show Page).
- Расположите фрейм данных карты-врезки на странице, настройте его размеры и экстент.
- Запишите текущие значения верхней (Top), левой (Left), правой (Right) и нижней (Bottom) координаты экстента карты-врезки. Эту информацию можно получить таким образом: откройте диалоговое окно Свойства фрейма данных (Data Frame Properties), перейдите на закладку Фрейм данных (Data Frame) и измените тип экстента на Фиксированный экстент (Fixed Extent). Появятся значения координат.
- Запишите всю необходимую информацию и измените тип экстента назад на Автоматический (Automatic). Если тип экстента будет отличаться от Автоматического (Automatic), его нельзя будет изменить с помощью скрипта. Все прочие типы экстента являются фиксированными, при попытке их изменения во время выполнения скрипта произойдет ошибка.
- Перейдите на закладку Размер и положение (Size and Position) и запишите значения положения фрейма по X и Y. Помните, что это координаты текущей точки якоря. При изменении точки якоря все эти значения потеряют актуальность.
- Запишите также значения высоты и ширины фрейма данных.
- Закройте диалоговое окно Свойства фрейма данных (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()
Возможно, потребуется менять от страницы к странице также и другие элементы или настройки, например, текст масштаба для карты-врезки. В таком случае, запишите информацию и об этих элементах, добавляя их на карту по такой же методике. Затем добавьте соответствующий код в скрипт, чтобы нужным образом удалять или добавлять эти элементы при экспорте карты.
Добавление индикатора экстента
Индикатор экстента добавляется на основную карту и служит для выделения области, показанной на карте-врезке.
- Откройте диалоговое окно Свойства фрейма данных (Data Frame Properties) основной карты и перейдите на закладку Индикаторы экстента (Extent Indicators).
- Добавьте фрейм данных карты-врезки в список.
- Настройте внешний вид индикатора при помощи доступных настроек.
Подготовка документа карты к экспорту
После того, как вы создали индикатор экстента и записали всю необходимую информацию для скрипта, настройте документ карты таким образом, чтобы индикатор экстента и карта-врезка не появлялись на каждой странице.
- Уберите фрейм данных с картой-врезкой из области печати страницы.
- Измените экстент карты-врезки так, чтобы он был намного больше экстента основного фрейма данных, – тогда индикатор экстента не будет отображаться на лишних страницах.
- Сохраните документ карты
Написание скрипта экспорта
Ниже приведен образец скрипта, которым осуществляется экспорт атласа с картами-врезками на страницах 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()
В заключение, ход работы, приведенный в этом разделе, позволяет создавать в едином документе карты атласы или альбомы, в которых карты-врезки или другие особые объекты присутствуют только на определенных страницах.