ArcGisPro 编程批量分析、发布和覆盖地图服务

ArcGISPro版本3.1.5。使用ArcGisPro发布地图服务很简单,一种方法是添加门户之后,在软件菜单栏依次点击共享→web地图→填写好信息后发布;另一种是在目录窗格添加服务器后,右键服务器→发布→选择服务→填写信息发布。
如果你使用编程手段去发布服务就会发现可以选择的服务有好多种,这一块的内容在官方文档属于共享模块的内容,网址点击。可以编写自动化将 GIS 资源共享到 ArcGIS Enterprise、ArcGIS Online 或 ArcGIS Server (不清楚区别)的脚本操作。

发布服务的基本流程
基本流程有:选择服务类似、创建共享草稿(Draft)、设置drate的各种参数(包括服务名、描述、摘要、标签、数据引用方式、配置池化等)、输出服务定义草稿(.sddraft)文件和服务定义(.sd)文件、服务分析与警告处理、发布服务。
1.选择服务类型
服务类型挺多的,主要有两点:(1)目标服务器的类型(独立服务器、门户);(2)发布服务的类型(地图服务、影像服务、工具等等)
使用PyCharm开发环境连接ArcGISPro独立服务器,会显示连接不上。需要将代码在ArcGISPro的python界面运行就不会有这个问题。通过门户门户发布则没有这个问题,具体流程不变。
2.根据为 Web 图层、Web 工具还是服务创建共享草稿(Draft)
简简单单创建Draft实际上也有坑,首先就是你的创建方式有两种,分类的标准是连接服务器的类型和连接方式:

  • ArcGIS Enterprise 或 ArcGIS Online 上:使用 Map 类中的 getWebLayerSharingDraft 函数

  • ArcGIS Enterprise 门户上的 Web 影像图层或 Web 工具,或独立 ArcGIS Server 站点上:使用 arcpy.sharing.CreateSharingDraft 函数
    我不是很清楚这两者的区别,但我知道自己的目前的工作是后者,所有使用arcpy.sharing.CreateSharingDraft 函数。
    CreateSharingDraft (server_type, service_type, service_name, draft_value)
    这个参数设置页挺模糊的,前两个参数有重叠,像影像服务和网络影像图层,我现在还不知道怎么区别。但是在踩坑的过程中,我确定了自己的任务为arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER", "MAP_SERVICE", service_name, map)
    2ee10e0c-6925-43c0-85d6-e3eda3cf2940

    这样我们就获取到了自己要发布的共享草稿draft,接下来是设置它的具体发布细节。
    3.draft参数设置
    在我选择后draft类型是MapServiceDraft,接下来的内容主要参照官网文档。它的属性和方法就太多了,这里不介绍,有需要请自行翻阅文档。讲道理这里的设置挺杂的。简单整理有几类:服务名、路径、描述、摘要、标签、数据引用方式、配置池化等。
    (1)服务名、中间文件名和路径

outdir = r"C:\Project\Output"
service_name = "MapServiceDraftExample"
sddraft_filename = service_name + ".sddraft"  # 服务定义草稿(.sddraft)文件,不知道具体做啥的
sddraft_output_filename = os.path.join(outdir, sddraft_filename)
sd_filename = service_name + ".sd"            # 服务定义(.sd)文件,不知道具体做啥的
sd_output_filename = os.path.join(outdir, sd_filename)

# 路径位置
sddraft.targetServer = target_server_connection  # 地图将发布至的服务器
sddraft.serverFolder = serverFolder  # 要将服务发布到的服务器文件夹名称。 默认文件夹是服务器的根文件夹。 如果不存在此文件夹,则会进行创建。

(2)描述、摘要、标签

sddraft.credits = "These are credits"
sddraft.description = "This is description"  # 描述
sddraft.summary = "This is summary"  # 摘要
sddraft.tags = "tag1, tag2"]  #标签

(3)目标服务器
这里着重说一下这个targetServer,他主要用来定位你要上传的服务器路径,可我用pycharm怎么也定位不到(在后边输出文件的时候显示连不上服务器),因为这一点我折腾了好久。最后我打开ArcGisPro的python编辑器(分析→python) 把代码复制到里边运行就好了,也是很奇怪。如果有人知道PyCharm上怎么设置,请千万告诉我,拜谢!!!!
sddraft.targetServer = target_server_connection
(4)数据引用方式、配置池化、覆盖或新发布

# 实例类型
sddraft.pooling.type = pooling_list[0]
sddraft.pooling.minInstances = pooling_list[1]
sddraft.pooling.maxInstances = pooling_list[2]

# 覆盖服务
sddraft.overwriteExistingService = is_overwrite  # 指定是否覆盖具有相同名称的现有服务。
# 数据引用或复制全部
sddraft.copyDataToServer = is_copyData  # 指定是否见地图中的数据复制到服务器。True复制全部;False仅复制未注册的数据

4.输出服务定义文件
我并不确定这俩文件写本地是做啥的,但是执行sddraft.exportToSDDraft时会报连不上服务器之类的错误,而且官方所有的示例都有这俩,我就照做了。

# 保存设置文件
sddraft.exportToSDDraft(baseInfo_dict["sddraft_output_filename"])  # 将 MapServiceDraft 转换为服务定义草稿 (.sddraft) 文件。
arcpy.server.StageService(baseInfo_dict["sddraft_output_filename"], baseInfo_dict["sd_output_filename"])  # StageService 函数基于服务定义草稿文件创建服务定义文件 (.sd)

5.服务分析与警告处理
最好自己拿模板测试过没有什么警告再发布,批处理的过程中处理警告应该挺困难的。关于这一部分官方的示例如下:

# 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

6.发布服务
我不知道这里两句的主要区别是啥,但是程序没保存,服务器上也确实有服务了,就先不细究。
官方示例如下:

# Stage and Publish Service
print("Start Staging")
arcpy.server.StageService(baseInfo_dict["sddraft_output_filename"],baseInfo_dict["sd_output_filename"] )
# to server
print("Start Uploading")
arcpy.server.UploadServiceDefinition(baseInfo_dict["sd_output_filename"], target_server_connection)
print("Finish Publishing")

吐槽:3.1.5版本发布地图服务时设置池化方式和共享方式的语句太复杂了,以后搞不定就升级版本。

posted @ 2025-08-13 16:42  MyEngine  阅读(27)  评论(0)    收藏  举报