Краткая информация
Класс MapServiceDraft позволяет создавать файл черновика определения сервиса (.sddraft) для картографического сервиса, который копирует все данные или ссылается на данные, зарегистрированные в ArcGIS Server.
Обсуждение
Чтобы создать объект MapServiceDraft, с помощью функции arcpy.sharing.CreateSharingDraft установите для параметра server_type значение STANDALONE_SERVER, а для параметра service_type - значение MAP_SERVICE. Объект MapServiceDraft можно настроить, задав свойства уровня сервиса и свойства метаданных. С помощью свойства targetServer укажите сервер, на котором будет опубликован этот картографический сервис.
Примечание:
Если свойства метаданных (credits, description, summary, tags и useLimitations) не заданы или состоят из пустых строк, картографический сервис будет получать метаданные с карты.
Для получения дополнительной информации о создании метаданных см. Просмотр и редактирование метаданных.
После того, как объект MapServiceDraft сконфигурирован, его можно сохранить в файле черновика определения сервиса (.sddraft) с помощью метода exportToSDDraft. Затем он может быть опубликован в ArcGIS Server с помощью инструментов Промежуточный сервис и Загрузить определение сервиса. Дополнительные сведения см. в разделе Введение в arcpy.sharing.
Как только файл .sddraft будет установлен и загружен на сервер, можно использовать инструменты в группе инструментов Кэширование, чтобы создавать и управлять картографическим кэшем для более быстрого отображения картографических сервисов, например, инструментом Управление листами кэша картографического сервиса. Схему разделения на тайлы также можно изменить, редактируя файл .sddraft с помощью XML-библиотек, таких как xml.dom.minidom. Однако, из-за сложной структуры XML-схемы разбиения на листы, рекомендуется всегда использовать группу инструментов Кэширование.
Примеры кода доступны для следующего:
- Публикация картографического сервиса в папке сервера
- Перезаписать картографический сервис
- Публикация картографического сервиса с сервисом объектов
- Публикация кэшированного картографического сервиса
- Публикация картографического сервиса, отображающегося на основе имеющегося кэша
- Анализ и регистрация хранилища данных
- Задание часового пояса и настройка слияния сервисов
- Создание и публикация определения автономнго сервиса
- Анализируйте, чтобы убедиться, что карта настроена так, чтобы разрешить присвоение уникальных числовых ID
Свойства
Свойство | Описание | Тип данных |
checkUniqueIDAssignment (чтение и запись) | Логическое значение, которое указывает, анализируется ли ваша карта, чтобы подтвердить, что опция Разрешить назначения уникальных числовых ID для опубликованных веб слоёв в Свойствах карты включена. Более подробно см. в Назначение ID слою. | Boolean |
copyDataToServer (чтение и запись) | Устанавливает, будут ли данные карты скопированы на сервер. Если значение True, то будут скопированы все данные на карте, в том числе данные, которые зарегистрированы на сервере. Если значение False, то будут скопированы только данные, которые не зарегистрированы на сервере, а сервис будет использовать данные, которые зарегистрированы на сервере. | Boolean |
credits (чтение и запись) | Авторы черновика картографического сервиса. | String |
description (чтение и запись) | Описание черновика картографического сервиса. | String |
offline (чтение и запись) | Устанавливает, будет ли использоваться подключение сервера. Если установлено значение False, вы должны указать URL-адрес сервера или файл подключения ArcGIS Server (.ags) для свойства targetServer, чтобы создать файл черновика определения сервиса (.sddraft) с помощью функции exportToSDDraft. Если установлено значение True, то файл черновика определения сервиса может быть создан без заполнения параметра targetServer. | Boolean |
offlineTarget (чтение и запись) | Строка, определяющая версию целевого сервера, на который будет опубликовано определение сервиса. Указание версии позволяет быть уверенным в том, что в определении сервиса содержится ресурс, совместимый с вашим сервером. Это свойство поддерживается, только если для offline задано True.
| String |
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.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(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.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт создает файла черновика определения картографического сервиса (.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 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)
"""Modify the .sddraft file to enable the feature capability and set map service and feature service properties"""
# 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 the feature capability
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
# Set map service properties
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":
# Defaults are Map,Query,Data
keyValue.nextSibling.firstChild.data = "Map,Data"
# Set feature service properties
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:
if extElement.tagName == 'Info':
for propSet in extElement.childNodes:
for prop in propSet.childNodes:
for prop1 in prop.childNodes:
if prop1.tagName == "Key":
if prop1.firstChild.data == 'WebCapabilities':
# Defaults are Query,Create,Update,Delete,Uploads,Editing
prop1.nextSibling.firstChild.data = "Create,Sync,Query"
# 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.server.StageService(sddraft_mod_xml_file, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(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.server.StageService(sddraft_mod_xml_file, sd_output_filename)
warnings = arcpy.GetMessages(1)
print(warnings)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(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 + "/" + 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"""
# Read the file
doc = DOM.parse(sddraft_output_filename)
# 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"
# 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.server.StageService(sddraft_mod_xml_file, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт создает файл черновика определения картографического сервиса (.sddraft) для карты. Файл определения черновика сервиса анализируется во время промежуточного хранения. Если возвращается код 24011, предупреждающий, что источник данных не зарегистрирован на сервере, хранилище данных регистрируется с помощью функции AddDataStoreItem.
import arcpy
import os
arcpy.env.overwriteOutput = True
# 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 the service and analyze the .sddraft file for registered data store
# Continue publishing only if data store is registered
print("Start Staging")
stage_service = True
while stage_service:
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Get analyzer warnings to check if data store is registered
warnings = arcpy.GetMessages(1)
print(warnings)
# If data store is not registered
if "24011" in warnings:
# Register data store
db_conn = r"C:\Project\db_conn.sde"
register_msg = arcpy.AddDataStoreItem(target_server_connection, "DATABASE", "datastore_name", db_conn)
print("Registered datastore: {0}".format(register_msg))
# Stage the service again
stage_service = True
else:
stage_service = False
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
Следующий скрипт создает файл черновика определения картографического сервиса (.sddraft) для карты. Для использования данных, хранилище данных должно быть уже зарегистрировано на сервере. Затем он задает часовой пояс слоев с полями дат и настраивает параметры экземпляра сервиса, изменив черновик файла определения сервиса с помощью стандартных библиотек Python xml.etree.ElementTree и xml.dom.minidom. Затем измененный файл черновика определения сервиса размещается и публикуется в ArcGIS Server.
import arcpy
import os
import xml.dom.minidom as DOM
import codecs
import xml.etree.ElementTree as ET
def enable_extensions(sddraftPath, soe):
"""Function to enable extensions"""
# Read the .sddraft file
doc = DOM.parse(sddraftPath)
# Find all elements named TypeName
# This is where the additional layers and capabilities are defined
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
# Get the TypeName to enable
if typeName.firstChild.data == soe:
extension = typeName.parentNode
for extElement in extension.childNodes:
# Enable the feature capability
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
# Write to the .sddraft file
f = open(sddraftPath, 'w')
doc.writexml(f)
f.close()
# soe = extension for which properties must be added
def enable_configproperties(sddraftPath, soe, property_set):
"""Function to configure extension properties"""
# Read the file
doc = DOM.parse(sddraftPath)
# 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 == soe:
extension = typeName.parentNode
# prp = extension.childNodes.getElementsByTagNameNS('PropertyArray')
for extElement in extension.childNodes:
if extElement.tagName == 'Definition':
for definition in extElement.childNodes:
if definition.tagName == 'ConfigurationProperties':
for config_prop in definition.childNodes:
if config_prop.tagName == 'PropertyArray':
for prop in property_set:
prop_set = doc.createElement("PropertySetProperty")
attr = doc.createAttribute("xsi:type")
attr.value = "typens:PropertySetProperty"
prop_set.setAttributeNode(attr)
prop_key = doc.createElement("Key")
txt = doc.createTextNode(prop["key"])
prop_key.appendChild(txt)
prop_set.appendChild(prop_key)
prop_value = doc.createElement("Value")
attr = doc.createAttribute("xsi:type")
attr.value = "xs:string"
prop_value.setAttributeNode(attr)
txt = doc.createTextNode(prop["value"])
prop_value.appendChild(txt)
prop_set.appendChild(prop_value)
config_prop.appendChild(prop_set)
# Write to the .sddraft file
f = open(sddraftPath, 'w')
doc.writexml(f)
f.close()
if __name__ == "__main__":
# 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
sddraft.exportToSDDraft(sddraft_output_filename)
# Set time zone to UTC
property_set = [{
"key": "dateFieldsRespectsDayLightSavingTime",
"value": "true"
},
{
"key": "dateFieldsTimezoneID",
"value": "UTC"
}]
enable_configproperties(sddraft_output_filename, soe="MapServer", property_set=property_set)
# Enable extensions on map server
enable_extensions(sddraft_output_filename, "FeatureServer")
# enable_extensions(sddraft_output_filename, "VersionManagementServer")
# enable_extensions(sddraft_output_filename, "LRServer")
# Configure pooling options
doc = DOM.parse(sddraft_output_filename)
def_childnodes = doc.getElementsByTagName("Definition")[0].childNodes
for def_node in def_childnodes:
if def_node.nodeName == "Props":
for node in def_node.childNodes[0].childNodes:
# Change the provider to modify instance type
# provider='DMaps' for shared or 'ArcObjects11' for dedicated
if node.firstChild.firstChild.data == 'provider':
node.lastChild.firstChild.data = 'ArcObjects11'
elif node.firstChild.firstChild.data == 'MinInstances':
node.lastChild.firstChild.data = '0'
elif node.firstChild.firstChild.data == 'MaxInstances':
node.lastChild.firstChild.data = '2'
# Write to the .sddraft file
f = open(sddraft_output_filename, 'w')
doc.writexml(f)
f.close()
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(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 and offlineTarget properties
# 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
# Set offlineTarget property to "ENTERPRISE_11" for ArcGIS Server 11.0 or later
# The default is ArcGIS Server 10.9.1 or earlier
sddraft.offlineTarget = "ENTERPRISE_10x"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, r"C:\Project\gisserver.ags.esri.com (publisher).ags")
print("Finish Publishing")
Следующий скрипт создает файл черновика определения картографического сервиса (.sddraft), который активирует свойство checkUniqueIDAssignment. Файл определения черновика сервиса анализируется во время промежуточного хранения. Если карта не настроена на назначение уникальных числовых ID для публикации веб-слоев, возвращается ошибка анализатора 00374 и печатается сообщение. Более подробно см. в Назначение ID слою.
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 the check unique ID assignment 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.checkUniqueIDAssignment = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
try:
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
except Exception as stage_exception:
if "00374" in str(stage_exception):
print("The map is not set to allow assignment of unique IDs")
print("Analyzer errors encountered - {}".format(str(stage_exception)))
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))