Краткая информация
Класс MapServiceDraft позволяет настроить свойства картографического сервиса и создать черновой файл определения сервиса (.sddraft), который затем может быть опубликован на ArcGIS Server.
Обсуждение
Чтобы создать объект MapServiceDraft, с помощью функции arcpy.sharing.CreateSharingDraft установите для параметра server_type значение STANDALONE_SERVER, а для параметра service_type - значение MAP_SERVICE. Затем объект MapServiceDraft можно будет настроить, задав свойства уровня сервиса. С помощью свойства targetServer укажите сервер, на котором будет опубликован этот картографический сервис. Когда объект MapServiceDraft будет настроен, его можно будет сохранить в черновой файл определения сервиса (.sddraft) с помощью функции exportToSDDraft. Затем он может быть опубликован в ArcGIS Server с помощью инструментов Промежуточный сервис и Загрузить определение сервиса. Дополнительные сведения см. в разделе Введение в arcpy.sharing.
Как только файл .sddraft будет установлен и загружен на сервер, можно использовать инструменты в группе инструментов Кэширование, чтобы создавать и управлять картографическим кэшем для более быстрого отображения картографических сервисов, например, инструментом Управление листами кэша картографического сервиса. Схему разделения на тайлы также можно изменить, редактируя файл .sddraft с помощью XML-библиотек, таких как xml.dom.minidom. Однако, из-за сложной структуры XML-схемы разбиения на листы, рекомендуется всегда использовать группу инструментов Кэширование.
Примеры кода доступны для следующего:
- Публикация картографического сервиса в папке сервера
- Перезаписать картографический сервис
- Публикация картографического сервиса, который ссылается на зарегистрированные данные
- Публикация кэшированного картографического сервиса
- Публикация картографического сервиса, отображающегося на основе имеющегося кэша
- Создание и публикация определения автономного сервиса
Свойства
Свойство | Описание | Тип данных |
copyDataToServer (чтение и запись) | Устанавливает, будут ли данные карты скопированы на сервер. Если значение True, то будут скопированы все данные на карте, в том числе данные, которые зарегистрированы на сервере. Если значение False, то будут скопированы только данные, которые не зарегистрированы на сервере, а сервис будет использовать данные, которые зарегистрированы на сервере. | Boolean |
credits (чтение и запись) | Авторы черновика картографического сервиса. | String |
description (чтение и запись) | Описание черновика картографического сервиса. | String |
offline (чтение и запись) | Устанавливает, будет ли использоваться подключение сервера. Если указано False, необходимо указать URL сервера или файл подключения ArcGIS Server (.ags) для свойства targetServer, чтобы создать файл черновика определения сервиса (.sddraft) с помощью функции exportToSDDraft. Если установлено значение True, то файл черновика определения сервиса может быть создан без заполнения параметра targetServer. | Boolean |
overwriteExistingService (чтение и запись) | Определяет, будут ли перезаписываться имеющиеся сервисы с одинаковыми именами. | Boolean |
serverFolder (чтение и запись) | Имя папки сервера, в которой вы хотели бы опубликовать этот сервис. По умолчанию будет использоваться корневой каталог сервера. Этот каталог будет создан, если его еще нет. | String |
serverType (только чтение) | Тип сервера, который был указан при создании MapServiceDraft из функции CreateSharingDraft. Единственно возможное значение, которое возвращается из serverType для MapServiceDraft – STANDALONE_SERVER. serverType из STANDALONE_SERVER говорит о поддержке создания картографического сервиса для ArcGIS Server. | String |
serviceName (чтение и запись) | Имя картографического сервиса. Это имя будут видеть пользователи и идентифицировать по нему сервис. Имя может содержать только буквы, цифры и знак подчеркивания. В имени нельзя использовать пробелы и специальные символы. Длина имени не должна превышать 120 символов. | String |
summary (чтение и запись) | Описание черновика картографического сервиса. | String |
tags (чтение и запись) | Теги черновика картографического сервиса. Теги могут быть разделены запятыми или точками с запятой. | String |
targetServer (чтение и запись) | Сервер, на котором будет опубликована эта карта. Для указания сервера могут использоваться следующие форматы:
Более подробно см. в разделе Подключение к ГИС-серверу. Подсказка:targetServer также может использоваться в параметре in_server для инструмента Выгрузить определение сервиса. Примеры кода ниже демонстрируют это. | String |
useLimitations (чтение и запись) | Ограничения по использованию черновика картографического сервиса. | String |
Обзор метода
Метод | Описание |
exportToSDDraft (out_sddraft) | Конвертирует MapServiceDraft в файл черновика определения сервиса (.sddraft). |
Методы
exportToSDDraft (out_sddraft)
Параметр | Описание | Тип данных |
out_sddraft | Путь и имя файла для выходного файла черновика определения сервиса (.sddraft). | String |
После настройки MapServiceDraft его можно сохранить в качестве файла черновика определения сервиса (.sddraft). Затем он может быть опубликован в ArcGIS Server с помощью инструментов Промежуточный сервис и Загрузить определение сервиса.
Пример кода
Следующий скрипт создает файл черновика определения картографического сервиса (.sddraft) для карты и устанавливает метаданные и свойства данных экспорта. Картографический сервис публикуется в папке на отдельном ArcGIS Server.
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft and set metadata and server folder properties
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.credits = "These are credits"
sddraft.description = "This is description"
sddraft.summary = "This is summary"
sddraft.tags = "tag1, tag2"
sddraft.useLimitations = "These are use limitations"
sddraft.serverFolder = "MyServerFolder"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт перезаписывает картографический сервис. Если имя сервиса уже существует, сервис будет перезаписан. В противном случае будет создан новый сервис.
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft and set overwrite property
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.overwriteExistingService = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт публикует картографический сервис, который ссылается на зарегистрированные данные. Для использования данных, хранилище данных должно быть уже зарегистрировано на сервере.
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft and set copyDataToServer property to false to reference registered data
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.copyDataToServer = False
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт публикует кэшированный картографический сервис, вызывая инструмент Управление листами кэша картографического сервера для построения листов кэша картографического сервиса.
import arcpy
import os
import xml.dom.minidom as DOM
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
"""Modify the .sddraft to enable caching"""
# Read the file
doc = DOM.parse(sddraft_output_filename)
configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
keyValues = propSet.childNodes
for keyValue in keyValues:
if keyValue.tagName == 'Key':
if keyValue.firstChild.data == "isCached":
keyValue.nextSibling.firstChild.data = "true"
# Write to a new .sddraft file
sddraft_mod_xml = service_name + '_mod_xml' + '.sddraft'
sddraft_mod_xml_file = os.path.join(outdir, sddraft_mod_xml)
f = open(sddraft_mod_xml_file, 'w')
doc.writexml(f)
f.close()
try:
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_mod_xml_file, sd_output_filename)
warnings = arcpy.GetMessages(1)
print(warnings)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, target_server_connection)
print("Finish Publishing")
# Manage Map server Cache Tiles
# For cache, use multiple scales separated by semicolon (;)
# For example, "591657527.591555;295828763.795777"
arcpy.server.ManageMapServerCacheTiles(target_server_connection + os.sep + service_name + ".MapServer", "591657527.591555",
"RECREATE_ALL_TILES")
except Exception as stage_exception:
print("Analyzer errors encountered - {}".format(str(stage_exception)))
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
Следующий скрипт создает черновик файла определения картографического сервиса (.sddraft) для карты. Затем он разрешает доступ к объекту в картографическом сервисе и использует имеющийся кэш для отображения сервиса, изменив черновик файла определения сервиса с помощью стандартной библиотеки Python xml.dom.minidom. Затем измененный файл определения сервиса публикуется на ArcGIS Server.
import arcpy
import os
import xml.dom.minidom as DOM
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
"""Modify the .sddraft file to keep existing cache and enable feature access"""
# Read the file
doc = DOM.parse(sddraft_output_filename)
# Find all elements named TypeName
# This is where the extensions are defined
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
# Get the TypeName to enable
if typeName.firstChild.data == "FeatureServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
# Enable feature access
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
# Turn off caching
configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
keyValues = propSet.childNodes
for keyValue in keyValues:
if keyValue.tagName == 'Key':
if keyValue.firstChild.data == "isCached":
keyValue.nextSibling.firstChild.data = "false"
# Enable feature access capabilities
configProps = doc.getElementsByTagName('Info')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
keyValues = propSet.childNodes
for keyValue in keyValues:
if keyValue.tagName == 'Key':
if keyValue.firstChild.data == "WebCapabilities":
keyValue.nextSibling.firstChild.data = "Map,Query,Data"
# Use existing cache
configProps = doc.getElementsByTagName('KeepExistingMapCache')[0]
configProps.firstChild.data = "true"
# Write to a new .sddraft file
sddraft_mod_xml = service_name + '_mod_xml' + '.sddraft'
sddraft_mod_xml_file = os.path.join(outdir, sddraft_mod_xml)
f = open(sddraft_mod_xml_file, 'w')
doc.writexml(f)
f.close()
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_mod_xml_file, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт создает определение автономного сервиса и публикует его как картографический сервис.
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
# Create MapServiceDraft and set offline property
# The targetServer property is not needed when the offline property is set to True
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.offline = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, r"C:\Project\gisserver.ags.esri.com (publisher).ags")
print("Finish Publishing")