摘要
MapImageSharingDraft 类允许您配置地图图像图层属性和创建服务定义草稿 (.sddraft) 文件,可将该文件共享至 ArcGIS Enterprise。
说明
要创建 MapImageSharingDraft 类对象,请使用地图类函数 getWebLayerSharingDraft 并将 service_type 参数设置为 MAP_IMAGE。 随后即可通过设置服务级别属性来配置 MapImageSharingDraft 类对象。 可以使用 federatedServerUrl 属性以指定将 web 图层发布到的联合服务器。 MapImageSharingDraft 类对象配置完成后,可以使用 exportToSDDraft 函数将其保存到服务定义草稿 (.sddraft) 文件。 然后,可以使用过渡服务和上传服务定义工具将其过渡并共享到 ArcGIS Enterprise。 有关详细信息,请参阅 arcpy.sharing 简介。
代码示例可用于以下用途:
属性
属性 | 说明 | 数据类型 |
copyDataToServer (可读写) | 用于指示地图中的数据是否复制到服务器的布尔值。 值为 True 时,将复制地图中的所有数据 - 包括在联合服务器中注册的数据。 值为 False 时,将仅复制未在联合服务器中注册的数据 - 服务将引用已在联合服务器中注册的数据。 | Boolean |
credits (可读写) | 用于表示制作者名单的字符串。 | String |
description (可读写) | 用于表示描述的字符串。 | String |
federatedServerUrl (可读写) | 用于表示 ArcGIS Enterprise 门户联合服务器 URL 的字符串。 提示:联合服务器 URL 也可以用于上传服务定义工具中的 in_server 参数。 以下代码示例对此进行了演示。 | String |
offline (可读写) | 决定是否使用门户连接的布尔值。 如果将 offline 设置为 False,则您必须登录门户,同时向 federatedServerUrl 属性提供 ArcGIS Enterprise 门户联合服务器 URL,从而使用 exportToSDDraft 函数创建服务定义草稿 (.sddraft) 文件。 如果将 offline 设置为 True,则可以在不登录门户、不填充 federatedServerUrl 属性的情况下创建服务定义草稿文件。 | Boolean |
overwriteExistingService (可读写) | 决定是否覆盖现有 web 图层的布尔值。 | Boolean |
portalFolder (可读写) | 表示要将 Web 图层发布到的现有门户文件夹的名称的字符串。 默认文件夹是“我的内容”中的根文件夹。 | String |
serverFolder (可读写) | 用于表示要将服务发布到的服务器文件夹名称的字符串。 默认文件夹是联合服务器的根文件夹。 | String |
serverType (只读) | 返回一个字符串,以表示根据地图类中的 getWebLayerSharingDraft 函数创建共享草稿时指定的服务器类型。 从 serverType 的 MapImageSharingDraft 中返回的唯一可能的值为 FEDERATED_SERVER。 FEDERATED_SERVER 的 serverType 表示支持共享至 ArcGIS Enterprise 门户联合服务器。 | String |
serviceName (可读写) | 用于表示 web 图层名称的字符串。 用户可以看到该名称并使用该名称来识别服务。 名称只能包含字母数字字符和下划线。 不允许使用空格或特殊字符。 名称不能超过 120 个字符。 | String |
summary (可读写) | 用于表示摘要的字符串。 | String |
tags (可读写) | 用于表示标签的字符串。 可以添加多个标签,标签之间用逗号或分号进行分隔。 | String |
useLimitations (可读写) | 用于表示使用限制的字符串。 | String |
方法概述
方法 | 说明 |
exportToSDDraft (out_sddraft) | 将 MapImageSharingDraft 转换为服务定义草稿 (.sddraft) 文件。 |
方法
代码示例
以下脚本将为地图创建地图图像图层服务定义草稿 (.sddraft) 文件,并设置元数据属性。 地图图像图层将发布到 ArcGIS Enterprise 中的文件夹。 门户信息可从 SignInToPortal 函数中获得。
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set metadata, portal folder, and server folder properties
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)
sddraft.federatedServerUrl = federated_server_url
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.serverFolder = "MyServerFolder"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本将覆盖地图图像图层。 如果服务名称已存在,则将覆盖该服务。 否则,将创建新服务。
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set overwrite property
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)
sddraft.federatedServerUrl = federated_server_url
sddraft.overwriteExistingService = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本可以创建地图图像图层服务定义草稿 (.sddraft) 文件。 该脚本可通过使用 xml.dom.minidom 标准 Python 库,修改服务定义草稿文件,从而在地图图像图层上启用要素访问。 然后,会将修改后的服务定义文件发布到 ArcGIS Enterprise 门户联合服务器。 必须已在服务器上注册数据存储,才能引用数据。
import arcpy
import os
import xml.dom.minidom as DOM
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set copyDataToServer property to False to reference registered data
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)
sddraft.federatedServerUrl = federated_server_url
sddraft.copyDataToServer = False
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
"""Modify the .sddraft file to enable feature access"""
# Read the file
doc = DOM.parse(sddraft_output_filename)
# Find all elements named TypeName
# This is where the addition 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:
# Enable feature access
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
# Write to a new .sddraft file
sddraft_mod_xml = service_name + '_mod_xml' + '.sddraft'
sddraft_mod_xml_file = os.path.join(outdir, sddraft_mod_xml)
f = open(sddraft_mod_xml_file, 'w')
doc.writexml(f)
f.close()
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_mod_xml_file, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本将为引用注册数据的地图图像图层创建服务定义草稿 (.sddraft) 文件。 在过渡期间,将对服务定义草稿文件进行分析。 如果返回分析器 24011,警告未将数据源注册到服务器,则将使用 AddDataStoreItem 函数注册数据存储。
import arcpy
import os
arcpy.env.overwriteOutput = True
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set copyDataToServer property to False to reference registered data
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)
sddraft.federatedServerUrl = federated_server_url
sddraft.copyDataToServer = False
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage the service and analyze the .sddraft file for registered data store
# Continue publishing only if data store is registered
print("Start Staging")
stage_service = True
while stage_service:
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Get analyzer warnings to check if data store is registered
warnings = arcpy.GetMessages(1)
print(warnings)
# If data store is not registered
if "24011" in warnings:
# Register data store
db_conn = r"C:\Project\db_conn.sde"
register_msg = arcpy.AddDataStoreItem(federated_server_url, "DATABASE", "datastore_name", db_conn)
print("Registered datastore: {0}".format(register_msg))
# Stage the service again
stage_service = True
else:
stage_service = False
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本可以创建地图图像图层服务定义草稿 (.sddraft) 文件。 它为带有日期字段的图层设置时区,并通过使用 xml.etree.ElementTree 和 xml.dom.minidom 标准 Python 库修改服务定义草稿文件来配置服务实例设置。 然后,会将修改后的服务定义文件发布到 ArcGIS Enterprise 门户联合服务器。 必须已在服务器上注册数据存储,才能引用数据。
import arcpy
import os
import xml.dom.minidom as DOM
import codecs
import xml.etree.ElementTree as ET
def enable_extensions(sddraftPath, soe):
"""Function to enable extensions"""
# Read the .sddraft file
doc = DOM.parse(sddraftPath)
# 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 == soe:
extension = typeName.parentNode
for extElement in extension.childNodes:
# Enable feature access
if extElement.tagName == 'Enabled':
extElement.firstChild.data = 'true'
# Write to the .sddraft file
f = open(sddraftPath, 'w')
doc.writexml(f)
f.close()
# soe = extension for which properties have to be added
def enable_configproperties(sddraftPath, soe, property_set):
"""Function to configure extension properties"""
# Read the file
doc = DOM.parse(sddraftPath)
# Find all elements named TypeName
# This is where the extensions are defined
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
# Get the TypeName we want to enable
if typeName.firstChild.data == soe:
extension = typeName.parentNode
# prp = extension.childNodes.getElementsByTagNameNS('PropertyArray')
for extElement in extension.childNodes:
if extElement.tagName == 'Definition':
for definition in extElement.childNodes:
if definition.tagName == 'ConfigurationProperties':
for config_prop in definition.childNodes:
if config_prop.tagName == 'PropertyArray':
for prop in property_set:
prop_set = doc.createElement("PropertySetProperty")
attr = doc.createAttribute("xsi:type")
attr.value = "typens:PropertySetProperty"
prop_set.setAttributeNode(attr)
prop_key = doc.createElement("Key")
txt = doc.createTextNode(prop["key"])
prop_key.appendChild(txt)
prop_set.appendChild(prop_key)
prop_value = doc.createElement("Value")
attr = doc.createAttribute("xsi:type")
attr.value = "xs:string"
prop_value.setAttributeNode(attr)
txt = doc.createTextNode(prop["value"])
prop_value.appendChild(txt)
prop_set.appendChild(prop_value)
config_prop.appendChild(prop_set)
# Write to the .sddraft file
f = open(sddraftPath, 'w')
doc.writexml(f)
f.close()
if __name__ == "__main__":
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set copyDataToServer property to False to reference registered data
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, 'MAP_IMAGE', service_name)
sddraft.federatedServerUrl = federated_server_url
sddraft.copyDataToServer = False
sddraft.exportToSDDraft(sddraft_output_filename)
# Set time zone to UTC
property_set = [{
"key": "dateFieldsRespectsDayLightSavingTime",
"value": "true"
},
{
"key": "dateFieldsTimezoneID",
"value": "UTC"
}]
enable_configproperties(sddraft_output_filename, soe="MapServer", property_set=property_set)
# Enable extensions on map server
enable_extensions(sddraft_output_filename, "FeatureServer")
# enable_extensions(sddraft_output_filename, "VersionManagementServer")
# enable_extensions(sddraft_output_filename, "LRServer")
# Configure pooling options
doc = DOM.parse(sddraft_output_filename)
def_childnodes = doc.getElementsByTagName("Definition")[0].childNodes
for def_node in def_childnodes:
if def_node.nodeName == "Props":
for node in def_node.childNodes[0].childNodes:
# Change the provider to modify instance type
# provider='DMaps' for shared or 'ArcObjects11' for dedicated
if node.firstChild.firstChild.data == 'provider':
node.lastChild.firstChild.data = 'ArcObjects11'
elif node.firstChild.firstChild.data == 'MinInstances':
node.lastChild.firstChild.data = '0'
elif node.firstChild.firstChild.data == 'MaxInstances':
node.lastChild.firstChild.data = '2'
# Write to the .sddraft file
f = open(sddraft_output_filename, 'w')
doc.writexml(f)
f.close()
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本可将图层和表作为地图图像图层发布至 ArcGIS Enterprise 门户。
import arcpy
import os
# Sign in to portal
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft
server_type = "FEDERATED_SERVER"
federated_server_url = "https://MyFederatedServer.esri.com/server"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name, [selected_layer, selected_table])
sddraft.federatedServerUrl = federated_server_url
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, federated_server_url)
print("Finish Publishing")
以下脚本将创建一个离线服务定义,并将其发布为地图图像图层。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapImageSharingDraftExample"
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 MapImageSharingDraft and set offline property
server_type = "FEDERATED_SERVER"
sddraft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)
sddraft.offline = True
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
# Sign in to portal to upload and publish
arcpy.SignInToPortal("https://www.portal.domain.com/webadaptor",
"MyUserName", "MyPassword")
# Share to portal
print("Start Uploading")
arcpy.UploadServiceDefinition_server(sd_output_filename, "https://MyFederatedServer.esri.com/server")
print("Finish Publishing")