Краткая информация
Класс FeatureSharingDraft позволяет вам создать файл черновика определения сервиса (.sddraft) для векторного веб-слоя, который копирует все данные либо в ArcGIS Enterprise, либо в ArcGIS Online. Чтобы настроить свойства векторного веб-слоя, который ссылается на зарегистрированные данные, измените класс MapImageSharingDraft для включения векторного слоя.
Обсуждение
Чтобы создать объект FeatureSharingDraft, используйте метод Map объекта getWebLayerSharingDraft и установите для параметра service_type значение FEATURE. Объект FeatureSharingDraft можно настроить, задав свойства уровня сервиса и свойства метаданных.
Примечание:
Если свойства метаданных (credits, description, summary, tags и useLimitations) не заданы или состоят из пустых строк, элемент веб-слоя будет получать метаданные с карты или слоя, в зависимости от того, что опубликовано. Дополнительные сведения о том, как веб-слои являются источником метаданных, см. в разделе Метаданные веб-слоя.
После настройки объекта FeatureSharingDraft он может быть сохранен в файле черновика определения сервиса (.sddraft) с помощью метода exportToSDDraft. Затем он может быть применен и опубликован либо в ArcGIS Enterprise, либо в ArcGIS Online, используя инструменты Промежуточный сервис и Выгрузить определение сервиса. Дополнительные сведения см. в разделе Введение в arcpy.sharing.
Примеры кода доступны для следующего:
- Публикация векторного веб-слоя в папке портала
- Перезапись векторного веб-слоя
- Настройка возможностей создания и синхронизации
- Публикация слоя и таблицы
- Создание и публикация определения автономнго сервиса
- Выполнение анализа для подтверждения того, что карта настроена так, чтобы разрешить присвоение уникальных числовых ID
- Публикация таблицы с использованием типов полей, совместимые с более ранними версиями ArcGIS Pro
Свойства
Свойство | Описание | Тип данных |
allowExporting (чтение и запись) | Логическое значение, указывающее, могут ли пользователи экспортировать веб-слой в другие форматы. | Boolean |
checkUniqueIDAssignment (чтение и запись) | Логическое значение, указывающее, будет ли проводиться анализ карты для того, чтобы определить, включена ли опция Разрешить назначение уникальных числовых ID для публикуемых веб-слоев в Свойствах карты. Более подробно см. в Назначение ID слою. | Boolean |
credits (чтение и запись) | Строка со сведениями об авторах. | String |
description (чтение и запись) | Строка с описанием. | String |
offline (чтение и запись) | Логическое значение, указывающее, требуется ли подключение к порталу. Если для offline задано значение False, вы должны войти на портал, чтобы создать файл черновика определения сервиса (.sddraft) с помощью функции exportToSDDraft. Если offline задан как True, файл черновика определения сервиса может быть создан без входа на портал. | Boolean |
offlineTarget (чтение и запись) | Строка, указывающая версию целевого портала, на котором будет опубликовано определение сервиса. Указание версии позволяет быть уверенным в том, что в определении сервиса содержится ресурс, совместимый с вашим порталом. Это свойство поддерживается, только если для offline задано True.
| String |
overwriteExistingService (чтение и запись) | Логическое значение, указывающее, будет ли перезаписан существующий веб-слой. | Boolean |
portalFolder (чтение и запись) | Строка, представляющая собой имя папки портала, в которой будет опубликован веб-слой. Папкой по умолчанию является корневая папка в Моих ресурсах. | String |
serverType (только чтение) | Возвращает строку, означающую тип сервера, который был указан при создании проекта публикации с помощью функции getWebLayerSharingDraft из класса map. Единственно возможное значение, возвращаемое serverType для FeatureSharingDraft, это - HOSTING_SERVER. Значение serverType, равное HOSTING_SERVER, говорит о том, что публикация в ArcGIS Enterprise или ArcGIS Online поддерживается. | String |
serviceName (чтение и запись) | Строка, представляющая имя веб-слоя. Это имя будут видеть пользователи и идентифицировать по нему веб-слой. Имя может содержать только буквы, цифры и знак подчеркивания. В имени нельзя использовать пробелы и специальные символы. Длина имени не должна превышать 120 символов. | String |
summary (чтение и запись) | Строка со сводной информацией. | String |
tags (чтение и запись) | Строка, представляющая теги. Можно добавить несколько тегов с разделением запятой или точкой с запятой. | String |
useCIMSymbols (чтение и запись) | Логическое значение, указывающее, будут ли использоваться символы Картографической информационной модели Esri (CIM), иначе называемые символами ArcGIS Pro. Установите useCIMSymbols на False, чтобы использовать символы, которые могут отображаться всеми клиентами. Установите useCIMSymbols на True, чтобы использовать символы CIM, которые поддерживаются в более новых клиентах, таких как ArcGIS API for JavaScript 4.x. Это свойство работает только в том случае, если определение сервиса опубликовано в ArcGIS Online или ArcGIS Enterprise 11.3 или более поздней версии. | Boolean |
useLimitations (чтение и запись) | Строка с ограничениями использования. | String |
Обзор метода
Метод | Описание |
exportToSDDraft (out_sddraft) | Конвертирует FeatureSharingDraft в файл черновика определения сервиса (.sddraft). |
Методы
exportToSDDraft (out_sddraft)
Параметр | Описание | Тип данных |
out_sddraft | Строка, представляющая путь и имя файла для выходного файла черновика определения сервиса (.sddraft). | String |
После настройки FeatureSharingDraft, он может быть сохранен как файл черновика определения сервиса (.sddraft). Затем он может быть размещен и опубликован на ArcGIS Enterprise или ArcGIS Online с помощью инструментов Разместить сервис и Загрузить определение сервиса.
Пример кода
Следующий скрипт создает файл черновика определения сервиса векторного веб-слоя (.sddraft) для карты и задает метаданные, свойства данных для экспорта и символы CIM. Векторный веб-слой публикуется в папке в ArcGIS Online или ArcGIS Enterprise и попадает в общий доступ (публично). Информация о портале извлекается из функции SignInToPortal.
import arcpy
import os
import xml.dom.minidom as DOM
# Sign in to portal
arcpy.SignInToPortal("https://www.arcgis.com", "MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 FeatureSharingDraft and set metadata, portal folder, export data properties, and CIM symbols
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
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.portalFolder = "my folder name"
sddraft.allowExporting = True
sddraft.useCIMSymbols = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Read the .sddraft file
docs = DOM.parse(sddraft_output_filename)
key_list = docs.getElementsByTagName('Key')
value_list = docs.getElementsByTagName('Value')
# Change following to "true" to share
SharetoOrganization = "false"
SharetoEveryone = "true"
SharetoGroup = "false"
# If SharetoGroup is set to "true", uncomment line below and provide group IDs
GroupID = "" # GroupID = "f07fab920d71339cb7b1291e3059b7a8, e0fb8fff410b1d7bae1992700567f54a"
# Each key has a corresponding value. In all the cases, value of key_list[i] is value_list[i].
for i in range(key_list.length):
if key_list[i].firstChild.nodeValue == "PackageUnderMyOrg":
value_list[i].firstChild.nodeValue = SharetoOrganization
if key_list[i].firstChild.nodeValue == "PackageIsPublic":
value_list[i].firstChild.nodeValue = SharetoEveryone
if key_list[i].firstChild.nodeValue == "PackageShareGroups":
value_list[i].firstChild.nodeValue = SharetoGroup
if SharetoGroup == "true" and key_list[i].firstChild.nodeValue == "PackageGroupIDs":
value_list[i].firstChild.nodeValue = GroupID
# Write to the .sddraft file
f = open(sddraft_output_filename, 'w')
docs.writexml(f)
f.close()
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
Следующий скрипт перезаписывает векторный веб-слой. Если имя сервиса уже существует, сервис будет заменен; если нет, то будет создан новый сервис.
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.arcgis.com", "MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 FeatureSharingDraft and set overwrite property
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
sddraft.overwriteExistingService = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
Следующий скрипт создаст файл черновика определения сервиса векторного веб-слоя (.sddraft). Затем он настроит для векторного веб-слоя функции Создать и Синхронизировать, изменив файл .sddraft с помощью стандартной xml.dom.minidom библиотеки Python. Затем этот измененный файл .sddraft будет обработан и опубликован на портале.
import arcpy
import os
import xml.dom.minidom as DOM
# Sign in to portal
arcpy.SignInToPortal("https://portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 FeatureSharingDraft
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
"""Modify the .sddraft file to enable create and sync"""
# Read the .sddraft file
doc = DOM.parse(sddraft_output_filename)
# Find all elements named TypeName
# This is where the additional layers and capabilities are defined
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
# Get the TypeName to enable
if typeName.firstChild.data == "FeatureServer":
extension = typeName.parentNode
for extElement in extension.childNodes:
if extElement.tagName == 'Definition':
for propArray in extElement.childNodes:
if propArray.tagName == 'Info':
for propSet in propArray.childNodes:
for prop in propSet.childNodes:
for prop1 in prop.childNodes:
if prop1.tagName == "Key":
if prop1.firstChild.data == 'webCapabilities':
if prop1.nextSibling.hasChildNodes():
prop1.nextSibling.firstChild.data = "Create,Sync,Query"
else:
txt = doc.createTextNode("Create,Sync,Query")
prop1.nextSibling.appendChild(txt)
# Write to the .sddraft file
f = open(sddraft_output_filename, 'w')
doc.writexml(f)
f.close()
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
Следующий скрипт публикует слой и таблицу на карте как векторный веб-слой на портале.
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.arcgis.com", "MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 layers to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
selected_layer = m.listLayers()[0]
selected_table = m.listTables()[0]
# Create FeatureSharingDraft
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name, [selected_layer, selected_table])
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
Следующий скрипт создает определение автономного сервиса для целевой версии портала и публикует его как векторный веб-слой.
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 FeatureSharingDraft and set offline and offlineTarget properties
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
sddraft.offline = True
# Set offlineTarget property to "ONLINE" for ArcGIS Online or "ENTERPRISE_11" for ArcGIS Enterprise 11.0 or later
# The default is ArcGIS Enterprise 10.9.1 or earlier
sddraft.offlineTarget = "ENTERPRISE_10x"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Sign in to portal to upload and publish
arcpy.SignInToPortal("https://portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
Следующий скрипт создает файл черновика определения сервиса векторного веб-слоя (.sddraft), который включает свойство checkUniqueIDAssignment. В процессе обработки файл .sddraft анализируется. Если карта не настроена на назначение уникальных числовых ID для публикации веб-слоев, возвращается ошибка анализатора 00374 и печатается сообщение. Более подробно см. в Назначение ID слою.
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.arcgis.com", "MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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 FeatureSharingDraft and set the check unique ID assignment property
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
sddraft.checkUniqueIDAssignment = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
try:
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")
except Exception as stage_exception:
if "00374" in str(stage_exception):
print("The map is not set to allow assignment of unique IDs")
print("Analyzer errors encountered - {}".format(str(stage_exception)))
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
Следующий скрипт задает свойство useCompatibleFieldTypes из класса env, добавляет таблицу на карту и публикует размещенную таблицу в ArcGIS Enterprise.
import arcpy
import os
# Set useCompatibleFieldTypes property
arcpy.env.useCompatibleFieldTypes = True
data = r"C:\states.csv"
# Set output file names
outdir = r"C:\Project\Output"
service_name = "FeatureSharingDraftExample"
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)
# Open existing project, create a map with a basemap, and add data
aprx = arcpy.mp.ArcGISProject(os.path.join(outdir, r"C:\Project\World.aprx"))
m = aprx.createMap(service_name, "Map")
m.addBasemap("Topographic")
m.addDataFromPath(data)
print(f"Data added: {data}")
aprx.save()
print(f"Project saved: {aprx.filePath}")
# Sign in to portal
arcpy.SignInToPortal("https://portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Create FeatureSharingDraft
server_type = "HOSTING_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "FEATURE", service_name)
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, server_type)
print("Finish Publishing")