Skip to main content

Печать веб-карты с помощью arcpy.mp

Распространённым рабочим процессом arcpy.mp, используемым в Portal for ArcGIS, является печать веб-карт, в которой Python, ArcGIS Experience Builder, ArcGIS Maps SDK для JavaScript и ArcGIS Web AppBuilder совместно создают веб-приложения, обеспечивающие высококачественный картографический результат.

Функция ConvertWebMapToArcGISProject

Функция ConvertWebMapToArcGISProject конвертирует веб-карту, которую вы хотите напечатать или экспортировать в проект ArcGIS Pro. После преобразования веб-карты в проект переходят все элементы веб-карты. Затем можно изменить проект перед печатью или экспортом в стандартные форматы, такие как PDF. Функция ConvertWebMapToArcGISProject часто используется при печати карты из приложения веб-ГИС с помощью ArcGIS Experience Builder, ArcGIS Maps SDK for JavaScript или ArcGIS Web AppBuilder.

Преимущества arcpy.mp для печати веб-карт

Функция ConvertWebMapToArcGISProject предназначена для рабочих процессов, в которых необходимо изменить или экспортировать веб-карту с помощью функций arcpy.mp. Несколько примеров использования функции ConvertWebMapToArcGISProject в рабочих процессах:

  • Экспорт с помощью расширенных опций – все функции экспорта в arcpy.mp имеют множество расширенных опций. Например, метод exportToPDF, доступный в классах Layout и MapView, имеет параметры для управления сжатием растровых и векторных данных, задания цветового пространства, внедрения шрифтов и т.д. Образец кода см. в примере 2 в разделе ConvertWebMapToArcGISProject.

  • Создание атласов – если функция Пространственная серия карт в промежуточном шаблоне компоновки активирована, можно создавать атлас карт. Выходная компоновка может быть экспортирована в файл PDF, а затем вставлена в другие файлы PDF (например, на титульную страницу или в отчет), используя класс PDFDocument для создания полного атласа. Образцы кодов см. в примерах 4 и 5 в разделе ConvertWebMapToArcGISProject.

  • Создание отчетов – Отчет может строиться для слоев в веб-карте или промежуточных шаблонах компоновки. Один из способов выполнить этот рабочий процесс — импортировать файл отчета (.rptx) в проект ArcGIS Pro, возвращенный ConvertWebMapToArcGISProject. Для импорта файла отчета используйте функцию importDocument класса ArcGISProject. Этот отчет можно добавить в другие файлы PDF (например, в компоновку), используя класс PDFDocument. Образец кода см. в примере 6 в разделе ConvertWebMapToArcGISProject.

    Примечание:

    Виджет Печать в ArcGIS Experience Builder поддерживает печать отчетов.

  • Отображение выбранных объектов во фрейме таблицы или в динамическом тексте атрибута таблицы. Доступ Python CIM можно использовать для доступа к объектам, недоступным в arcpy.mp, таким как фреймы таблиц. Пример кода см. в примере 7 в разделе ConvertWebMapToArcGISProject.

    Примечание:

    Виджет Печать в ArcGIS Experience Builder поддерживает динамические элементы компоновки, включая динамический текст и динамические таблицы.

Примечание:

ArcGIS Server также содержит сервис геообработки PrintingTools. Сервис PrintingTools может использоваться в веб-приложении для создания изображения для печати высокого картографического качества. Дополнительные сведения о сервисе PrintingTools см. в разделе Печать в веб-приложениях.

Выходной файл (например, .pdf, .png и другие) скрипта Python может быть компоновкой из дополнительного параметра template_pagx и может включать элементы зарамочного оформления страницы компоновки (заголовок, легенды, масштабную линейку, фреймы обзорных карт, сетки, градусные сетки, таблицы, диаграммы и т.д.). Выходные данные могут быть также элементом MapView, который не включает никаких элементов страницы компоновки.

Публикация вашего скрипта как веб-инструмента

Если у вас есть скрипт Python, который готовит карту для печати, вы можете включить его в инструмент-скрипт. Затем можно опубликовать инструмент-скрипт в качестве веб-инструмента. ArcGIS Experience Builder, ArcGIS Maps SDK для JavaScript и ArcGIS Web AppBuilder имеют задачу Печати или виджет Печать, который можно использовать в веб-приложении ГИС. И задача Печати, и виджет Печать имеют свойство URL, указывающее на URL-адрес REST созданного вами веб-инструмента.

Параметры инструмента-скрипта

При использовании ConvertWebMapToArcGISProject в веб-инструменте в ArcGIS Experience Builder, ArcGIS Maps SDK for JavaScript или ArcGIS Web AppBuilder, имена параметров инструмента-скрипта должны соответствовать параметрам задачи Печати или виджета Печати, описанным в следующей таблице:

Имя параметра инструмента-скрипта

Тип данных

Тип

Описание

Web_Map_as_JSON

Строка

Обязательный

Представление JavaScript Object Notation (JSON) о состоянии карты для экспорта из веб-приложения. JSON — это формат веб-карты. Он содержит полное состояние веб-карты (например, слои, система координат, экстент, масштаб и тому подобное). ArcGIS Experience Builder, ArcGIS Maps SDK для JavaScript и ArcGIS Web AppBuilder позволяют получить эту строку JSON из веб-приложения.

Output_File

Файл

Производные

Имя выходного файла. Расширение файла зависит от параметра Format.

Format

Строка

Дополнительный

Формат, в котором будет предоставлено изображение карты для печати. Допускаются следующие строки: PDF, PNG, PNG8, PNG32, JPG, GIF, EPS, SVG и SVGZ.

Layout_Template

Строка

Дополнительный

Имя шаблона из списка или ключевое слово MAP_ONLY. Когда выбрано MAP_ONLY или передается пустая строка, выходная карта не содержит никаких окружающих объектов компоновки страницы (например, название, легенды, масштабную линейку и т.д.).

Следующий снимок экрана показывает пример параметров инструмента-скрипта:

Пример параметров инструмента-скрипта

Подсказка:

При работе с ArcGIS Maps SDK for JavaScript можно добавить любое число дополнительных параметров, указываемых пользователем. Возможность передачи дополнительных параметров в пользовательскую задачу Печать позволяет собрать любое количество дополнительных параметров из веб-приложения и передать их в скрипт Python. Например, ваше веб-приложение может иметь элемент управления, которые позволяют выбирать, внедрять ли информацию о геопривязке в выходной PDF. Дополнительную информацию о сборе дополнительных параметров см. в примере 3 в разделе Примеры использования пользовательских скриптов Python в веб-приложениях ниже.

Подробную информацию о настройке параметров инструмента-скрипта см. в Настройка параметров инструмента-скрипта.

Понимание веб-карты JSON

Когда вы используете виджет Печать или задачу Печать ArcGIS Experience Builder, ArcGIS Maps SDK для JavaScript или ArcGIS App Builder соответственно, нет необходимости создавать веб-карту JSON; API позаботятся об этом за вас. Однако прежде чем скрипт будет опубликован и использован в веб-API, его необходимо запустить локально в ArcGIS Pro. При локальном запуске скрипта можно использовать любую допустимую строку JSON. Строка JSON, похожая на то, что возвращает веб-приложение, может потребоваться для успешного выполнения скрипта. См. спецификацию ExportWebMap, чтобы узнать, как должен быть отформатирован этот текст. Ниже приведен пример строки:

{
 "layoutOptions": {
     "titleText": "Simple WebMap JSON example"
 },
 "operationalLayers": [
     {
         "url": "https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_Federal_Lands/FeatureServer/0",
         "visibility": true,
         "title": "USA_Federal_Lands"
     }
 ],
 "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": "https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_Federal_Lands/FeatureServer/0","visibility": true, "title": "USA_Federal_Lands"}],"exportOptions": {"outputSize": [1500,1500]},"mapOptions": {"extent": {"xmin": -13077000,"ymin": 4031000,"xmax": -13023000,"ymax": 4053000}},"version": "1.4"}
Подсказка:

Дополнительно можно создать скрипт Python, чтобы он разрешал пустые входные данные Web_Map_as_JSON при запуске из ArcGIS Pro до публикации. Есть несколько способов выполнить это. Пример кода ниже показывает способ сделать это. После публикации скрипта как веб-инструмента, его можно опробовать с действующим JSON из веб-приложения.

# If the script is run from within ArcGIS Pro, and WebMap_as_JSON is blank, then don't fail
prodName = arcpy.GetInstallInfo()['ProductName']
if (WebMap_as_JSON == '#'):
    if (prodName == 'ArcGISPro'):
        exit()
Подсказка:

Как упоминалось ранее, JSON-файл веб-карты, возвращаемый веб-приложением, содержит полную информацию о состоянии веб-карты. Объект layoutOptions в веб-карте JSON требует дополнительного обсуждения, поскольку он автоматически обновляет элементы компоновки, чтобы они могли быть размещены в template_pagx. Например, если JSON имеет настройку titleText, а template_pagx содержит элемент Заголовка Компоновки или Метаданных в виде динамического текста с атрибутом заголовка, динамический текст в компоновке страницы шаблона будет обновлен с помощью значения titleText. Дополнительные сведения см. в разделе layoutOptions в спецификации ExportWebMap.

Шаблоны компоновки

ArcGIS Pro позволяет создавать сложные картографические компоновки, которые можно сохранить, как файл компоновки (.pagx) для его использования в качестве дополнительного параметра template_pagx в ConvertWebMapToArcGISProject. Компоновка страницы может содержать зарамочное оформление карты (например, текст заголовка, легенды, масштабную линейку, фреймы обзорной карты, сетки, таблицы, диаграммы и т.д.). Элементы зарамочного оформления карты могут быть статическими и динамическими. Это означает, что они могут реагировать на изменения в карте. К примеру, сетки могут автоматически изменяться при изменении масштаба, а элементы легенды - отображать только объекты, содержащиеся в текущем экстенте. Подробнее см. разделы Компоновки в ArcGIS Pro и Руководство по созданию компоновки.

Когда скрипт Python, который использует ConvertWebMapToArcGISProject, встраивается в веб-инструмент, вы должны убедиться, что ArcGIS Server может получить доступ к шаблонам компоновок и данным, используемым в веб-приложении. Рекомендуется использовать папку, которая зарегистрирована в ArcGIS Server. Подробную информацию о регистрации данных см. в разделе Регистрация данных с использованием ArcGIS Server.

В дополнение к созданию ваших собственных шаблонов компоновки можно использовать шаблоны, которые поставляются вместе с программным обеспечением. Они находятся в <installation_directory>\Templates\ExportWebMapTemplates. Эти шаблоны содержат элементы карты, такие как легенда, динамический текст текущей даты, шкалу масштаба и текст масштаба. С этих шаблонов удобны для начала работы. Но помните, что они расположены в папке установки и могут быть удалены при удалении или переустановке программного обеспечения. Эти шаблоны могут быть скопированы вручную в местоположение, к которому у ArcGIS Server есть допуск, и в дальнейшем они могут редактироваться при необходимости.

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

Поддержка графики клиента

По умолчанию, наложение заметок или графика со стороны клиента для веб-приложения сохраняется в рабочей области во внутренней памяти. Рабочая область в памяти является временной и удаляется при закрытии приложения. Чтобы сделать постоянную копию выходного проекта, содержащего наложение заметок, задайте notes_gdb, а затем используйте метод saveACopy из класса ArcGISProject.

Использование функции updateLayerFromJSON

Если ваше веб-приложение использует динамические слои, функция updateLayerFromJSON из класса Layer может использоваться для обновления свойств (например, символов) промежуточных векторных слоев в шаблоне компоновки с определением динамических слоев из JSON веб-карты. Это удобно, если веб-приложение позволяет менять символы динамических слоев, и вы хотите заменить слои сервиса на промежуточные векторные данные, но все еще видите обновленные символы из веб-приложения. Пример использования updateLayerFromJSON, см. в примере 3 в ConvertWebMapToArcGISProject.

Печать карт, содержащих защищенные сервисы не на основе токенов из ArcGIS Server

Функцию ImportCredentials можно использовать для доступа к сервисам ArcGIS Server, защищённым не с помощью токенов, из файлов подключения к ГИС-серверу. Учетные данные могут храниться в файлах соединений, созданных в ArcGIS Pro. См. Подключение к ГИС-серверу для получения подробной информации о создании файлов подключений. В скриптах для печати веб-карт используйте сначала ImportCredentials, а затем ConvertWebMapToArcGISProject. Поддерживаются следующие типы файлов подключения:

  • Файл подключения ArcGIS Server (.ags)

  • Файл подключения WMS Server (.wms)

  • Файл подключения WMTS Server (.wmts)

По окончании учетные данные можно очистить с помощью arcpy.ClearCredentials.

Образец кода см. в примере 8 в разделе ConvertWebMapToArcGISProject.

Дополнительные сведения см. в разделе Печать карт, содержащих защищенные сервисы.

Внимание:

Не рекомендуется встраивать учетные данные в пользовательский сервис печати, если у вас нет полного представления о системе безопасности. После публикации собственного сервиса печати с внедренными учетными данными, рекомендуется применить правила безопасности ArcGIS Server, чтобы ограничить доступ пользователей к сервису. Таким образом, можно запретить анонимным пользователям создавать изображения карты для печати, на которых отображаются ваши закрытые сервисы. Дополнительные сведения о настройке безопасности см. в разделе Изменение разрешений для сервисов и папок.

Примеры использования пользовательских скриптов Python в веб-приложениях

В следующих разделах показаны примеры использования пользовательских скриптов Python в веб-приложениях.

Пример 1: Использование пользовательского скрипта Python в ArcGIS Experience Builder

После публикации инструмента-скрипта Python в качестве веб-инструмента виджет Печать в ArcGIS Experience Builder можно настроить для использования этого веб-инструмента.

Виджет Печать имеет настройку Шаблон печати, которая позволяет добавлять сервис печати и настраивать шаблоны. В инструменте Добавить утилиту вы можете ввести REST URL веб-инструмента. Например:

https://MyServer:6443/arcgis/rest/services/MyPrintService/GPServer

После выбора сервиса печати он автоматически добавляет шаблоны печати.

Пример 2: Использование пользовательского скрипта Python в ArcGIS Web AppBuilder

После публикации инструмента-скрипта Python в качестве веб-инструмента виджет Печать в ArcGIS Web AppBuilder будет настроен на работу с REST URL веб-инструмента. Следующий снимок экрана показывает диалоговое окно настройки для виджета Печать:

Диалоговое окно настройки для виджета Печать

Подсказка:

На скриншоте выше значения для Формат по умолчанию и Компоновка по умолчанию заполняются автоматически из параметров Format и Layout_Template веб-инструмента.

Пример 3: Использование пользовательского скрипта Python в ArcGIS Maps SDK for JavaScript

Этот пример показывает, как можно использовать вместе Python и ArcGIS Maps SDK для JavaScript для создания веб-ГИС приложения для печати веб-карты. Пользователь сможет выполнять следующее в веб-приложении:

  • Перейти к области интереса.

  • Выбрать шаблон компоновки.

  • Выбрать выходной формат.

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

Этот скрипт Python показывает, как передать дополнительные параметры (pdf_accessibility) из веб-приложения в скрипт Python помимо стандартных параметров, поддерживаемых задачей Печать.

import arcpy
import os
import uuid
# The template location in the server data store
templatePath = '//MyServer/MyDataStore/Templates'
# Input WebMap JSON
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# Format for output
Format = arcpy.GetParameterAsText(1)
# Input layout template
Layout_Template = arcpy.GetParameterAsText(2)
# Extra parameter - pdf_accessibility
Access_info = arcpy.GetParameterAsText(3)
# Convert Access_info string to boolean
if Access_info.lower() == 'false':
 Access_info_bol = False
elif Access_info.lower() == 'true':
 Access_info_bol = True
else: Access_info_bol = True
# Get the requested layout template pagx file
templatePagx = os.path.join(templatePath, Layout_Template + '.pagx')
# Convert the WebMap to an ArcGISProject
result = arcpy.mp.ConvertWebMapToArcGISProject(Web_Map_as_JSON, templatePagx, "Layers Map Frame")
aprx = result.ArcGISProject
layout = aprx.listLayouts()[0]
# 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 WebMap - use Access_info_bol to control accessibility
if Format.lower() == 'pdf':
 layout.exportToPDF(Output_File, pdf_accessibility=Access_info_bol)
elif Format.lower() == 'png':
 layout.exportToPNG(Output_File)
# Set the output parameter to be the output file of the server job
arcpy.SetParameterAsText(4, Output_File)

Инструмент-скрипт Python публикуется как веб-инструмент. В следующем скрипте задача Печати в ArcGIS Maps SDK для JavaScript настроена для использования REST URL веб-инструмента:

Подсказка:

Ссылка на REST URL веб-инструмента размещается в скрипте в этой строке:

var printServiceUrl = "https://MyServer:6443/arcgis/rest/services/MyPrintService/GPServer/MyPrintService";

Весь скрипт выглядит следующим образом:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<title>Austin Print WebApp</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.3/esri/css/main.css">
<script src="https://js.arcgis.com/4.3/"></script>
<style>
 html,
 body,
 #viewDiv {
   padding: 0;
   margin: 0;
   height: 100%;
   width: 100%;
 }
 #layerToggle {
   top: 20px;
   right: 20px;
   position: absolute;
   z-index: 99;
   background-color: white;
   border-radius: 8px;
   padding: 10px;
   opacity: 1;
 }
</style>
<script>
 require([
     "esri/Map",
     "esri/views/MapView",
     "esri/layers/TileLayer",
     "esri/tasks/PrintTask",
     "esri/tasks/support/PrintParameters",
     "esri/tasks/support/PrintTemplate",
     "dojo/dom",
     "dojo/on",
     "dojo/domReady!"
   ],
   function(
     Map, MapView, TileLayer, PrintTask, PrintParameters, PrintTemplate, dom, on
   ) {
     /*****************************************************************
     * Create a TileLayer instance.
     *****************************************************************/
     var austinLyr = new TileLayer({
       url: "http://MyServer:6080/arcgis/rest/services/MyMapService/MapServer",
       id: "austin",
       opacity: 0.9
     });
     /*****************************************************************
     * Layers may be added to the map in the map's constructor
     *****************************************************************/
     var map = new Map({
       basemap: "oceans",
       layers: [austinLyr]
     });
     var view = new MapView({
       container: "viewDiv",
       map: map
     });
     /*****************************************************************
     * Go to extent of Austin Layer
     *****************************************************************/
     view.then(function() {
       austinLyr.then(function() {
         view.goTo(austinLyr.fullExtent);
       });
     });
     var printServiceUrl = "https://MyServer:6443/arcgis/rest/services/MyPrintService/GPServer/MyPrintService";
     var printMode = "async";
     var printTask = new PrintTask({
       url: printServiceUrl,
       mode: printMode
     });
     function myPrint() {
       // input layout template
       var layout = dom.byId("layout");
       var index = layout.selectedIndex;
       var selectedValue_layout = layout.options[index].value;
       // format for output
       var format = dom.byId("format");
       var index = format.selectedIndex;
       var selectedValue_format = format.options[index].value;
       // Extra parameter: Accessibility info boolean
       var access_info = dom.byId("access_info");
       var index = access_info.selectedIndex;
       var selectedValue_access_info = access_info.options[index].value;
       var template = new PrintTemplate({
         format: selectedValue_format,
         layout: selectedValue_layout,
       });
       var params = new PrintParameters({
         view: view,
         template: template
       });
       params.extraParameters = {
         Access_info : selectedValue_access_info
       };
       printTask.execute(params).then(printResult, printError);
     }
     function printResult(result) {
       window.open(result.url);
     }
     function printError(result) {
       alert('Error printing.')
     }
 // Call myPrint() each time the button is clicked
 on(dom.byId("doBtn"), "click", myPrint);
 });
</script>
</head>
<body>
<div id="viewDiv"></div>
<span id="layerToggle">
 Layout Template:
 <select id="layout" >
   <OPTION value="Austin26x28">Austin26x28</OPTION>
   <OPTION value="Austin24x36">Austin24x36</OPTION>
 </select>
 &nbsp;&nbsp;Format:
 <select id="format">
   <OPTION value="PDF">PDF</OPTION>
   <OPTION value="PNG">PNG</OPTION>
 </select>
 &nbsp;&nbsp;Include Accessibility info?
 <select id="access_info">
   <OPTION value="True">True</OPTION>
   <OPTION value="False">False</OPTION>
 </select>
 <button id="doBtn">Print Map</button>
</span>
</body>
</html>