CreateMapSDDraft (arcpy.mapping)

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

Конвертирует файлы документа карты (.mxd) в файлы черновика определения сервиса (.sddraft).

Обсуждение

CreateMapSDDraft – это первый шаг для автоматизации публикации документа карты на ГИС-сервере с помощью ArcPy. Результатом работы CreateMapSDDraft является файл проекта определения сервиса (.sddraft). Проект определения сервиса – это комбинация документа карты, информации о сервере и набора свойств сервиса.

Информация о сервере содержит подключение к серверу или тип сервера, на который выполняется публикация, тип публикуемого сервиса, метаданные для сервиса (информация об элементе) и ссылки на данные (копируются данные на сервер или нет).

Свойства сервиса содержат сведения о том, поддерживает ли сервис кэширование и, если это так, параметры кэша. Также в них включены такие дополнительные функции сервиса, как функции доступа к объекту или OGC, а также соответствующий набор свойств для выбранной функции. Этот метод изначально использует набор свойств сервиса по умолчанию. Пользователи могут редактировать эти свойства с помощью стандартных XML-редакторов сторонних производителей. Кроме того, пользователи могут автоматизировать изменение этих свойств с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. См. примеры изменения SDDraft ниже.

ПримечаниеПримечание:

Проект определения сервиса не содержит данные. Проект сервиса сам по себе не может использоваться для публикации сервиса.

Как и функция AnalyzeForSD, CreateMapSDDraft также возвращает словарь Python с ошибками и другими потенциальными проблемами, которые необходимо устранить до создания файла определения сервиса. Дополнительные сведения о типах ошибок, предупреждений и информационных сообщений, а также о доступе к ним см. в разделе AnalyzeForSD.

Проект определения сервиса можно создать без информации о подключении к серверу. В этом случае параметр connection_file_path можно опустить, однако следует предоставить параметр server_type. Подключение к серверу можно задать позже, когда черновик определения сервиса уже опубликован с помощью инструмента Загрузить определение сервиса (Upload Service Definition).

Черновик определения сервиса затем может быть конвертирован в полностью готовый файл определения сервиса (.sd) с помощью инструмента Промежуточный сервис (Stage Service). Во время подготовки компилируется вся информация, необходимая для успешной публикации ГИС-ресурса. Если данные не зарегистрированы на сервере, они будут добавлены после подготовки проекта определения сервиса. Наконец, файл определения сервиса можно загрузить и опубликовать как ГИС-сервис на заданном сервере ГИС с помощью инструмента Загрузить определение сервиса (Upload Service Definition). На этом шаге файл определения сервиса копируется на сервер, извлекается необходимая информация и публикуется ГИС-ресурс. Дополнительные сведения см. в обзоре группы инструментов Публикация (Publishing).

После того как .sddraft создан и загружен на сервер, инструменты в группе Кэширование (Caching) можно использовать для создания схемы разбиения на листы для сервисов с включенным кэшированием; например, можно использовать инструмент Построить кэш картографического сервера (Create Map Server Cache). Кроме того, инструменты в группе инструментов Кэширование (Caching) можно применять для изменения свойств кэширования и схемы листов для сервисов с включенным кэшированием. Например, инструмент Управление масштабами кэша картографического сервера (Manage Map Server Cache Scales) может использоваться для добавления или удаления масштабов из кэша. Это показано в примере ModifySDDraft №6. Схему листов также можно изменить, редактируя файл .sddraft с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. Однако, из-за сложной структуры XML-схемы разбиения на листы, при возможности рекомендуется использовать группу инструментов Кэширование (Caching).

При публикации сетевых сервисов на ArcGIS Online или Portal for ArcGIS информация о входе берется из диалогового окна Файл (File) > Войти (Sign In) главного меню ArcGIS for Desktop. Кроме того, в некоторых конфигурациях Portal for ArcGIS для ввода информации для входа может использоваться инструмент Вход на портал (Sign In To Portal). Дополнительные сведения о сетевых сервисах и о входе на ArcGIS Online или Portal for ArcGIS содержатся в следующих разделах:

ПримечаниеПримечание:

Интерфейс ArcGIS for Server Administrator API позволит вам выполнять с использованием скрипта определенные действия с сервером. Например, остановка и запуск сервисов, редактирование свойств сервисов, таких как максимальное число экземпляров, назначение и отмена пользовательских прав для сервисов и т.д.

Вы также можете создать файлы черновика определения сервиса для сервисов геообработки, изображений и геокодирования. См. следующие связанные функции:

Синтаксис

CreateMapSDDraft (map_document, out_sddraft, service_name, {server_type}, {connection_file_path}, {copy_data_to_server}, {folder_name}, {summary}, {tags})
ПараметрОбъяснениеТип данных
map_document

Переменная, которая ссылается на объект MapDocument.

MapDocument
out_sddraft

Строка, представляющая путь и имя файла для выходного файла черновика определения сервиса (Service Definition Draft) (.sddraft).

String
service_name

Строка, представляющая имя сервиса. Это имя будут видеть пользователи и идентифицировать по нему сервис. Имя может содержать только буквы, цифры и подчеркивания. В имени нельзя использовать пробелы и специальные символы. Длина имени не должна превышать 120 символов.

String
server_type

Строка, представляющая тип сервера. Если параметр connection_file_path не указан, следует предоставить параметр server_type. Если параметр connection_file_path не указан, параметр server_type берется из файла подключения. В этом случае можно выбрать FROM_CONNECTION_FILE или пропустить весь параметр.

  • ARCGIS_SERVERArcGIS for Server тип сервера
  • FROM_CONNECTION_FILEПолучите server_type, указанный в параметре connection_file_path
  • MY_HOSTED_SERVICESТип сервера моих размещенных сервисов для ArcGIS Online или Portal for ArcGIS

Прежние версииПрежние версии:

Начиная с версии ArcGIS 10.2.1 for Desktop, SPATIAL_DATA_SERVER не поддерживает server_type. Более подробно см. раздел Что нового в ArcGIS 10.2.1 for Server.

(Значение по умолчанию — ARCGIS_SERVER)

String
connection_file_path

Строка, содержащая путь и имя файла подключения ArcGIS for Server (.ags).

Если значение server_type равно MY_HOSTED_SERVICES, copy_data_to_server не требуется.

String
copy_data_to_server

Логический параметр, указывающий на то, будут ли данные, описанные в документе карты, скопированы на сервер или нет. Параметр copy_data_to_server используется, только если значение server_type равно ARCGIS_SERVER, а параметр connection_file_path не указан. Если параметр connection_file_path указан, используются зарегистрированные хранилища данных сервера. Например, если данные в map_document зарегистрированы на сервере, значение copy_data_to_server всегда будет равно False. И наоборот, если данные в map_document не зарегистрированы на сервере, значение copy_data_to_server всегда будет равно True.

Если значение server_type равно MY_HOSTED_SERVICES, copy_data_to_server всегда будет иметь значение True. Сервисы размещенных карт всегда копируют данные на сервер.

(Значение по умолчанию — False)

Boolean
folder_name

Строка, представляющая имя папки, в которой требуется опубликовать определение сервиса. Если папка не существует, она будет создана. Папкой по умолчанию является корневая папка сервера.

(Значение по умолчанию — None)

String
summary

Строка, представляющая сводку описания элемента.

По умолчанию используется параметр Сводка (Summary) из диалогового окна Свойства карты (Map Properties) ArcMap или диалогового окна Описание элемента (Item Description) окна Каталога для параметра map_document. Используйте этот параметр для замены сводки пользовательского интерфейса или предоставления сводки, если она не существует. Приведенная здесь сводка не будет сохранена в документе карты.

(Значение по умолчанию — None)

String
tags

Строка, представляющая теги описания элемента.

По умолчанию используется параметр Сводка (Summary) из диалогового окна Свойства карты (Map Properties) ArcMap или диалогового окна Описание элемента (Item Description) окна Каталога для параметра map_document. Используйте этот параметр для замены тегов пользовательского интерфейса или введения тегов, если они отсутствуют. Приведенные здесь теги не будут сохранены в документе карты.

(Значение по умолчанию — None)

String
Возвращено значение
Тип данныхОбъяснение
Dictionary

Возвращает словарь информационных сообщений, предупреждений и сообщений об ошибках Python.

Пример кода

CreateMapSDDraft пример 1

Следующий скрипт демонстрирует полный процесс публикации картографических сервисов с использованием модуля arcpy.mapping. Публикацию картографических сервисов можно автоматизировать с помощью функций arcpy.mapping и инструментов геообработки в составе набора инструментов Публикация (Publishing). Сначала необходимо выбрать документ карты, который необходимо опубликовать. Сначала с помощью функции arcpy.mapping CreateMapSDDraft создайте черновик определения сервиса. Помните, что Описание (Description) элемента, Сводка (Summary) и Теги (Tags) во входном документе карты перезаписываются значениями параметров summary и tags. Далее, необходимо проанализировать черновик определения сервиса на наличие ошибок, способных нарушить его успешную публикацию. После анализа черновика определения сервиса и устранения ошибок можно подготовить определение сервиса. В ходе подготовки в черновике определения сервиса консолидируется вся информация, необходимая для публикации сервиса в полном определении сервиса. Воспользуйтесь инструментом геообработки Сервис подготовки (Stage Service) для подготовки определения сервиса. Наконец, запустите инструмент геообработки Передать определение сервиса (Upload Service Definition) для отправки определения сервиса на сервер и публикации картографического сервиса.

import arcpy

# define local variables
wrkspc = 'C:/Project/'
mapDoc = arcpy.mapping.MapDocument(wrkspc + 'counties.mxd')
con = 'GIS Servers/arcgis on MyServer_6080 (publisher).ags' 
service = 'Counties'
sddraft = wrkspc + service + '.sddraft'
sd = wrkspc + service + '.sd'
summary = 'Population Density by County'
tags = 'county, counties, population, density, census'

# create service definition draft
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER', 
                                          con, True, None, summary, tags)

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # Execute StageService
    arcpy.StageService_server(sddraft, sd)
    # Execute UploadServiceDefinition
    arcpy.UploadServiceDefinition_server(sd, con)
else: 
    # if the sddraft analysis contained errors, display them
    print analysis['errors']
Пример CreateMapSDDraft 2

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем печатается словарь Python, состоящий из ошибок, предупреждений и информационных сообщений, которые возвращаются функцией CreateSDDraft. Аналитическая информация в словаре Python позволяет определить потенциальные проблемы с производительностью и ошибки карты, которые необходимо устранить до создания файла определения сервиса (.sd). Этот скрипт также показывает, как создать проект определения сервиса без указания сведений о подключении к серверу.

import arcpy

mapDoc = arcpy.mapping.MapDocument('C:/Project/counties.mxd') 
service = 'Counties'
sddraft = 'C:/Project/' + service + '.sddraft'
        
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

for key in ('messages', 'warnings', 'errors'):
  print "----" + key.upper() + "---"
  vars = analysis[key]
  for ((message, code), layerlist) in vars.iteritems():
    print "    ", message, " (CODE %i)" % code
    print "       applies to:",
    for layer in layerlist:
        print layer.name,
    print
Пример CreateMapSDDraft 3

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (Map Document)(.mxd) для Мои сетевые сервисы (My Hosted Services). Если проект определения сервиса не содержит ошибок анализа, он подготавливается с помощью инструмента геообработки Сервис стадий (Stage Service). Затем используется инструмент геообработки Загрузить определение сервиса (Upload Service Definition) для загрузки определения сервиса на ArcGIS Online или Portal for ArcGIS. ArcGIS Online информация для входа (sign in information) берется из диалогового окна Файл (File) > Войти (Sign In) в главном меню ArcGIS for Desktop.

import arcpy

mapDoc = arcpy.mapping.MapDocument('C:/Project/counties.mxd') 
service = 'Counties'
sddraft = 'C:/Project/{}.sddraft'.format(service)
sd = 'C:/Project/{}.sd'.format(service)

# create service definition draft
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'MY_HOSTED_SERVICES')

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # create service definition
    arcpy.StageService_server(sddraft, sd)
    # publish to My Hosted Services
    arcpy.UploadServiceDefinition_server(sd, 'My Hosted Services')
else: 
    # if the sddraft analysis contained errors, display them
    print analysis['errors']
Пример изменения SDDraft 1

Следующий скрипт изменяет элемент Item Information Description, используя стандартную библиотеку Python xml.dom.minidom. Затем измененный проект определения сервиса (.sddraft) сохраняется в новом файле. И, наконец, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
# the new description
newDesc = 'US Counties Map'
xml = r"C:\Project\Counties.sddraft"
doc = DOM.parse(xml)
# find the Item Information Description element 
descriptions = doc.getElementsByTagName('Description')
for desc in descriptions:
    if desc.parentNode.tagName == 'ItemInfo':
        # modify the Description
        if desc.hasChildNodes():
            desc.firstChild.data = newDesc
        else:
            txt = doc.createTextNode(newDesc)
            desc.appendChild(txt)
# output to a new sddraft
outXml = r"C:\Project\Output\CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze the new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 2

Следующий скрипт изменяет элемент Staging Settings TextAntialiasingMode, используя стандартную библиотеку Python xml.dom.minidom. Затем измененный проект определения сервиса (.sddraft) сохраняется в новом файле. И, наконец, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
# the new TextAntiAliasingMode value
newTextAntialiasingMode = 'Normal'
xml = r"C:\Project\Counties.sddraft"
doc = DOM.parse(xml)
keys = doc.getElementsByTagName('Key')
for key in keys:
    if key.hasChildNodes():
        if key.firstChild.data == 'textAntialiasingMode':
	    # modify the TextAntiAliasingMode value
	    key.nextSibling.firstChild.data = newTextAntialiasingMode
			
# output to a new sddraft
outXml = r"C:\Project\Output\CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()

# analyze the new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 3

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем активируются функции WMSServer и задается значение свойства Title за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Затем измененный файл .sddraft сохраняется в новом файле. И, наконец, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 

# Reference map document for CreateSDDraft function.
mapDoc = arcpy.mapping.MapDocument('C:/project/counties.mxd') 
# Create service and sddraft variables for CreateSDDraft function.
service = 'Counties'
sddraft = 'C:/Project/' + service + r'.sddraft'
  
# Create sddraft.
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# These are the properties we will change in the sddraft xml.
soe = 'WMSServer'
soeProperty = 'title'
soePropertyValue = 'USACounties'

# Read the sddraft xml.
doc = DOM.parse(sddraft)
# Find all elements named TypeName. This is where the server object extension (SOE) names are defined.
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    # Get the TypeName whose properties we want to modify.
    if typeName.firstChild.data == soe:
        extension = typeName.parentNode
        for extElement in extension.childNodes:
            # Enabled SOE.
            if extElement.tagName == 'Enabled':
                extElement.firstChild.data = 'true'
            # Modify SOE property. We have to drill down to the relevant property.
            if extElement.tagName == 'Props':
                for propArray in extElement.childNodes:
                    for propSet in propArray.childNodes:
                        for prop in propSet.childNodes:
                            if prop.tagName == "Key":
                                if prop.firstChild.data == soeProperty:
                                    if prop.nextSibling.hasChildNodes():
                                        prop.nextSibling.firstChild.data = soePropertyValue
                                    else:
                                        txt = doc.createTextNode(soePropertyValue)
                                        prop.nextSibling.appendChild(txt)
                                        
# Output to a new sddraft.
outXml = "C:/Project/Output/CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()       

# Analyze the new sddraft for errors.
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 4

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем отключаются функции KmlServer за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Затем измененный файл .sddraft сохраняется в новом файле. И, наконец, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 

# Reference map document for CreateSDDraft function.
mapDoc = arcpy.mapping.MapDocument('C:/project/counties.mxd')
# Create service and sddraft variables for CreateSDDraft function.
service = 'Counties'
sddraft = 'C:/Project/' + service + '.sddraft'
 
# Create sddraft.
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# The Server Object Extension (SOE) to disable.
soe = 'KmlServer'

# Read the sddraft xml.
doc = DOM.parse(sddraft)
# Find all elements named TypeName. This is where the server object extension (SOE) names are defined.
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    # Get the TypeName we want to disable.
    if typeName.firstChild.data == soe:
        extension = typeName.parentNode
        for extElement in extension.childNodes:
            # Disabled SOE.
            if extElement.tagName == 'Enabled':
                extElement.firstChild.data = 'false'
                                        
# Output to a new sddraft.
outXml = "C:/Project/Output/CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()       

# Analyze the new sddraft for errors.
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 5

Следующий скрипт создает файл проекта определения сервиса (Service Definition Draft)(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты (Map Document)(.mxd). Затем включается кэширование для сервиса за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Затем измененный файл .sddraft сохраняется в новом файле. И, наконец, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
import os

# define local variables
wrkspc = 'C:/Project/'
mapDoc = arcpy.mapping.MapDocument(wrkspc + 'counties.mxd')
con = 'GIS Servers\arcgis on MyServer_6080 (admin).ags' 
service = 'Counties'
sddraft = wrkspc + service + '.sddraft'
sd = os.path.join(wrkspc, "output", service + '.sd')

# create sddraft
if os.path.exists(sddraft): os.remove(sddraft)
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# read sddraft xml
doc = DOM.parse(sddraft)

# turn on caching in the configuration properties
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":
                # turn on caching
                keyValue.nextSibling.firstChild.data = "true"
                
# output to a new sddraft
outXml = "C:\Project\Output\CountiesForWeb.sddraft"   
if os.path.exists(outXml): os.remove(outXml)
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)

# print dictionary of messages, warnings and errors
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print

del f, doc, mapDoc
Пример изменения SDDraft 6

Следующий скрипт создает файл проекта определения сервиса (Service Definition Draft)(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты (Map Document)(.mxd). Затем включается кэширование для сервиса за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Затем измененный файл .sddraft сохраняется в новом файле. Далее, новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD. После анализа черновика определения сервиса можно подготовить определение сервиса. Воспользуйтесь инструментом геообработки Сервис подготовки (Stage Service) для подготовки определения сервиса. Затем запустите инструмент геообработки Загрузить определение сервиса (Upload Service Definition) для отправки определения сервиса на сервер и публикации картографического сервиса. После публикации сервиса скрипт вызывает инструмент геообработки Управление масштабами кэша картографического сервиса (Manage Map Server Cache Scales), который обновляет уровни масштабов в существующем кэшированном картографическом сервисе или сервисе изображений. Используйте этот инструмент для добавления или удаления масштабов из кэша. Наконец, скрипт вызывает инструмент геообработки Управление листами кэша картографического сервера (Manage Map Server Cache Tiles) для построения листов кэша картографического сервиса.

import arcpy
import xml.dom.minidom as DOM 
import os

# define local variables
wrkspc = 'C:/Project'
systemFolder = 'C:/Users/<username>/AppData/Roaming/ESRI/Desktop10.2/ArcCatalog'
server = 'arcgis on MyServer_6080 (publisher)'
service = 'Counties'

# build paths to data
mapDoc = arcpy.mapping.MapDocument(os.path.join(wrkspc, 'counties.mxd'))
connection = os.path.join(systemFolder, server + '.ags')
mapServer = os.path.join(systemFolder, server, service + '.MapServer')
sddraft = os.path.join(wrkspc, service + '.sddraft')
sd = os.path.join(wrkspc, 'output', service + '.sd')

# create sddraft
if os.path.exists(sddraft): os.remove(sddraft)
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# read sddraft xml
doc = DOM.parse(sddraft)

# turn on caching in the configuration properties
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":
                # turn on caching
                keyValue.nextSibling.firstChild.data = "true"
                
# output to a new sddraft
outXml = os.path.join(wrkspc, 'output', service + '.sddraft')   
if os.path.exists(outXml): os.remove(outXml)
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)

# print dictionary of messages, warnings and errors
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # Execute StageService
    if os.path.exists(sd): os.remove(sd)
    arcpy.StageService_server(outXml, sd)
    # Execute UploadServiceDefinition
    print "Uploading Service Definition..."
    arcpy.UploadServiceDefinition_server(sd, connection)
    # Print messaging from UploadServiceDefinition
    x = 0
    while x < arcpy.GetMessageCount():
        arcpy.AddReturnMessage(x)
        x = x + 1
else: 
    print "{} contained errors. StageService and UploadServiceDefinition aborted.".format(sddraft)
    exit()
    
print "Updating cache scales..."
scaleValues = "100000000;10000000;5000000;1000000;500000;250000;125000;64000;5250"
arcpy.ManageMapServerCacheScales_server(mapServer, scaleValues)

print "Creating tiles..."
arcpy.ManageMapServerCacheTiles_server(mapServer, "100000000", "RECREATE_ALL_TILES", "3")

print "Uploaded service and created tiles."
Пример изменения SDDraft 7

Приведенный ниже пример скрипта показывает, как обновить существующий сервис объектов, который размещен на ArcGIS Online. Например, в организации производится обновление для синхронизации изменений, внесенных пользователями ArcGIS for Desktop в течение дня. В этом примере скрипта будет показано, как сделать следующее:

  • Преобразовать документ карты в файл .sddraft.
  • Изменить настройки файла XML.
  • Проверить файл .sddraft на предмет наличия ошибок.
  • Поместите файл .sddraft в файл определения сервиса .sd.
  • Загрузите сервис в ArcGIS Online. Обратите внимание, что этот код сервиса объектов является общим для всех, кто находится в ArcGIS Online.

Обновите переменные, указав свой путь к файлу MXD. Скрипт создаст временные черновики в том же местоположении, где этот скрипт был сохранен. ArcGIS Online информация для входа берется из диалогового окна Файл (File) > Войти (Sign In) в главном меню ArcGIS for Desktop.

import arcpy, os, sys
import xml.dom.minidom as DOM

arcpy.env.overwriteOutput = True

# Update these variables
# The tempPath variable is a relative path which is the same directory
# this script is saved to. You can modify this value to a path on your
# system to hold the temporary files.
serviceName = "importantPoints"
tempPath = sys.path[0]
path2MXD = r"C:\path2MXD\pts.mxd"

# All paths are built by joining names to the tempPath
SDdraft = os.path.join(tempPath, "tempdraft.sddraft")
newSDdraft = os.path.join(tempPath, "updatedDraft.sddraft")
SD = os.path.join(tempPath, serviceName + ".sd")

mxd = arcpy.mapping.MapDocument(path2MXD)
arcpy.mapping.CreateMapSDDraft(mxd, SDdraft, serviceName, "MY_HOSTED_SERVICES")

# Read the contents of the original SDDraft into an xml parser
doc = DOM.parse(SDdraft)

# The follow 5 code pieces modify the SDDraft from a new MapService
# with caching capabilities to a FeatureService with Query,Create,
# Update,Delete,Uploads,Editing capabilities. The first two code
# pieces handle overwriting an existing service. The last three pieces
# change Map to Feature Service, disable caching and set appropriate
# capabilities. You can customize the capabilities by removing items.
# Note you cannot disable Query from a Feature Service.
tagsType = doc.getElementsByTagName('Type')
for tagType in tagsType:
    if tagType.parentNode.tagName == 'SVCManifest':
        if tagType.hasChildNodes():
            tagType.firstChild.data = "esriServiceDefinitionType_Replacement"

tagsState = doc.getElementsByTagName('State')
for tagState in tagsState:
    if tagState.parentNode.tagName == 'SVCManifest':
        if tagState.hasChildNodes():
            tagState.firstChild.data = "esriSDState_Published"

# Change service type from map service to feature service
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    if typeName.firstChild.data == "MapServer":
        typeName.firstChild.data = "FeatureServer"

# 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"

# Turn on 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 = "Query,Create,Update,Delete,Uploads,Editing"

# Write the new draft to disk
f = open(newSDdraft, 'w')
doc.writexml( f )
f.close()

# Analyze the service
analysis = arcpy.mapping.AnalyzeForSD(newSDdraft)

if analysis['errors'] == {}:
    # Stage the service
    arcpy.StageService_server(newSDdraft, SD)

    # Upload the service. The OVERRIDE_DEFINITION parameter allows you to override the
    # sharing properties set in the service definition with new values. In this case,
    # the feature service will be shared to everyone on ArcGIS.com by specifying the
    # SHARE_ONLINE and PUBLIC parameters. Optionally you can share to specific groups
    # using the last parameter, in_groups.
    arcpy.UploadServiceDefinition_server(SD, "My Hosted Services", serviceName,
                                         "", "", "", "", "OVERRIDE_DEFINITION", "SHARE_ONLINE",
                                         "PUBLIC", "SHARE_ORGANIZATION", "")

    print "Uploaded and overwrote service"

else:
    # If the sddraft analysis contained errors, display them and quit.
    print analysis['errors']
5/10/2014