ArcGIS 发布服务的那些事儿——(1)动态服务

ArcGIS 现在的桌面产品有ArcMap 和ArcGIS Pro,它们都可以发布服务,但是有些许异同,从这篇文章开始,将开始记录ArcMap 和ArcGIS Pro在发布服务上的一些步骤与心得,将持续更新,欢迎关注。

从本文将开始记录相同服务在ArcMap端和ArcGIS Pro端发布的异同及不同方法,包括ArcTool Box和Python脚本方法

用到的软件:ArcMap10.6.1,Pro2.3.0,ArcGIS Server 10.6.1,ArcGIS Portal 10.6.1(如非特别说明,用到的ArcGIS软件均为上述版本)
1、普通的动态服务
1.1 ArcMap发布动态服务

用ArcMap发布动态服务是最简单的操作,如果是第一次发布服务的话,则需要创建一个连接,用于连接ArcGIS Server,如果在Portal中将Server设置为了托管服务器,则在上述的地址中需要填写Portal的地址和用户名密码,关于此处相关错误提示点我, 这里有常见错误及排查方法。
1.2 ArcGIS Pro 发布动态服务
与在ArcMap中类似,下图中采用了将ArcMap的mxd工程导入Pro的方式,这样的设计也是为了之前使用ArcMap的用户能够更好的过渡到ArcGIS Pro的使用

在这个图中我们看到share Tab中Web Layer是灰色的,此时需要检查一下Pro是否登录了Portal,如果没有登录Portal的话,则此处就是灰色的,当然了,对于使用Named user许可且没有将许可离线使用的小可爱不会遇到这样的问题,否则的话Pro都用不成的。

在Server和Portal中查看

2.1在ArcMap中创建服务定义发布
与1.1中步骤基本相同,话不多说,见下图

最后会生成一个后缀为sd的文件,而且在此处选择好的服务文件夹之类的位置是可以修改的,然后在Server中以管理员身份登录,上传服务定义即可
ArcGIS 发布服务的那些事儿——(1)动态服务_第1张图片
在我第一遍发布的时候不知道为什么失败了,报错001360和001362,隔了一会儿,我还是相同的步骤,就发布成功了,大概他需要一个反应的时间吧。
查了一下帮助文档,对上述两个错误的描述及解决方案为:
ArcGIS 发布服务的那些事儿——(1)动态服务_第2张图片
ArcGIS 发布服务的那些事儿——(1)动态服务_第3张图片
果然他是需要时间来消化一下的
3.1用Python脚本发服务(ArcMap版)
个人认为这个是重头戏,虽然在软件上点点点,发布动态服务是最简单的了,但是用python代码写,还是有些内容需要细细研究的,今天时间有限,先将代码贴出,改天有空好好絮叨絮叨

以下是独立脚本,关于脚本怎么设置,下次在说喽

# -*- coding: utf-8 -*-
#!/usr/bin/python

import arcpy
from arcpy import env
server_username='myportal'
server_password='myportal1'
# arcpy.SignInToPortal_server(server_username,server_password,"")#需要了解一下这步的真正作用
#此处第三个参数不填写的原因
#“登录门户”工具读取 Desktop 管理器中设置的 URL。忽略任何用户输入的值。
#默认值为用户当前在 Desktop 管理器中选择的 ArcGIS 门户的 URL。
#参见链接:http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/server-toolbox/sign-in-to-portal.htm
env.workspace="E:/05email/zzshare"
wrkspc="E:/05email/zzshare/"
#创建server连接#
connection_type='ADMINISTER_GIS_SERVICES'
out_folder_path="E:/05email/zzshare"
out_name='ajServer.ags'
server_url='http://aj.enterprise.cn/arcgis/admin'
use_arcgis_desktop_staging_folder=False
staging_folder_path=out_folder_path
arcpy.mapping.CreateGISServerConnectionFile(connection_type,out_folder_path,out_name,server_url,
                                            'ARCGIS_SERVER',use_arcgis_desktop_staging_folder,
                                            staging_folder_path,server_username,server_password,
                                            "SAVE_USERNAME")
#将mxd文档变为服务定义草稿(.sddraft)文件,服务定义草稿文件会在服务定义文件(sd)后自动删除
mapDoc=arcpy.mapping.MapDocument(wrkspc+'Beijingshi.mxd')
service_name='BeijingSd'
sddraft=wrkspc+service_name+'.sddraft'
sd=wrkspc+service_name+'.sd'
summary='blog use sd'
tags='beijing,map,dynamic'
con=wrkspc+out_name
analysis=arcpy.mapping.CreateMapSDDraft(mapDoc,sddraft,service_name,'ARCGIS_SERVER',
                                        con,True,'blog',summary,tags)
if analysis['errors']=={}:
    arcpy.StageService_server(sddraft, sd)
    arcpy.UploadServiceDefinition_server(sd, con)
    # arcpy.SignOutFromPortal_server()
else:
    print analysis['errors']

发布成功python中发布成功的提示
ArcGIS 发布服务的那些事儿——(1)动态服务_第4张图片
3.2用Python脚本发服务(ArcGIS Pro版)
关于ArcGIS Pro的介绍我就不多说了,只需要知道一点,在ArcMap中,用的是Python2系列,而在ArcGIS Pro中,用的是Python3系列,而熟悉Python的朋友们应该都知道,Python 2系列和3系列直接的差异还是有很多的,因此在写脚本的时候需要注意到这点,当然,在ArcMap和Pro中也有内置的工具,可以将不同版本的python代码进行转换,工具位置在
ArcMap的Python27安装路径中:Tools\Scripts
ArcGIS Pro的安装路径中:envs\arcgispro-py3\Tools\scripts
不过小编我水平有限,暂时还没有用过这个东东,待我研究之后贴出来如何使用
接下来的代码是用于Pro发布动态服务滴
从2.3.0开始,ArcGIS Pro支持用Python脚本将服务发布到独立(stand-alone)Server,参见官方介绍,这部分的最后一行

何为独立Server呢?就是没有进行托管联合的Server,但是在我测试的过程中我发现,这个服务器也可以当做是一个跳板,用于生成服务定义草稿文件(.sddraft),生成好了之后,依旧可以将服务发布到托管的server中,发布过程详见代码

# -*- coding: utf-8 -*-
import arcpy
import os

outdir=r"E:\05email\zzshare\pro"
service="MapServiceDraftPro"
sddraft_filename=service+'.sddraft'
sddraft_output_filename=os.path.join(outdir,sddraft_filename)
print(sddraft_output_filename)
aprx=arcpy.mp.ArcGISProject(r"E:\05email\zzshare\zzshare.aprx")
m=aprx.listMaps("Map")[0]
service_draft=arcpy.sharing.CreateSharingDraft("STANDALONE_SERVER",
                                               "MAP_SERVICE",service,m)
service_draft.targetServer=r"E:\05email\zzshare\192.168.100.86standaloneServer.ags"
#192.168.100.86standaloneServer.ags这个文件就是我用来做“跳板”的独立server
service_draft.exportToSDDraft(sddraft_output_filename)
print("export success")
sd_filename=service+".sd"
sd_output_filename=os.path.join(outdir,sd_filename)
arcpy.StageService_server(sddraft_output_filename,sd_output_filename)
print("Uploading Service Definition...")
arcpy.UploadServiceDefinition_server(sd_output_filename, "https://aj.enterprise.cn/arcgis/")
#aj.enterprise.cn这个地址中的server是我的托管server
print("Successfully Uploaded service.")

发布成功
ArcGIS 发布服务的那些事儿——(1)动态服务_第5张图片
其中要特别注意的是这个UploadServiceDefinition_server的设置,如果只是普通的发布服务,那么可以不登录到ArcGIS Online或ArcGIS Enterprise中,但是如果是要设置共享、覆盖在服务定义中设置的共享属性,就必须登录到ArcGIS Online或ArcGIS Enterprise。参见官方说明

4.1用ArcTool Box发布服务(ArcMap版)
4.1.1生成服务定义草稿文件


关键之处在于,将所有错误解决之后,关闭服务编辑器,即可将服务草稿文件存放在硬盘中
4.1.2过渡服务
使用工具:Server Tools>Publishing>Stage Service
作用:将服务草稿文件转换为服务定义文件

4.1.3上传服务定义
使用工具:Server Tools>Publishing>Upload Service Definition
作用:将服务定义文件上传至Server

4.2用ArcTool Box发布服务(ArcGIS Pro版)
4.2.1生成服务定义草稿文件

在ArcGIS Pro中没有办法直接生成服务定义草稿文件,需要借助ArcPy3.x的arcpy.sharing模块,点我具体代码详见上方第二个代码块中arcpy.sharing部分。
4.2.2过渡服务
使用工具:Server Tools>Publishing>Stage Service
作用:将服务草稿文件转换为服务定义文件

4.2.3上传服务定义
使用工具:Server Tools>Publishing>Upload Service Definition
作用:将服务定义文件上传至Server

在ArcMap中使用Upload Service Definition工具时,如果选择ArcGIS Pro生成的服务定义草稿文件,会报如下警告,但是也会发布成功
ArcGIS 发布服务的那些事儿——(1)动态服务_第6张图片
但是在ArcGIS Pro中使用Upload Service Definition工具时,选择ArcMap生成的服务定义草稿文件,则不会有任何报错或者是警告

----------------------------------------------------------分-------------------------割-----------------------------线-----------------------------------------------------

问:使用Python脚本发布服务,还是有些坑需要注意,两个版本的Python发布服务,有何异同?
先说相同点:
发布思路相同:做好的工程文件(.mxd)或者是(.aprx)>生成服务定义草稿文件>生成服务定义文件>上传至Server
不同点:
1、使用ArcMap的ArcPy时(以下简称ArcPy2.x),服务定义草稿文件会在服务定义文件生成后自动删除,而使用ArcGIS Pro的ArcPy(以下简称ArcPy3.x)却不会
2、要使用ags连接文件,直接使用ArcPy3.x没有现成的接口直接生成(2.3.2版本及之前),需要借助ArcGIS Pro或者是ArcPy2.x,方法如下:
**ArcPy2.x:**使用arcpy.mapping.CreateGISServerConnectionFile,详见上方第一个代码块
ArcGIS Pro: ArcGIS 发布服务的那些事儿——(1)动态服务_第7张图片

你可能感兴趣的:(ArcGIS 发布服务的那些事儿——(1)动态服务)