摘要
MapServiceDraft 类允许您为地图服务创建服务定义草稿文件 (.sddraft),该文件将向 ArcGIS Server 复制所有数据或引用注册数据。
说明
要创建 MapServiceDraft 对象,请使用 arcpy.sharing.CreateSharingDraft 函数并将 server_type 参数设置为 STANDALONE_SERVER 以及将 service_type 参数设置为 MAP_SERVICE。 随后即可通过设置服务级别属性和元数据属性来配置 MapServiceDraft 对象。 可以使用 targetServer 属性以指定将地图服务发布到的服务器。
您也可以通过修改 .sddraft 文件设置地图服务属性。 如果没有为属性指定值,则会设置默认值。 即使要覆盖具有已配置属性的地图服务,也必须设置相应的属性值。
注:
如果未设置元数据属性(credits、description、summary、tags 和 useLimitations)或其具有空字符串,则地图服务将从地图中获取元数据。
有关创作元数据的详细信息,请参阅查看和编辑元数据。
配置 MapServiceDraft 对象后,可以使用 exportToSDDraft 方法将其保存到服务定义草稿文件 (.sddraft)。 然后,可以使用过渡服务和上传服务定义工具将其过渡并共享到 ArcGIS Server。 有关详细信息,请参阅什么是 arcpy.sharing 模块。
将 .sddraft 文件过渡并上传到服务器后,可使用缓存工具集中的工具(如管理地图服务器缓存切片工具)创建和管理地图服务器缓存以加快地图服务显示。
代码示例可用于以下用途:
属性
属性 | 说明 | 数据类型 |
cache.cacheOnDemand (可读写) | 指定未缓存的切片是否将按需(即当客户端应用程序请求时)创建。 默认值为 False。 | Boolean |
cache.configuration (可读写) | 由生成地图服务器缓存切片方案工具生成的预定义切片方案 .xml 文件的路径和文件名。 | String |
cache.exportTiles (可读写) | 指定是否允许客户端下载地图切片以供离线使用。 默认值为 False。 | Boolean |
cache.exportTilesCount (可读写) | 单个请求中可下载的最大切片数量。 仅在属性 cache.exportTiles 设置为 True 时支持此属性。 默认值为 100000。 | Integer |
cache.useExistingCache (可读写) | 指定是否从现有缓存中提取数据。 仅在属性 enableCache 设置为 True 时支持此属性。 默认值为 False。 | Boolean |
checkUniqueIDAssignment (可读写) | 指定是否分析地图以确认地图属性中的允许向共享 web 图层分配唯一数字 ID 选项是否已启用。 有关详细信息,请参阅分配图层 ID。 | Boolean |
copyDataToServer (可读写) | 指定是否将地图中的数据复制到服务器。 值为 True 时,将复制地图中的所有数据,包括在服务器中注册的数据。 值为 False 时,仅会复制未在服务器中注册的数据。 服务将引用已在服务器中注册的数据。 默认值为 False。 | Boolean |
credits (可读写) | 地图服务的配额。 | String |
description (可读写) | 地图服务的描述。 | String |
enableCache (可读写) | 指定 Web 图层是否动态绘制或从缓存绘制。 默认值为 False。 | Boolean |
enableDynamicWorkspaces (可读写) | 指定是否允许用户更改 Web 图层的外观或绘制行为。 默认值为 True。 | Boolean |
extension.feature.allowTrueCurvesUpdates (可读写) | 指定是否允许 Web 客户端使用增密几何更新要素的真曲线几何。 仅当启用编辑时才支持此属性。 默认值为 True。 | Boolean |
extension.feature.allowUpdateWithoutMValues (可读写) | 指定是否允许几何在不指定 m 值的情况下更新为启用了 m 值的要素。 默认值为 False。 | Boolean |
extension.feature.featureCapabilities (可读写) | 已启用的功能,以逗号分隔。 支持以下功能:
| String |
extension.feature.isEnabled (可读写) | 指定是否包含要素服务。 默认值为 False。 | Boolean |
extension.feature.onlyAllowTrueCurveUpdatesByTrueCurveClients (可读写) | 指定是否只有支持真曲线的客户端(例如 ArcGIS Pro)才可以更新真曲线几何。 仅当启用编辑时才支持此属性。 默认值为 True。 | Boolean |
extension.feature.zDefault.enable (可读写) | 指定是否允许编辑者通过不允许指定 z 值的客户端添加或更新要素。 默认值为 False。 | Boolean |
extension.feature.zDefault.value (可读写) | 插入或更新要素时将使用的默认 z 值。 仅在属性 zDefault.enable 设置为 True 时支持此属性。 默认值为 0。 | Double |
extension.kml.isEnabled (可读写) | 指定是否启用 KML 功能。 默认值为 False。 | Boolean |
extension.ogcFeature.isEnabled (可读写) | 指定是否启用 OGC 要素服务。 默认值为 False。 | Boolean |
extension.wcs.isEnabled (可读写) | 指定是否启用 WCS 功能。 默认值为 False。 | Boolean |
extension.wfs.isEnabled (可读写) | 指定是否启用 WFS 服务。 默认值为 False。 | Boolean |
extension.wms.isEnabled (可读写) | 指定是否启用 WMS 服务。 默认值为 False。 | Boolean |
mapOperations (可读写) | 已启用的操作,以逗号分隔。 支持以下操作:
| String |
maxRecordCount (可读写) | 服务器在查询期间返回的最大记录数。 默认值为 2000。 | Integer |
offline (可读写) | 指定是否使用服务器连接。 如果设置为 False,则必须向 targetServer 属性提供服务器 URL 或 ArcGIS Server 连接文件 (.ags),才能使用 exportToSDDraft 函数创建服务定义草稿文件 (.sddraft)。 如果设置为 True,则可以在未填充 targetServer 属性的情况下,创建服务定义草稿文件。 | Boolean |
offlineTarget (可读写) | 将发布服务定义的目标服务器版本。 指定一个版本可确保服务定义包含与服务器兼容的内容。 仅在属性 offline 设置为 True 时支持此属性。
| String |
overwriteExistingService (可读写) | 指定是否覆盖具有相同名称的现有服务。 | Boolean |
pooling.maxInstances (可读写) | 每台计算机的最大实例数。 仅在属性 pooling.type 设置为 DEDICATED 时支持此属性。 | Integer |
pooling.minInstances (可读写) | 每台计算机的最小实例数。 仅在属性 pooling.type 设置为 DEDICATED 时支持此属性。 | Integer |
pooling.type (可读写) | 将使用的实例池化的类型。
| String |
serverFolder (可读写) | 服务将发布到的服务器文件夹的名称。 默认文件夹是服务器的根文件夹。 如果不存在此文件夹,则会进行创建。 | String |
serverType (只读) | 通过 CreateSharingDraft 函数创建 MapServiceDraft 时指定的服务器类型。 从 MapServiceDraft 的 serverType 中返回的唯一可能的值为 STANDALONE_SERVER。 serverType 的 STANDALONE_SERVER 表示支持为 ArcGIS Server 创建地图服务。 | String |
serviceName (可读写) | 地图服务的名称。 用户可以看到该名称并使用该名称来识别服务。 名称只能包含字母数字字符和下划线。 不允许使用空格或特殊字符。 名称不能超过 120 个字符。 | String |
summary (可读写) | 地图服务的摘要。 | String |
tags (可读写) | 地图服务的标签。 多个标签可以用逗号分隔。 | String |
targetServer (可读写) | 将发布地图的服务器。 可以使用以下任一格式指定此服务器:
有关详细信息,请参阅连接到 GIS 服务器。 提示:该属性也可以在上传服务定义工具中的 in_server 参数中使用。 | String |
timezone.DaylightSavingTime (可读写) | 指定时区是否考虑夏令时。 默认值为 False。 | Boolean |
timezone.ID (可读写) | 存储日期值的时区。 字符串值必须与 Windows 操作系统识别的官方时区 ID 之一匹配。 有关时区的列表,请参阅 Microsoft 文档中的时区。 | String |
useLimitations (可读写) | 地图服务的使用限制。 | String |
方法概述
方法 | 说明 |
exportToSDDraft (out_sddraft) | 将 MapServiceDraft 转换为服务定义草稿 (.sddraft) 文件。 |
方法
代码示例
以下脚本将为地图服务创建地图服务定义草稿文件 (.sddraft),并设置元数据属性。 地图服务将发布到独立 ArcGIS Server 站点中的文件夹。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set metadata and server folder properties
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
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.serverFolder = "MyServerFolder"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本将覆盖地图服务。 如果服务名称已存在,则将覆盖该服务。 否则,将创建新服务。 如果希望地图服务具有特定的属性,则必须设置属性值,即使要覆盖的地图服务已配置了属性。 否则,现有属性将被默认设置覆盖。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set overwrite property
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
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)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本将为引用注册数据的地图服务创建服务定义草稿文件 (.sddraft)。 必须已在服务器上注册数据存储,才能引用数据。 然后启用要素功能并设置地图服务和要素服务属性。 然后,会将修改后的 .sddraft 文件过渡并发布到 ArcGIS Server。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set copyDataToServer property to false to reference registered data
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.copyDataToServer = False
sddraft.mapOperations = "Map,Data"
sddraft.extension.feature.isEnabled = True
sddraft.extension.feature.featureCapabilities = "Create,Sync,Query"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本通过调用管理地图服务器缓存切片工具以创建地图服务缓存切片,来发布缓存地图服务。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.enableCache = 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)
warnings = arcpy.GetMessages(1)
print(warnings)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
# Manage Map server Cache Tiles
# For cache, use multiple scales separated by semicolon (;)
# For example, "591657527.591555;295828763.795777"
arcpy.server.ManageMapServerCacheTiles(target_server_connection + os.sep + service_name + ".MapServer", "591657527.591555", "RECREATE_ALL_TILES")
except Exception as stage_exception:
print("Analyzer errors encountered - {}".format(str(stage_exception)))
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
以下脚本将为地图服务创建服务定义草稿文件 (.sddraft),并使用现有缓存绘制服务。 然后,会将修改后的 .sddraft 文件过渡并发布到 ArcGIS Server。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.enableCache = True
sddraft.cache.useExistingCache = 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)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本将为地图服务创建服务定义草稿文件 (.sddraft)。 在过渡期间,将对服务定义草稿文件进行分析。 如果返回分析器 24011,警告未将数据源注册到服务器,则将使用 AddDataStoreItem 函数注册数据存储。
import arcpy
import os
arcpy.env.overwriteOutput = True
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set copyDataToServer property to False to reference registered data
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
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.server.StageService(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(target_server_connection, "DATABASE", "datastore_name", db_conn)
print("Registered datastore: {0}".format(register_msg))
# Stage the service again
stage_service = True
else:
stage_service = False
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本将为地图服务创建服务定义草稿文件 (.sddraft)。 必须已在服务器上注册数据存储,才能引用数据。 它为带有日期字段的图层设置时区,并配置服务实例设置。 然后,会将修改后的 .sddraft 文件过渡并发布到 ArcGIS Server。
import arcpy
import os
import codecs
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set copyDataToServer property to False to reference registered data, set time zone, and configure pooling options
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
sddraft.copyDataToServer = False
sddraft.timezone.ID = "Pacific Standard Time"
sddraft.timezone.DaylightSavingTime = True
sddraft.extension.feature.isEnabled = True
sddraft.pooling.type = "DEDICATED"
sddraft.pooling.minInstances = 0
sddraft.pooling.maxInstances = 2
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, target_server_connection)
print("Finish Publishing")
以下脚本将为目标服务器版本创建离线服务定义,并将其发布为地图服务。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set offline and offlineTarget properties
# The targetServer property is not needed when the offline property is set to True
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.offline = True
# Set offlineTarget property to "ENTERPRISE_11" for ArcGIS Server 11.0 or later
# The default is ArcGIS Server 10.9.1 or earlier
sddraft.offlineTarget = "ENTERPRISE_10x"
# Create Service Definition Draft file
sddraft.exportToSDDraft(sddraft_output_filename)
# Stage Service
print("Start Staging")
arcpy.server.StageService(sddraft_output_filename, sd_output_filename)
# Publish to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(sd_output_filename, r"C:\Project\gisserver.ags.esri.com (publisher).ags")
print("Finish Publishing")
以下脚本将为地图服务创建用于启用 checkUniqueIDAssignment 属性的服务定义草案文件 (.sddraft)。 在过渡期间,将对服务定义草稿文件进行分析。 如果地图未设置为允许分配用于共享 web 图层的唯一数字 ID,则会返回分析器错误 00374 并打印一条消息。 有关详细信息,请参阅分配图层 ID。
import arcpy
import os
# Set output file names
outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
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 MapServiceDraft and set the check unique ID assignment property
target_server_connection = r"C:\Project\gisserver.ags.esri.com (publisher).ags"
sddraft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, m)
sddraft.targetServer = target_server_connection
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))