ConvertWebMapToMapDocument (arcpy.mapping)
Резюме
Конвертирует веб-карту (в формате JSON), которую вы хотите напечатать или экспортировать, в документ карты. Документ карты затем можно изменить перед печатью или экспортом.
Обсуждение
ArcGIS обеспечивает поддержку печати веб-карт с помощью веб-API ArcGIS. Функция ConvertWebMapToMapDocument конвертирует веб-карту, которую вы хотите напечатать или экспортировать, в документ карты. После преобразования карты документ содержит все элементы веб-карты. Например, свойства сервисных подслоев переносятся в подслои картографического сервиса в документе. Затем, документ карты, перед печатью или экспортом в распространенные форматы, такие как PDF, можно изменить.
Функция ConvertWebMapToMapDocument в основном предназначена для рабочих процессов, в которых необходимо изменить веб-карту с помощью функций arcpy.mapping. Она удобна для экспорта веб-карты с разными разрешениями или для печати страниц разных размеров, т.е. при использовании опций, которые не доступны в инструменте геообработки Экспорт веб-карты. Несколько примеров использования функции ConvertWebMapToMapDocument в рабочих процессах:
- Выгрузка сервисного слоя для локальных данных – в скриптах arcpy.mapping, сервисные слои можно идентифицировать по имени и выгрузить для использования в слоях, обращающихся к локальным данным. Это желательно сделать, если необходимы выходные данные в векторном формате, вместо слоев сервиса. Один из способов сделать это – использовать шаблоны документов карты, которые содержат векторные эквиваленты всех возможных сервисных слоев. После выполнения функции ConvertWebMapToMapDocument, просмотрите все слои выходного документа карты и удалите все слои, кроме векторных, которые соответствуют сервисным слоям в WebMap JSON.
- Экспорт в PDF и вставка в набор других PDF для создания атласа – документ карты можно экспортировать в виде PDF, затем загрузить в другой файл PDF, используя класс PDFDocument.
- Экспорт и печать карты крупного формата с высоким разрешением – функции экспорта arcpy.mapping поддерживают экспорт с различными размерами и разрешениями, включая экспорт крупных форматов с высокими DPI (например, более 600 DPI). Наложение заметок веб-карты также поддерживается при экспорте в крупном формате с высоком разрешением.
Если у вас есть скрипт Python, который готовит карту для печати, вы можете включить его в инструмент-скрипт геообработки. Теперь вы можете опубликовать инструмент-скрипт в качестве сервиса геообработки ArcGIS Server. Каждый веб-интерфейс API ArcGIS имеет задачу печати, которую вы можете использовать в веб-приложении. Задача печати имеет свойство url, которое указывает REST url созданного вами сервиса геообработки. Чтобы получить более подробную информацию об использовании веб-API ArcGIS, обратитесь к справочной системе платформы разработки по адресу http://resources.arcgis.com/content/web/web-apis. Более подробные сведения о сервисах геообработки см. в:
При использовании ConvertWebMapToMapDocument в сервисе геообработки в веб-API ArcGIS, имена параметров инструмента-скрипта должны совпадать с параметрами веб-API задачи Печать (Print Task):
Имя параметра | Тип данных | Описание |
---|---|---|
Web_Map_as_JSON | Строка | Представление JSON состояния карты для экспорта, как она отобразится в веб-приложении. См. спецификацию ExportWebMap, чтобы понять, как этот текст должен быть отформатирован. Веб-интерфейсы API ArcGIS (для JavaScript, Flex, Silverlight и т. д.) позволяют разработчикам легко получить эту строку JSON из карты. |
Output_File | Файлы | Имя выходного файла. Расширение файла зависит от параметра Формат (Format). |
Формат | Строка | Формат, в котором будет предоставлено изображение карты для печати. Приемлемы следующие строки. Например:
|
Layout_Template | Строка | Имя шаблона из списка или ключевое слово MAP_ONLY. Когда выбрано MAP_ONLY или передается пустая строка, выходная карта не содержит никаких окружающих объектов компоновки страницы (например, название, легенды, масштабную линейку и т. д.). |
Кроме того, можно добавить любое количество дополнительных пользовательских параметров. Возможность передачи дополнительных параметров в пользовательскую задачу печати позволяет вам собрать любое количество дополнительных параметров из веб-приложения и передать их в скрипт Python.
ConvertWebMapToMapDocument обычно используется при печати карт из веб-приложений. Если вы используете ArcGIS веб-API Печать, создавать JSON веб-карты не нужно; это сделает API. Однако прежде чем скрипт будет опубликован и использован в веб-API, его необходимо запустить локально. При локальном запуске скрипта можно использовать любую допустимую строку JSON. Строка JSON, похожая на то, что возвращает веб-приложение, может потребоваться для успешного выполнения скрипта. См. спецификацию ExportWebMap, чтобы понять, как этот текст должен быть отформатирован. Пример строки показан ниже:
{
"layoutOptions": {
"titleText": "Simple WebMap JSON example"
},
"operationalLayers": [
{
"url": "http://maps1.arcgisonline.com/ArcGIS/rest/services/USA_Federal_Lands/MapServer",
"visibility": true
}
],
"exportOptions": {
"outputSize": [
1500,
1500
]
},
"mapOptions": {
"extent": {
"xmin": -13077000,
"ymin": 4031000,
"xmax": -13023000,
"ymax": 4053000
}
},
"version": "1.4"
}
При запуске инструмента-скрипта, строку JSON можно скопировать и вставить во входной параметр Web_Map_as_JSON. Однако переносы строк необходимо удалить. Пример строки JSON с удаленными переносами строк:
{"layoutOptions": {"titleText": "Simple WebMap JSON example"},"operationalLayers": [{"url": "http://maps1.arcgisonline.com/ArcGIS/rest/services/USA_Federal_Lands/MapServer","visibility": true}],"exportOptions": {"outputSize": [1500,1500]},"mapOptions": {"extent": {"xmin": -13077000,"ymin": 4031000,"xmax": -13023000,"ymax": 4053000}},"version": "1.4"}
Для публикации вы можете оставить входной параметр Web_Map_as_JSON пустым, поскольку веб-web ArcGIS передаст в веб-приложение JSON веб-карты. Входной параметр Web_Map_as_JSON может быть оставлен пустым при условии, что скрипт Python был написан таким образом, чтобы он мог работать и при пустом входном параметре. Например, скрипт не ищет слои веб-карт по имени. Если скрипт не работает на сервере из-за ошибки, ее необходимо исправить локально, затем снова опубликовать его на сервере. Поэтому, перед публикацией рекомендуется убедиться, что скрипт работает локально, проверив его со строкой JSON подходящей веб-карты или использовав отладочный документ карты, который содержит все элементы, присутствующие в JSON веб-карты.
Как упоминалось выше, строка JSON, которая возвращается из веб-API ArcGIS, содержит полное описание состояния веб-карты. Объект layoutOptions в строке JSON требует дополнительного описания, поскольку он автоматически обновляет элементы компоновки, находящиеся в template_mxd. Например, если JSON имеет параметр titleText, а template_mxd имеет элемент динамического текста Title (заголовок), заголовок в компоновке шаблона документа карты будет обновлен значением titleText. Подробнее, см. раздел layoutOptions в спецификации ExportWebMap.
Когда вы включаете скрипт Python, использующий ConvertWebMapToMapDocument, в сервис геообработки, следует убедиться, что ArcGIS for Server имеет доступ к документам шаблонов карт, использующихся в веб-приложении. Лучше всего использовать папку, зарегистрированную в ArcGIS for Server. Дополнительные сведения о регистрации данных см. в:
При создании шаблонов документов карт в зарегистрированной папке лучше всего использовать относительные пути. Таким образом, ArcGIS for Server сможет найти данные в зарегистрированной папке относительно положения документов карты. Дополнительная информация приведена в разделе Как карта ссылается на данные.
При использовании ConvertWebMapToMapDocument, относительные пути к слоям должны указывать на данные в, ниже, или на один уровень выше пути template_mxd.
Если не использовать зарегистрированные папки, то шаблоны документов карт и данные будут упакованы и скопированы на сервер. Во время упаковки данные могут перемещаться и использоваться в качестве источника с соответствующими путями к структуре папок, которые не могут быть разрешены ConvertWebMapToMapDocument. Поэтому, рекомендуется использование зарегистрированных папок.
По умолчанию наложенные заметки или графика со стороны клиента из веб-приложения хранится в рабочей области в памяти. Рабочая область в памяти является временной и удаляется при закрытии приложения. Чтобы получить постоянную копию выходного документа карты, содержащего заметки, задайте notes_gdb; затем используйте инструмент геообработки Собрать карту (Consolidate Map) или Упаковать карту (Package Map), чтобы сделать копию выходного документа карты. Задавать параметр notes_gdb необходимо только в том случае, если вы планируете создать постоянную копию выходного документа карты. См. код в Примере 3 ниже. Если веб-карта не содержит заметок, можно использовать метод saveACopy из класса MapDocument, чтобы получить постоянную копию выходного документа карты.
Кроме того, см. обзор группы инструментов Печать (Printing), чтобы узнать о печати малых форматов (например, формата Letter). Эта группа инструментов содержит инструмент геообработки Экспорт веб-карты (Export Web Map). Задача, которая использует этот инструмент, устанавливается вместе с ArcGIS for Server. Экспорт веб-карты (Export Web Map) также поддерживает наложение заметок.
Прочтите следующие руководства. В них описывается весь процесс высококачественной печати/экспорта с помощью рабочего процесса ConvertWebMapToMapDocument: создание документов шаблонов карт, написание скрипта Python, создание сервиса геообработки и создание веб-приложения.
Синтаксис
Параметр | Объяснение | Тип данных |
webmap_json |
The web map for printing in JavaScript Object Notation (JSON). See the ExportWebMap JSON Specifications for more information. | String |
template_mxd | A string representing the path and file name to a map document (.mxd) to use as the template for the page layout. The contents of the web map will be inserted into the data frame that was active at the time the template_mxd was saved. Layers in the template_mxd's active data frame (and all other data frames) will be preserved in the output mapDocument. (Значение по умолчанию — None) | String |
notes_gdb | A string representing the path to a new or existing file geodatabase or an existing enterprise geodatabase connection where graphic features should be written. This parameter should only be used if graphic features from the web map JSON need to be preserved permanently. In most cases this parameter is not required as a temporary in-memory workspace will be used to store graphic features. This parameter lets you save graphic features to persistent storage, which is essential if you plan to use the map document for operations that require saving or loading from disk (for example, packaging or consolidating). The path must end with a .gdb or .sde extension. (Значение по умолчанию — None) | String |
extra_conversion_options | A dictionary of credentials for secured services. This parameter is required if the services in the web map JSON require a user name and password to view. Keys accepted in the dictionary are as follows:
An example of key value pairs is as follows:
(Значение по умолчанию — None) | Dictionary |
Тип данных | Объяснение |
tuple |
Возвращает именованный кортеж Python веб-карты и запрашивает свойства:
Внимание: ConvertWebMapToMapDocument создает временные документы карты (.mxd) в системной папке temp. В системах Windows Vista и Windows 7 она находится в C:\Users\<user name>\AppData\Local\Temp. Пользователи работают с документами карты в этой папке под свою ответственность. Чтобы удалить эти временные документы карты с помощью скрипта, см. раздел очистка в примерах кодов, приведенных ниже. |
Пример кода
В этом примере, скрипт считывает JSON веб-карты, выходной формат и шаблон документа карты. Затем, выходной документ карты экспортируется в PDF или PNG.
import arcpy
import os
import uuid
# The template location in the registered folder
templatePath = '//MyMachine/Austin/WebMap'
# Input web map json
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# Format for output
Format = arcpy.GetParameterAsText(1)
if Format == '#' or not Format:
Format = "PDF"
# Input Layout template
Layout_Template = arcpy.GetParameterAsText(2)
if Layout_Template == '#' or not Layout_Template:
Layout_Template = "Landscape11x17"
# Get the requested map document
templateMxd = os.path.join(templatePath, Layout_Template + '.mxd')
# Convert the web map to a map document
result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd)
mxd = result.mapDocument
# Use the uuid module to generate a GUID as part of the output name
# This will ensure a unique output name
output = 'WebMap_{}.{}'.format(str(uuid.uuid1()), Format)
Output_File = os.path.join(arcpy.env.scratchFolder, output)
# Export the web map
if Format.lower() == 'pdf':
arcpy.mapping.ExportToPDF(mxd, Output_File)
elif Format.lower() == 'png':
arcpy.mapping.ExportToPNG(mxd, Output_File)
# Set the output parameter to be the output file of the server job
arcpy.SetParameterAsText(3, Output_File)
# Clean up - delete the map document reference
filePath = mxd.filePath
del mxd, result
os.remove(filePath)
В этом примере, скрипт считывает JSON веб-карты, выходной формат, шаблон документа карты и существующий документ PDF, к которому будет присоединена веб-карта. Выходной документ карты из функции ConvertWebMapToMapDocument экспортируется как PDF, затем включается в другой PDF с помощью класса PDFDocument.
import arcpy
import os
import uuid
# The template location in the registered folder
templatePath = '//MyMachine/Austin/WebMap'
# Input web map json
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# Format for output
Format = arcpy.GetParameterAsText(1)
if Format == '#' or not Format:
Format = "PDF"
# Input Layout template
Layout_Template = arcpy.GetParameterAsText(2)
if Layout_Template == '#' or not Layout_Template:
Layout_Template = "Landscape11x17"
PDF_Document = arcpy.GetParameterAsText(3)
if PDF_Document == '#' or not PDF_Document:
PDF_Document = "EmergencyEvacuationRoute.PDF"
# Get the requested map document
templateMxd = os.path.join(templatePath, Layout_Template + '.mxd')
# Get the requested PDF file
PDF_File = os.path.join(templatePath, PDF_Document)
# Convert the web map to a map document
result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd)
mxd = result.mapDocument
# Export the web map to PDF
WebMapPDF = os.path.join(arcpy.env.scratchFolder, 'WebMap.pdf')
arcpy.mapping.ExportToPDF(mxd, WebMapPDF)
# Create a new output PDF Document and append pages
Output_Name = os.path.join(arcpy.env.scratchFolder, 'EvacuationRouteWithWebMap.pdf')
pdfDoc = arcpy.mapping.PDFDocumentCreate(Output_Name)
pdfDoc.appendPages(PDF_File)
pdfDoc.appendPages(WebMapPDF)
pdfDoc.appendPages(os.path.join(templatePath, 'ContactInfo.pdf'))
# Set the output parameter to be the output PDF
arcpy.SetParameterAsText(4, Output_Name)
# Clean up - delete the map document reference
filePath = mxd.filePath
del mxd, result
os.remove(filePath)
В этом примере, инструмент геообработки Собрать карту (Consolidate Map) используется для получения постоянной копии выходного документа карты, включая наложенные заметки.
import arcpy
import os
import uuid
# The template location in the registered folder
templatePath = '//MyMachine/Austin/WebMap'
# Input web map json
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# Format for output
Format = arcpy.GetParameterAsText(1)
if Format == '#' or not Format:
Format = "PDF"
# Input Layout template
Layout_Template = arcpy.GetParameterAsText(2)
if Layout_Template == '#' or not Layout_Template:
Layout_Template = "Landscape11x17"
# Get the requested map document
templateMxd = os.path.join(templatePath, Layout_Template + '.mxd')
# Since we are making a permanent copy of the notes overlays,
# we need to specify a notes geodatabase
notes = os.path.join(arcpy.env.scratchFolder, 'mynotes.gdb')
# Convert the web map to a map document
result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd, notes)
mxd = result.mapDocument
# Save the web map and notes overlays to a new map document using ConsolidateMap
arcpy.ConsolidateMap_management(mxd.filePath,
os.path.join(arcpy.env.scratchFolder, 'ConsolidateWebMap'))
# Clean up - delete the map document reference
filePath = mxd.filePath
del mxd, result
os.remove(filePath)
В этом примере используется промежуточный шаблон документа карты, который содержит векторные эквиваленты всех возможных сервисных слоев. После выполнения функции ConvertWebMapToMapDocument, скрипт просматривает все слои выходного документа карты и удаляет все слои, кроме векторных, которые соответствуют сервисным слоям в JSON веб-карты. Затем, выходной документ карты экспортируется в PDF или PNG.
import arcpy
import os
import uuid
# The template location in the registered folder (as UNC path)
templatePath = '//MyComputerName/MyDataStore/USA'
# Input web map json
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# Format for output
Format = arcpy.GetParameterAsText(1)
if Format == '#' or not Format:
Format = "PDF"
# Input Layout template
Layout_Template = arcpy.GetParameterAsText(2)
if Layout_Template == '#' or not Layout_Template:
Layout_Template = "NorthwesternUSA"
# Get the requested map document
templateMxd = os.path.join(templatePath, Layout_Template + '.mxd')
# Convert the web map to a map document
result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd)
mxd = result.mapDocument
# Reference the data frame that contains the web map
# Note: ConvertWebMapToMapDocument renames the active dataframe in the template_mxd to "Webmap"
df = arcpy.mapping.ListDataFrames(mxd, 'Webmap')[0]
# Get a list of all service layer names in the map
serviceLayersNames = [slyr.name for slyr in arcpy.mapping.ListLayers(mxd, data_frame=df)
if slyr.isServiceLayer and slyr.visible and not slyr.isGroupLayer]
# Create a list of all possible vector layer names in the map that could have a
# corresponding service layer
vectorLayersNames = [vlyr.name for vlyr in arcpy.mapping.ListLayers(mxd, data_frame=df)
if not vlyr.isServiceLayer and not vlyr.isGroupLayer]
# Get a list of all vector layers that don't have a corresponding service layer
removeLayerNameList = [vlyrName for vlyrName in vectorLayersNames
if vlyrName not in serviceLayersNames]
# Remove all vector layers that don't have a corresponding service layer
for lyr in arcpy.mapping.ListLayers(mxd, data_frame=df):
if not lyr.isGroupLayer \
and not lyr.isServiceLayer \
and lyr.name in removeLayerNameList \
and lyr.name in vectorLayersNames:
arcpy.mapping.RemoveLayer(df, lyr)
# Remove all service layers
# This will leave only vector layers that had corresponding service layers
for slyr in arcpy.mapping.ListLayers(mxd, data_frame=df):
if slyr.isServiceLayer:
arcpy.mapping.RemoveLayer(df, slyr)
# Use the uuid module to generate a GUID as part of the output name
# This will ensure a unique output name
output = 'WebMap_{}.{}'.format(str(uuid.uuid1()), Format)
Output_File = os.path.join(arcpy.env.scratchFolder, output)
# Export the web map
if Format.lower() == 'pdf':
arcpy.mapping.ExportToPDF(mxd, Output_File)
elif Format.lower() == 'png':
arcpy.mapping.ExportToPNG(mxd, Output_File)
# Set the output parameter to be the output file of the server job
arcpy.SetParameterAsText(3, Output_File)
# Clean up - delete the map document reference
filePath = mxd.filePath
del mxd, result
os.remove(filePath)