摘要
FeatureSharingDraft 类允许您为 Web 要素图层创建服务定义草稿文件 (.sddraft),该文件将所有数据复制到 ArcGIS Enterprise 或 ArcGIS Online。 要配置引用注册数据的 Web 要素图层的属性,请修改 MapImageSharingDraft 类以包含要素图层。
说明
要创建 FeatureSharingDraft 对象,使用 Map 对象的 getWebLayerSharingDraft 方法并将 service_type 参数设置为 FEATURE。 随后即可通过设置服务级别属性和元数据属性来配置 FeatureSharingDraft 对象。
注:
如果未设置元数据属性(credits、description、summary、tags 和 useLimitations)或其具有空字符串,则 Web 图层项目将从地图或图层中获取元数据,具体取决于共享的内容。 有关 Web 图层如何获取元数据的详细信息,请参阅 Web 图层元数据。
配置 FeatureSharingDraft 对象后,可以使用 exportToSDDraft 方法将其保存到服务定义草稿文件 (.sddraft)。 随后即可使用过渡服务和上传服务定义工具将其过渡和共享给 ArcGIS Enterprise 或 ArcGIS Online。 有关详细信息,请参阅 arcpy.sharing 简介。
代码示例可用于以下用途:
属性
属性 | 说明 | 数据类型 |
allowExporting (可读写) | 一个布尔值,用于指定用户是否可以将网 Web 图层导出为不同格式。 | Boolean |
checkUniqueIDAssignment (可读写) | 一个布尔值,用于指定是否分析地图并确认地图属性中的允许向共享 web 图层分配唯一数字 ID 选项是否已启用。 有关详细信息,请参阅分配图层 ID。 | Boolean |
credits (可读写) | 用于表示制作者名单的字符串。 | String |
description (可读写) | 用于表示描述的字符串。 | String |
offline (可读写) | 一个布尔值,用于指定是否需要门户连接。 如果将 offline 设置为 False,则必须登录门户才能使用 exportToSDDraft 函数创建服务定义草稿文件 (.sddraft)。 如果将 offline 设置为 True,则无需登录到门户即可创建服务定义草稿文件。 | Boolean |
offlineTarget (可读写) | 一个字符串,用于指定服务定义将发布到的目标门户版本。 指定版本,确保服务定义包含与门户兼容的内容。 仅在 offline 设置为 True 时支持此属性。
| String |
overwriteExistingService (可读写) | 一个布尔值,用于指定是否覆盖现有的 Web 图层。 | Boolean |
portalFolder (可读写) | 一个字符串,代表将发布 Web 图层的门户文件夹的名称。 默认文件夹是“我的内容”中的根文件夹。 | String |
serverType (只读) | 返回一个字符串,代表根据 map 类中的 getWebLayerSharingDraft 函数创建共享草稿时指定的服务器类型。 从 FeatureSharingDraft 的 serverType 中唯一可能返回的值为 HOSTING_SERVER。 HOSTING_SERVER 的 serverType 值表示支持共享至 ArcGIS Enterprise 或 ArcGIS Online。 | String |
serviceName (可读写) | 用于表示 web 图层名称的字符串。 用户可以看到该名称并使用该名称来识别 web 图层。 名称只能包含字母数字字符和下划线。 不允许使用空格或特殊字符。 名称不能超过 120 个字符。 | String |
summary (可读写) | 用于表示摘要的字符串。 | String |
tags (可读写) | 用于表示标签的字符串。 可以添加多个标签,标签之间用逗号或分号进行分隔。 | String |
useCIMSymbols (可读写) | 一个布尔值,指定是否将使用 Esri 制图信息模型 (CIM) 符号(也称为 ArcGIS Pro 符号)。 将 useCIMSymbols 设置为 False 时,将使用所有客户端都能渲染的符号。 将 useCIMSymbols 设置为 True 时,将使用新客户端(例如 ArcGIS API for JavaScript 4.x)支持的 CIM 符号。 此属性仅在服务定义发布到 ArcGIS Online 或 ArcGIS Enterprise 11.3 或更高版本时有效。 | Boolean |
useLimitations (可读写) | 用于表示使用限制的字符串。 | String |
方法概述
方法 | 说明 |
exportToSDDraft (out_sddraft) | 将 FeatureSharingDraft 转换为服务定义草稿 (.sddraft) 文件。 |
方法
代码示例
以下脚本为地图创建 Web 要素图层服务定义草稿文件 (.sddraft),并设置元数据、导出数据属性和 CIM 符号。 Web 要素图层将发布到 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")
以下脚本将覆盖 Web 要素图层。 如果服务名称已存在,将覆盖该服务;否则,将创建新服务。
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")
以下脚本可以创建 Web 要素图层服务定义草稿文件 (.sddraft)。 该脚本可通过使用 xml.dom.minidom 标准 Python 库,修改 .sddraft 文件,从而在 Web 要素图层上设置创建和同步功能。 然后,会将修改后的 .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")
以下脚本将地图中的图层和表作为 Web 要素图层发布至门户。
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")
以下脚本将为目标门户版本创建离线服务定义,并将其发布为 Web 要素图层。
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")
以下脚本将创建启用了 checkUniqueIDAssignment 属性的 Web 要素图层服务定义草案文件 (.sddraft)。 在过渡期间,将对 .sddraft 文件进行分析。 如果地图未设置为允许分配用于共享 web 图层的唯一数字 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))
以下脚本用于设置 env 类的 useCompatibleFieldTypes 属性,将表格添加至地图,并将托管表格发布至 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")