MapServiceDraft

Краткая информация

Класс 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 для MapServiceDraftSTANDALONE_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")