Краткая информация
Конвертирует файлы документа карты (.mxd) в файлы черновика определения сервиса (.sddraft).
Описание
CreateMapSDDraft – это первый шаг для автоматизации публикации документа карты на ГИС-сервере с помощью ArcPy. Результатом работы CreateMapSDDraft является файл черновика определения сервиса (.sddraft). Проект определения сервиса – это комбинация документа карты, информации о сервере и набора свойств сервиса.
Информация о сервере содержит подключение к серверу или тип сервера, на который выполняется публикация, тип публикуемого сервиса, метаданные для сервиса (информация об элементе) и ссылки на данные (копируются данные на сервер или нет).
Свойства сервиса содержат сведения о том, поддерживает ли сервис кэширование и, если это так, параметры кэша. Также в них включены такие дополнительные функции сервиса, как функции доступа к объекту или OGC, а также соответствующий набор свойств для выбранной функции. Этот метод изначально использует набор свойств сервиса по умолчанию. Пользователи могут редактировать эти свойства с помощью стандартных XML-редакторов сторонних производителей. Кроме того, пользователи могут автоматизировать изменение этих свойств с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. См. примеры изменения SDDraft ниже.
Как и функция AnalyzeForSD, CreateMapSDDraft также возвращает словарь Python с ошибками и другими потенциальными проблемами, которые необходимо устранить до создания файла определения сервиса. Дополнительные сведения о типах ошибок, предупреждений и информационных сообщений, а также о доступе к ним см. в разделе AnalyzeForSD.
Проект определения сервиса можно создать без информации о подключении к серверу. В этом случае параметр connection_file_path можно опустить, однако следует предоставить параметр server_type. Подключение к серверу можно задать позже, когда черновик определения сервиса уже опубликован с помощью инструмента Загрузить определение сервиса.
Черновик определения сервиса затем может быть конвертирован в полностью готовый файл определения сервиса (.sd) с помощью инструмента Промежуточный сервис. Во время подготовки компилируется вся информация, необходимая для успешной публикации ГИС-ресурса. Если данные не зарегистрированы на сервере, они будут добавлены после подготовки проекта определения сервиса. Наконец, файл определения сервиса можно загрузить и опубликовать как ГИС-сервис на заданном сервере ГИС с помощью инструмента Загрузить определение сервиса. На этом шаге файл определения сервиса копируется на сервер, извлекается необходимая информация и публикуется ГИС-ресурс. Дополнительные сведения см. в обзоре группы инструментов Публикация.
Как только файл .sddraft будет установлен и загружен на сервер, можно использовать инструменты в группе инструментов Кэширование, чтобы создать схему размещения листов для сервисов с включенным кэшированием; например, можно использовать инструмент Построить кэш картографического сервера. Кроме того, инструменты в группе инструментов Кэширование можно применять для изменения свойств кэширования и схемы листов для сервисов с включенным кэшированием. Например, инструмент Управление масштабами кэша картографического сервера может использоваться для добавления или удаления масштабов из кэша. Это показано в примере ModifySDDraft №6. Схему размещения листов также можно изменить, редактируя файл .sddraft с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. Однако, из-за сложной структуры XML-схемы разбиения на листы, при возможности рекомендуется использовать группу инструментов Кэширование.
При публикации размещенных сервисов на ArcGIS Online или Portal for ArcGIS информация о подключении к учетной записи берется из диалогового окна Файл > Войти в главном меню ArcGIS Desktop. Более того, в некоторых конфигурациях безопасности для Portal for ArcGIS для ввода информации о подключении к учетной записи может использоваться инструмент Вход на портал. Дополнительные сведения о размещенных сервисах и о подключении к учетным записям ArcGIS Online или Portal for ArcGIS см. в следующих разделах:
- Что представляют собой размещенные сервисы ArcGIS Online?
- Подключение к учетным записям ArcGIS Online в ArcGIS Desktop
- Управление подключениями к порталу из ArcGIS 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 | Строка, представляющая путь и имя файла для выходного файла черновика определения сервиса (.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 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 | Строка, представляющая краткую информацию для элемента. По умолчанию используется Сводка из диалогового окна Свойства карты ArcMap или окно Каталог диалогового окна Описание элемента для параметра map_document. Используйте этот параметр для замены краткой информации пользовательского интерфейса или предоставления краткой информации, если она не существует. Приведенная здесь краткая информация не будет сохранена в документе карты. (Значение по умолчанию — None) | String |
tags | Строка, представляющая теги описания элемента. По умолчанию используется Теги из диалогового окна Свойства карты ArcMap или окно Каталог диалогового окна Описание элемента для параметра map_document. Используйте этот параметр для замены тегов пользовательского интерфейса или введения тегов, если они отсутствуют. Приведенные здесь теги не будут сохранены в документе карты. (Значение по умолчанию — None) | String |
Возвращаемое значение
Тип данных | Объяснение |
Dictionary | Возвращает словарь информационных сообщений, предупреждений и сообщений об ошибках Python. |
Пример кода
CreateMapSDDraft пример 1
Следующий скрипт демонстрирует полный процесс публикации картографических сервисов с использованием модуля arcpy.mapping. Публикацию картографических сервисов можно автоматизировать с помощью функций arcpy.mapping и инструментов геообработки в составе набора инструментов Публикация. Рабочий процесс начинается с документа карты, который необходимо опубликовать. Сначала с помощью функции arcpy.mapping CreateMapSDDraft создайте черновик определения сервиса. Помните, что Описание элемента, Краткая информация и Теги во входном документе карты перезаписываются значениями параметров summary и tags. Далее, необходимо проанализировать черновик определения сервиса на наличие ошибок, способных нарушить его успешную публикацию. После анализа черновика определения сервиса и устранения ошибок можно подготовить определение сервиса. В ходе подготовки в черновике определения сервиса консолидируется вся информация, необходимая для публикации сервиса в полном определении сервиса. Воспользуйтесь инструментом геообработки Организовать сервис для подготовки определения сервиса. Наконец, запустите инструмент геообработки Загрузить определение сервиса для отправки определения сервиса на сервер и публикации картографического сервиса.
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) из документа карты(.mxd) для Мои размещенные сервисы. Если проект определения сервиса не содержит ошибок анализа, он подготавливается с помощью инструмента геообработки Промежуточный сервис. Затем используется инструмент геообработки Загрузить определение сервиса, который загружает определение сервиса на ArcGIS Online или Portal for ArcGIS. Информация о подключении к учетным записям ArcGIS Online берется из файла диалогового окна >Войти в главном меню ArcGIS 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
Следующий скрипт создает файл проекта определения сервиса(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты(.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
Следующий скрипт создает файл проекта определения сервиса(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты(.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' 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 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']