Руководство: Основы печати/экспорта веб-карт с помощью arcpy.mapping
В этом руководстве вы создадите веб-приложение, с которым конечному пользователю нужно будет только переместиться в определенную область и нажать кнопку Печать (Print). В результате будет получен пригодный для печати документ в формате PDF, содержащий выходные векторные данные для слоев сервиса.
Экспорт из веб-приложения с использованием готового сервиса Инструменты печати (Printing Tools) и его клиентских виджетов печати в ArcGIS Web APIs может выводить высококачественное изображение слоев вашего сервиса. Однако иногда требуется результат в векторном формате. Например, векторные выходные данные в PDF поддерживают в приложении просмотра PDF следующие функции: переключение видимости слоев, просмотр атрибутов объектов и просмотр координат карты. В веб-приложении, которое вы построите, будут выведены векторные эквиваленты сервисной базовой карты World Topographic. Векторный поднабор небольшой области базовой карты World Topographic открыт для общего досупа в Ресурсном центре ArcGIS (ArcGIS Resource Center).
Для того чтобы создать выходной документ, содержащий локальные векторные данные вместо изображения слоев сервисов, у вас должен быть доступ к соответствующим векторным данным.
Ниже приведена иллюстрация веб-приложения, которое вы должны построить.
Код, закрепленный в веб-приложении за кнопкой Печать (Print), использует Задачу печати (Print Task) ArcGIS Web API, доступную в ArcGIS 10.1 for Server. Вы создадите скрипт Python, который будет опубликован как сервис геообработки и будет использоваться Задачей печати (Print Task). Скрипт Python использует функцию ConvertWebMapToMapDocument в модуле arcpy.mapping, который вставит все элементы веб-карты в промежуточный шаблон документа карты. Этот шаблон содержит векторные эквиваленты всех возможных слоев в картографическом сервисе. В модуле arcpy.mapping также предусмотрена функциональная возможность удаления слоев сервисов, оставляя локальные векторные данные в шаблоне документа карты, и экспорта в PDF.
При нажатии кнопки Печать (Print) будет получен документ PDF в формате для печати, содержащий локальные векторные данные вместо изображения слоев сервиса.
Для завершения работы с данным руководством, вы должны свободно владеть модулем arcpy.mapping, ArcGIS Web APIs, ArcGIS for Desktop и ArcGIS for Server. Данное руководство содержит образцы кода для всех ArcGIS Web APIs. Вам также следует ознакомиться с печатью в разделах справки веб-приложения:
Получение векторных данных из Ресурсного центра ArcGIS (ArcGIS Resource Center)
Вы загрузите zip-файл из Map Template Gallery на ArcGIS Resources; этот файл содержит векторные данные, которые будут использоваться в промежуточном шаблоне документа карты.
Прежде чем вы это сделаете, необходимо убедиться в наличии структуры папок в том местоположении, где ArcGIS for Server может видеть шаблон документа карты и данные, которые будут использоваться в веб-приложении. В этом руководстве подразумевается, что у вас уже есть папка, зарегистрированная на ArcGIS for Server. Дополнительные сведения по регистрации данных на ArcGIS for Server смотри
При использовании шаблонов документов карт в функции ConvertWebMapToMapDocument рекомендуется использовать данные, которые зарегистрированы на ArcGIS for Server. Если не использовать зарегистрированные данные, то шаблоны документов карт и данные будут упакованы и скопированы на сервер. Во время упаковки данные могут перемещаться и использоваться в качестве источника с соответствующими путями к структуре папок, которые не могут быть разрешены ConvertWebMapToMapDocument. Более подробно см. ConvertWebMapToMapDocument.
- Начните новый сеанс ArcMap.
- В окне Каталог (Catalog), перейдите к своей зарегистрированной папке. Создайте новую папку в зарегистрированном каталоге с именем BasicTutorial.
- Перейдите к Community Maps Template Gallery на ArcGIS Resources. Выберите шаблон World Topographic Map Template.
- Загрузите zip-файл World Topographic Map Template на ваш компьютер, нажав кнопку Загрузить (Download).
- Извлеките содержание zip-файла в папку BasicTutorial в вашем зарегистрированном каталоге.
- Ваша зарегистрированная папка должна выглядеть примерно так, как показано на следующей иллюстрации. Примечание:
На снимке экрана вверху зарегистрированная папка имеет имя MyDataStore. Ваша зарегистрированная папка может иметь любое имя.
Документ карты LGIM_World_Topo_Map_v1.5 теперь готов для использования в веб-приложении.
Создание скрипта Python
Вы создадите скрипт Python, который будет использоваться как пользовательский сервис геообработки печати.
Скрипт Python в пользовательском сервисе геообработки печати выполняет функцию ConvertWebMapToMapDocument, которая конвертирует веб-карту (в формате JSON), которую вы собираетесь напечатать или экспортировать, в документ карты. Затем скрипт удаляет слои сервисов в документе карты, оставляя векторные слои, которые соответствуют сервисному слою в веб-карте JSON. Веб-карта JSON также содержит экстент карты в веб-приложении. Наконец, скрипт экспортирует документ карты в документ PDF.
- Откройте любой Python IDE, например, – IDLE (который поставляется с ArcGIS for Desktop).
- Скопируйте и вставьте следующий код в новый скрипт Python.
- Измените переменную templateMxd чтобы она представляла путь UNC к папке в вашей зарегистрированной папке, содержащей шаблоны документов карты.
- Сохраните скрипт Python. Назовите скрипт BasicTutorial.py. Сохраните его в папку с именем WebApp в директории зарегистрированной папки.
import arcpy
import os
import uuid
# Input WebMap json
Web_Map_as_JSON = arcpy.GetParameterAsText(0)
# The template location in the server data store
templateMxd = '//MyComputer/MyDataStore/BasicTutorial/LG_062912_10.1/LG_062912_10.1/LGIM_World_Topo_Map_v1.5.mxd'
# Convert the WebMap to a map document
result = arcpy.mapping.ConvertWebMapToMapDocument(Web_Map_as_JSON, templateMxd)
mxd = result.mapDocument
# Reference the data frame that contains the webmap
# Note: ConvertWebMapToMapDocument renames the active dataframe in the template_mxd to "Webmap"
df = arcpy.mapping.ListDataFrames(mxd, 'Webmap')[0]
# Remove the service layer
# This will just leave the vector layers from the template
for lyr in arcpy.mapping.ListLayers(mxd, data_frame=df):
if lyr.isServiceLayer:
arcpy.mapping.RemoveLayer(df, lyr)
# Use the uuid module to generate a GUID as part of the output name
# This will ensure a unique output name
output = 'WebMap_{}.pdf'.format(str(uuid.uuid1()))
Output_File = os.path.join(arcpy.env.scratchFolder, output)
# Export the WebMap
arcpy.mapping.ExportToPDF(mxd, Output_File)
# Set the output parameter to be the output file of the server job
arcpy.SetParameterAsText(1, Output_File)
# Clean up - delete the map document reference
filePath = mxd.filePath
del mxd, result
os.remove(filePath)
Если ArcGIS for Server, ArcGIS for Desktop и зарегистрированная папка расположены на одной и той же машине, то пути UNC к зарегистрированной папке не требуются. Вместо них могут использоваться абсолютные пути.
Создание инструмента-скрипта Python
Вы создадите собственный инструмент геообработки, который будет выполнять скрипт BasicTutorial.py.
- В окне Каталог (Catalog) в ArcMap, перейдите к папке WebApp в директории зарегистрированной папки.
- Щелкните правой кнопкой мыши папку WebApp и выберите Создать (New) > Набор инструментов (Toolbox). Назовите набор инструментов BasicTutorial.
- Щелкните правой кнопкой набор инструментов BasicTutorial и выберите Описание элемента (Item Description).
- В диалоговом окне Описание элемента (Item Description) в элементах Теги (Tags) и Сводка (Summary) введите любой выбранный вами текст. Дополнительно, заполните другие описания элементов.
- Щелкните Сохранить (Save) и выйдите из диалогового окна Описание элемента (Item Description).
- В окне Каталог (Catalog) щелкните правой кнопкой набор инструментов BasicTutorial и выберите Добавить (Add) > Скрипт (Script).
- В диалоговом окне Добавить скрипт (Add Script), введите BasicTutorial и для Имени (Name), и для Надписи (Label).
- Щелкните Далее (Next).
- Для параметра Файл скрипта (Script File), перейдите к папке WebApp в зарегистрированной папке и выберите BasicTutorial.py.
- Щелкните Далее (Next).
- В инструмент-скрипт необходимо добавить два параметра.
- Первый из этих двух параметров – Web_Map_as_JSON. Этот параметр получает представление JSON о состоянии карты для экспорта, как только она отобразится в веб-приложении. Свойства должны соответствовать следующему:
- Следующий параметр – Выходной файл (Output_File) – выходной файл, который будет создан. Свойства должны соответствовать следующему:Внимание:
Имена параметров Web_Map_as_JSON и Output_File должны быть указаны в точности как показано для соответствия подписи инструмента Задача печати (Print Task) в ArcGIS Web APIs.
- Щелкните Готово (Finish) в диалоговом окне Добавить скрипт (Add Script).
- Щелкните правой кнопкой инструмент-скрипт BasicTutorial, а затем нажмите Описание элемента (Item Description).
- В диалоговом окне Описание элемента (Item Description), заполните элементы Теги (Tags) и Краткое описание (Summary) текстом по вашему выбору. Также заполните Объяснение диалога (Dialog Explanation) для всех параметров в разделе Синтаксис(Syntax) диалогового окна Описание элемента (Item Description) текстом по вашему выбору. Дополнительно, заполните другие описания элементов.
Выполните инструмент
Инструмент должен быть выполнен успешно, чтобы в окне Результаты (Results) появился результат, который мог бы быть опубликован на ArcGIS for Server.
- В окне Каталог (Catalog) щелкните правой кнопкой инструмент-скрипт BasicTutorial, и щелкните Открыть (Open).
- Оставьте входной параметр Web_Map_as_JSON пустым.Подсказка:
Для целей публикации вы можете оставить входной параметр Web_Map_as_JSON пустым, поскольку ArcGIS Web APIs будет предоставлять веб-карту JSON в веб-приложении. Входной параметр Web_Map_as_JSON может быть оставлен пустым при условии, что скрипт Python был написан таким образом, чтобы он мог работать и при пустом входном параметре. Например, скрипт не ищет слои веб-карт по имени.
- Нажмите ОК. Подождите, пока инструмент не завершит выполнение.
Теперь результат готов для публикации как в качестве сервиса геообработки.
Публикация результата
Если вы не знакомы с публикацией сервисов геообработки, см.
- Откройте окно Результаты (Results).
- Разверните строку Текущий сеанс (Current Session).
- Щелкните правой кнопкой мыши результат геообработки BasicTutorial и выберите Общий доступ как (Share As) > Сервис геообработки (Geoprocessing Service).
- Включите Опубликовать сервис (Publish a service).
- Щелкните Далее (Next).
- Выберите издательское или административное подключение к компьютеру с ArcGIS for Server.
- Щелкните Далее (Next).
- Щелкните Далее (Next).
- Нажмите кнопку Продолжить (Continue).
- В верхнем правом углу диалогового окна Редактор сервисов (Service Editor) щелкните Опубликовать (Publish).
Теперь сервис геообработки подготовлен для использования в ArcGIS Web APIs.
Выбор ArcGIS Web API, который будет использоваться для создания веб-приложения
ArcGIS Web API предлагают аналогичную ГИС-функциональность; вам только нужно выбрать предпочитаемую платформу разработки. Данное руководство не ставит свой целью подробное рассмотрение начала работы по построению веб-приложений с каждым API. Более подробную информацию можно найти в документации по API. Для получения дополнительной информации см.
Каждый ArcGIS Web API имеет Задачу печати (Print Task). Задача печать (Print Task) имеет свойство URL, в котором содержится ссылка на ранее созданный вами пользовательский сервис геообработки. Пожалуйста, обратитесь к документации по ArcGIS Web API для получения дополнительной информации о Задаче печати (Print Task).
В следующих разделах используйте образцы кодов для ArcGIS Web API, которые вы вводите для создания своего веб-приложения.
Образец кода ArcGIS API for JavaScript
Если вы используете ArcGIS API for JavaScript, используйте следующий образец кода для создания своего веб-приложения.
В расположенном ниже образце кода ArcGIS API for JavaScript измените URL на сервис геообработки, который был вами создан в предыдущем шаге, чтобы он соответствовал имени вашего сервера. Эта строка содержит ссылки на:
var printUrl = "http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial";
Код для BasicTutorial.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Webmap Printing</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/dojo/dijit/themes/claro/claro.css">
<script src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0"></script>
<script type="text/javascript" language="Javascript">
dojo.require("esri.map");
dojo.require("esri.tasks.PrintTask");
var printTask, params;
function init() {
// set the extent to the Naperville area - which matches the extent of the template map document
var startExtent = new esri.geometry.Extent({"xmin":-9815098,"ymin":5124020, "xmax":-9811168,"ymax":5127339, "spatialReference":{"wkid":102100}});
var map = new esri.Map("map", {extent:startExtent});
// add tiled map service to webmap
var tiledUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer";
var tiledLayer = new esri.layers.ArcGISTiledMapServiceLayer(tiledUrl);
map.addLayer(tiledLayer);
var printUrl = "http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial";
printTask = new esri.tasks.PrintTask(printUrl, {async: true});
params = new esri.tasks.PrintParameters();
params.map = map;
}
function print(){
var ptemplate = new esri.tasks.PrintTemplate();
// use the extent of the webmap in the output PDF
ptemplate.preserveScale = false;
params.template = ptemplate;
printTask.execute(params, printComplete);
}
function printComplete(result){
window.open(result.url);
}
dojo.addOnLoad(init);
</script>
</head>
<body class="claro">
<input type="button" id="print" value="Print" onclick="print();"/>
<div id="map" style="width:1000px; height:600px; border:1px solid #000;"></div>
</body>
</html>
Образец кода ArcGIS API for Flex
Если вы используете ArcGIS API for Flex, используйте следующий образец кода для создания своего веб-приложения.
В расположенном ниже образце кода ArcGIS API for Flex измените URL на сервис геообработки, который был вами создан в предыдущем шаге, чтобы он соответствовал имени вашего сервера. Эти строки содержат ссылки на:
url="http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial"/>
Код для BasicTutorial.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:esri="http://www.esri.com/2008/ags"
initialize="printTask.getServiceInfo()"
pageTitle="High-quality printing">
<fx:Script>
<![CDATA[
import com.esri.ags.events.PrintEvent;
import com.esri.ags.tasks.supportClasses.DataFile;
import com.esri.ags.tasks.supportClasses.JobInfo;
import com.esri.ags.tasks.supportClasses.ParameterValue;
import mx.controls.Alert;
public var preserveScale:Boolean = true;
private function printBtn_clickHandler(event:MouseEvent):void
{
if (printTask.getServiceInfoLastResult.isServiceAsynchronous)
{
printTask.submitJob(printParameters);
}
else
{
printTask.execute(printParameters);
}
}
private function printTask_jobCompleteHandler(event:PrintEvent):void
{
var jobInfo:JobInfo = event.jobInfo;
if (jobInfo.jobStatus == JobInfo.STATUS_SUCCEEDED)
{
printTask.getResultData(jobInfo.jobId);
}
else
{
Alert.show(jobInfo.jobStatus);
}
}
private function printTask_getResultDataCompleteHandler(event:PrintEvent):void
{
var dataFile:DataFile = event.parameterValue.value as DataFile;
navigateToURL(new URLRequest(dataFile.url));
}
private function printTask_executeCompleteHandler(event:PrintEvent):void
{
var paramValue:ParameterValue = event.executeResult.results[0];
var dataFile:DataFile = paramValue.value as DataFile;
navigateToURL(new URLRequest(dataFile.url));
}
]]>
</fx:Script>
<fx:Declarations>
<esri:PrintTask id="printTask"
executeComplete="printTask_executeCompleteHandler(event)"
fault="Alert.show(event.fault.faultString)"
getResultDataComplete="printTask_getResultDataCompleteHandler(event)"
jobComplete="printTask_jobCompleteHandler(event)"
showBusyCursor="false"
url="http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial"/>
<esri:PrintParameters id="printParameters"
preserveScale="false"
map="{map}">
</esri:PrintParameters>
<esri:Extent id="initialExtent"
xmin="-9815098" ymin="5124020" xmax="-9811168" ymax="5127339">
<esri:SpatialReference wkid="102100"/>
</esri:Extent>
</fx:Declarations>
<s:controlBarLayout>
<s:HorizontalLayout gap="10"
paddingBottom="7"
paddingLeft="10"
paddingRight="10"
paddingTop="7"
verticalAlign="baseline"/>
</s:controlBarLayout>
<s:controlBarContent>
<s:Button id="printBtn"
click="printBtn_clickHandler(event)"
enabled="{printTask.getServiceInfoLastResult != null}"
label="Print"/>
</s:controlBarContent>
<esri:Map id="map" extent="{initialExtent}">
<esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/>
</esri:Map>
</s:Application>
Образец кода ArcGIS API for Silverlight
Если вы используете ArcGIS API for Silverlight, используйте следующий образец кода для создания своего веб-приложения.
Код XAML
<UserControl x:Class="Basic_Tutorial.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="http://schemas.esri.com/arcgis/client/2009">
<Grid x:Name="LayoutRoot" Background="White">
<esri:Map x:Name="MyMap" Extent="-9815098,5124020,-9811168,5127339">
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="MyTiledService"
Url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/>
</esri:Map.Layers>
</esri:Map>
<StackPanel Orientation="Vertical" Margin="15" HorizontalAlignment="Left" VerticalAlignment="Top" >
<Border x:Name="PrintPanel" CornerRadius="10" BorderBrush="Gray" BorderThickness="1" Background="White" HorizontalAlignment="Left"
VerticalAlignment="Top" Margin="15" Padding="10">
<Border.Effect>
<DropShadowEffect/>
</Border.Effect>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="Print" Content="Print" Click="ExportMap_Click"
Grid.Row="1" Grid.Column="0" Margin="2"/>
</Grid>
</Border>
</StackPanel>
</Grid>
</UserControl>
В расположенном ниже образце кода ArcGIS API for Silverlight измените URL на сервис геообработки, который был вами создан в предыдущем шаге, чтобы он соответствовал имени вашего сервера. Эта строка содержит ссылки на:
printTask = new PrintTask("http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial");
Код ниже на C#
using System;
using System.Windows;
using System.Windows.Controls;
using ESRI.ArcGIS.Client.Printing;
using ESRI.ArcGIS.Client.Tasks;
namespace Basic_Tutorial
{
public partial class MainPage : UserControl
{
PrintTask printTask;
public MainPage()
{
InitializeComponent();
printTask = new PrintTask("http://MyServer:6080/arcgis/rest/services/BasicTutorial/GPServer/BasicTutorial");
printTask.DisableClientCaching = true;
printTask.JobCompleted += new EventHandler<PrintJobEventArgs>(printTask_JobCompleted);
printTask.GetServiceInfoCompleted += new EventHandler<ServiceInfoEventArgs>(printTask_GetServiceInfoCompleted);
printTask.GetServiceInfoAsync();
}
void printTask_GetServiceInfoCompleted(object sender, ServiceInfoEventArgs e)
{
PrintPanel.DataContext = e.ServiceInfo;
}
void printTask_JobCompleted(object sender, PrintJobEventArgs e)
{
if (e.Error == null)
{
if (e.PrintResult != null)
System.Windows.Browser.HtmlPage.Window.Navigate(e.PrintResult.Url, "_blank");
}
}
private void ExportMap_Click(object sender, RoutedEventArgs e)
{
if (printTask == null || printTask.IsBusy) return;
PrintParameters printParameters = new PrintParameters(MyMap)
{
};
printTask.SubmitJobAsync(printParameters);
}
}
}
Запуск веб-приложения
Запустите веб-приложение, которое вы создали в предыдущем шаге. Обратитесь к документации ArcGIS Web API с инструкциями по запуску веб-приложений, если это необходимо. Ниже показан снимок экрана веб-приложения API ArcGIS for JavaScript.
Увеличьте интересующую вас область и нажмите кнопку Печать (Print). Через некоторое время на экране автоматически высветится выходной документ PDF. На выходе будет получен документ PDF в формате для печати, содержащий локальные векторные данные, которые были выставлены в шаблонах компоновки, вместо изображения слоев сервисов. См. образец ниже:
Это завершает Основы печати/экспорта веб-карт с использованием arcpy.mapping. Дополнительные сведения см. в Руководстве: Расширенные возможности печати и экспорта веб-карт.