MapServiceDraft

描述

MapServiceDraft 类用于配置地图服务属性并创建服务定义草稿 (.sddraft) 文件,可将该文件共享至 ArcGIS Server

讨论

要创建 MapServiceDraft 对象,请使用 arcpy.sharing.CreateSharingDraft 函数并将 server_type 参数设置为 STANDALONE_SERVER 以及将 service_type 参数设置为 MAP_SERVICE。然后,可通过设置服务级别属性配置 MapServiceDraft 对象。使用 targetServer 属性指定将地图服务发布到的服务器。在配置 MapServiceDraft 对象后,可使用 exportToSDDraft 函数将其保存到服务定义草稿 (.sddraft) 文件。然后,可使用过渡服务上传服务定义工具将其过渡并共享到 ArcGIS Server。有关详细信息,请参阅 arcpy.sharing 简介

.sddraft 文件过渡并上传到服务器后,可使用缓存工具集中的工具(如管理地图服务器缓存切片工具)创建和管理地图服务缓存以加快地图服务显示。也可以使用 XML 库(如 xml.dom.minidom 库)编辑 .sddraft 文件来修改切片方案。暗示,由于切片方案 XML 结构比较复杂,建议尽量使用缓存工具集

属性

属性说明数据类型
copyDataToServer
(可读写)

指定是否将地图中的数据复制到服务器。值为 True 时,将复制地图中的所有数据,包括在服务器中注册的数据。值为 False 时,将仅复制未在服务器中注册的数据;服务将参考已在服务器中注册的数据。

Boolean
credits
(可读写)

地图服务草稿的配额。

String
description
(可读写)

地图服务草稿的描述。

String
offline
(可读写)

指定是否使用服务器连接。如果设置为 False,则必须向 targetServer 属性提供服务器 URL 或 ArcGIS Server 连接文件 (.ags),才能使用 exportToSDDraft 函数创建服务定义草稿 (.sddraft) 文件。如果设置为 True,则可以在未填充 targetServer 属性的情况下,创建服务定义草稿文件。

Boolean
overwriteExistingService
(可读写)

指定是否覆盖具有相同名称的现有服务。

Boolean
serverFolder
(可读写)

要将服务发布到的服务器文件夹名称。默认文件夹是服务器的根文件夹。如果不存在此文件夹,则会进行创建。

String
serverType
(只读)

通过 CreateSharingDraft 函数创建 MapServiceDraft 时指定的服务器类型。从 serverTypeMapServiceDraft 中返回的唯一可能的值为 STANDALONE_SERVERSTANDALONE_SERVERserverType 表示支持为 ArcGIS Server 创建地图服务。

String
serviceName
(可读写)

地图服务的名称。用户可以看到该名称并使用该名称来识别服务。名称只能包含字母数字字符和下划线。不允许使用空格或特殊字符。名称长度不能超过 120 个字符。

String
summary
(可读写)

地图服务草稿的摘要。

String
tags
(可读写)

地图服务草稿的标签。标签可以逗号或分号分隔。

String
targetServer
(可读写)

地图将发布至的服务器。可以使用以下任一格式指定此服务器:

  • ArcGIS Server 连接文件 (.ags) 的完整路径。
  • ArcGIS Server URL。如果您在 ArcGIS Pro 工程中拥有 ArcGIS Server发布者或管理员连接,且您要在脚本中打开此工程或在 ArcGIS Pro 中运行脚本,请使用此选项。

有关详细信息,请参阅连接到 GIS 服务器

提示:

targetServer 也可以在上传服务定义工具中的 in_server 参数中使用。以下代码示例对此进行了演示。

String
useLimitations
(可读写)

地图服务草稿的使用限制。

String

方法概述

方法说明
exportToSDDraft (out_sddraft)

MapServiceDraft 转换为服务定义草稿 (.sddraft) 文件。

方法

exportToSDDraft (out_sddraft)
参数说明数据类型
out_sddraft

输出服务定义草稿 (.sddraft) 文件的路径和文件名。

String

在配置 MapServiceDraft 后,即可将其作为服务定义草稿 (.sddraft) 文件进行保存。然后可以使用过渡服务上传服务定义工具将其过渡并共享到 ArcGIS Server

代码示例

MapServiceDraft 示例

以下脚本用于将 ArcGIS Pro 工程中的地图作为地图服务发布到 ArcGIS Server

import arcpy
import os

# Set output file names
outdir = r"C:\Project\Output"
service = "MapServiceDraftExample"
sddraft_filename = service + ".sddraft"
sddraft_output_filename = os.path.join(outdir, sddraft_filename)

# Reference map to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps("World")[0]

# Create MapServiceDraft and set service properties
service_draft = arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service, m)
service_draft.targetServer = r"C:\Project\gisserver.ags.esri.com (publisher).ags"

# Create Service Definition Draft file
service_draft.exportToSDDraft(sddraft_output_filename)

# Stage Service
sd_filename = service + ".sd"
sd_output_filename = os.path.join(outdir, sd_filename)
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)

# Publish to server
print("Uploading Service Definition...")
arcpy.UploadServiceDefinition_server(sd_output_filename, "https://gisserver.esri.com:6443/arcgis/")

print("Successfully Uploaded service.")
修改 SDDraft 示例

以下脚本用于为地图创建地图服务定义草稿 (.sddraft) 文件。然后该脚本可通过使用 xml.dom.minidom 标准 Python 库,修改服务定义草稿文件,从而在地图服务上启用要素访问。然后,修改后的服务定义文件会发布到 ArcGIS Server。最后,此脚本调用管理地图服务器缓存切片工具创建地图服务缓存切片。

import arcpy, os, sys
import xml.dom.minidom as DOM

arcpy.env.overwriteOutput = True

# Update these variables
serviceName = "ModifySDDraftExample"
tempPath = r"C:\Project\Output"
path2APRX = r"C:\Project\World.aprx"
# Make sure this server url is added as publisher ags connection to the project
# Else use the ags connection file itself
targetServer = "https://gisserver.esri.com:6443/arcgis/"

# All paths are built by joining names to the tempPath
SDdraftPath = os.path.join(tempPath, "tempdraft.sddraft")
newSDdraftPath = os.path.join(tempPath, "updatedDraft.sddraft")
SDPath = os.path.join(tempPath, serviceName + ".sd")

aprx = arcpy.mp.ArcGISProject(path2APRX)
m = aprx.listMaps('World')[0]

# Create MapServiceDraft and set service properties
sddraft = arcpy.sharing.CreateSharingDraft('STANDALONE_SERVER', 'MAP_SERVICE', serviceName, m)
sddraft.targetServer = targetServer
sddraft.copyDataToServer = False
sddraft.exportToSDDraft(SDdraftPath)

# Read the contents of the original SDDraft into an xml parser
doc = DOM.parse(SDdraftPath)

# The following code modifies the SDDraft from a new MapService with caching capabilities
# to a FeatureService with Map, Create and Query capabilities.
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    if typeName.firstChild.data == "FeatureServer":
        extention = typeName.parentNode
        for extElement in extention.childNodes:
            if extElement.tagName == 'Enabled':
                extElement.firstChild.data = 'true'

# 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 = "Map,Query,Data"
                
# Modify keep cache, false by default
configProps = doc.getElementsByTagName('KeepExistingMapCache')[0]
configProps.firstChild.data = "true"
                
# Write the new draft to disk
f = open(newSDdraftPath, 'w')
doc.writexml(f)
f.close()

try:
    # Stage the service
    arcpy.StageService_server(newSDdraftPath, SDPath)
    warnings = arcpy.GetMessages(1)
    print(warnings)
    print("Staged service")

    # Upload the service
    arcpy.UploadServiceDefinition_server(SDPath, server_con)
    print("Uploaded service")

    # Manage Map server Cache Tiles
    # For cache, use multiple scales seperated by semicolon (;) 
    # For example "591657527.591555;295828763.795777" 
    arcpy.server.ManageMapServerCacheTiles(targetServer + os.sep + serviceName + ".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))