向联合服务器发布服务,enterprise环境即server与portal进行联合托管。
在arcgis pro版arcpy中,将原来arcmap版arcpy的arcpy.mapping模块迁移至arcpy.mp。
1、使用arcpy.mp.arcgisproject()函数引用 ArcGIS pro工程 (.aprx) 。
2、根据需要是否要进行注册数据,若要注册可以使用AddDataStoreItem()将文件夹或数据库注册到 GIS Server 站点中,在注册之前也可以先使用ListDataStoreItems()函数,返回在 ArcGIS Server 站点中注册的文件夹或数据库列表以此来判断该文件夹或数据库是否已经存在。
3、再ArcGISProject 对象提供的listMaps ({wildcard})返回 aprx 工程中Map 对象的列表,通过加索引来控制,找到需要发布的图层。
4、创建MapImageSharingDraft 类对象,直接使用 getWebLayerSharingDraft函数,并将其service_type 参数设置为 MAP_IMAGE,server_type值设为“FEDERATED_SERVER”。在arcgis pro中发布动态地图服务类型为map Image。
5、之后通过设置服务级别属性来配置 MapImageSharingDraft类对象。其中federatedServerUrl属性用来指定将 web 图层发布到哪个联合服务器。
6、使用 exportToSDDraft()函数将其保存到服务定义草稿 (.sddraft) 文件。
7、使用过渡服务StageService和上传服务定义工具UploadServiceDefinition 将其过渡并共享到 ArcGIS Enterprise。
import os
import sys
import glob
import zipfile
import arcpy
arcpy.env.overwriteOutput = True # 重名文件直接覆盖
workspace = r"E:\*****\ABCD.gdb"
arcpy.env.workspace = workspace
service = "ABCDEFG" # 服务名称
aprx = arcpy.mp.ArcGISProject(r"E:\***\aaa.aprx"))
out_layer = "123456789"
try:
# Sign in to portal
arcpy.SignInToPortal('https://*******.com/portal', 'username', 'password')
# Set output file names
outdir = os.path.dirname(workspace)
# 服务定义草稿文件
sddraft_output_filename = os.path.join(outdir, service + ".sddraft")
# 服务定义文件
sd_output_filename = os.path.join(outdir, service + ".sd")
print (sddraft_output_filename)
# Reference map to publish
maps = aprx.listMaps()[0]
# 如果需要清理工程中的其他图层,可使用removeLayer()
for lyr in maps.listLayers():
maps.removeLayer(lyr)
# 要发布服务的图层添加到地图中
maps.addDataFromPath(os.path.join(workspace,out_layer))
# 保存地图工程
aprx.save()
lyrs = maps.listLayers()
print((aprx.listMaps()[0]).listLayers()[0].name)
# Create TileSharingDraft and set service properties
# 创建服务定义草稿
sharing_draft = maps.getWebLayerSharingDraft("FEDERATED_SERVER", "MAP_IMAGE", service,lyrs)
sharing_draft.overwriteExistingService = True
sharing_draft.federatedServerUrl = "https://***.com/server"
sharing_draft.summary = "AAA"
sharing_draft.tags = "AAA"
sharing_draft.description = "AAA"
sharing_draft.credits = "AAA"
sharing_draft.useLimitations = "Limitation"
print("description")
# Create Service Definition Draft file
sharing_draft.exportToSDDraft(sddraft_output_filename)
print("Service Definition")
# Stage Service 分析
try:
print("sd_output:",sd_output_filename)
arcpy.StageService_server(sddraft_output_filename, sd_output_filename)
warnings = arcpy.GetMessages(1)
print(warnings)
except Exception as stage_exception:
print("Sddraft not staged. Analyzer errors - {}".format(str(stage_exception)))
# Share to portal 上传服务定义
print("Uploading Service Definition")
conn = r"C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.7\ArcCatalog\server on ***.com (发布者).ags"
arcpy.UploadServiceDefinition_server(sd_output_filename, conn)
print("Successfully")
exit()
except:
print (arcpy.GetMessages()+ "\n\n")
sys.exit()
注册数据:
要将数据发布为服务,需要将原数据注册或者复制到服务器上,使服务器可直接访问到原数据。发布服务时的分析过程发现数据未注册会自动执行复制(warning消息中会显示),注册可将服务器本机的文件目录添加到服务器访问列表中,也可以将其他主机的文件夹共享给服务器主机,再将此共享文件夹注册(添加到服务器访问列表中),则可在非服务器主机上的数据通过ArcGIS Pro发布成服务(同时避免了数据复制)。