Краткая информация
Конвертирует файлы документа карты (.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 Online? (What are ArcGIS Online hosted services?)
- Вход на ArcGIS Online в ArcGIS for Desktop (Signing into ArcGIS Online in ArcGIS for Desktop)
- Управление подключениями к порталу из ArcGIS for Desktop (Managing portal connections from ArcGIS for Desktop)
Вы также можете создать файлы черновика определения сервиса для сервисов геообработки, изображений и геокодирования. См. следующие связанные функции:
Синтаксис
CreateMapSDDraft (map_document, out_sddraft, service_name, {server_type}, {connection_file_path}, {copy_data_to_server}, {folder_name}, {summary}, {tags})
Параметр | Объяснение | Тип данных |
map_document | Переменная, которая ссылается на объект MapDocument. Фрейм данных, который был активным в момент сохранения map_document, будет опубликован. | 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_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.
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']