工作需要研发一个大平台,需要有发布地图服务的功能。
之前做过一个平台,使用 GeoServer 发布地图服务,后台使用 Java+SpringBoot,前端使用 Vue+OpenLayers,平台整体比较稳定,但是图层符号化配色那块比较难搞。
后面担心其他的单位都用的是 ArcGIS 那一套。所以准备研发一套基于ArcGIS 的平台。初步决定使用 Arcpy 调用 ArcGIS Server 发布地图服务,将 Arcpy 做成能发布地图服务的插件,后台还是使用 Java+SpringBoot,前端可能使用 Vue+OpenLayers/esri-leaflet,准备边做边写多几篇文章。目前写第一篇 Arcpy 发布地图服务。
一、发布的流程
(1)第一步,调用arcpy.mapping中的CreateMapSDDraft()函数,将地图文档文件(.mxd)转换为服务定义草稿文件(.sddraft),该文件由一个地图文档、服务器信息和一组服务属性组合而成。
(2)第二步,调用StageService Tool(.sd,过渡服务工具),arcpy.StageService_server方法,编译能成功发布 GIS 资源所需的所有必要信息。
(3)第三步,使用Upload Service Definition Tool(上载服务定义处理工具)上传服务定义文件,并将其作为GIS服务发布到指定的GIS服务器。此步骤将获取服务定义文件、将其复制到服务器、提取所需信息并发布 GIS 资源。
二、代码
# -*- coding:UTF-8 -*-
import arcpy
from arcpy import env
server_username='arcgis'
server_password='123456'
env.workspace="D:/data/Test"
wrkspc="D:/data/Test"
#创建serve连接
connection_type='ADMINISTER_GIS_SERVICES'
out_folder_path="D:/data/Test/"
out_name='DLHX.ags'
server_url='http://localhost:6080/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")
mxdname = wrkspc+'/DLHX.mxd'
mapDoc=arcpy.mapping.MapDocument(wrkspc+'/DLHX.mxd')
service_name='DLHX0313'
sddraft=wrkspc+'/'+service_name+'.sddraft'
sd=wrkspc+'/'+service_name+'.sd'
summary='Tese use sd'
tags='DLHX,LZ,MAP'
con=wrkspc+'/'+out_name
analysis=arcpy.mapping.CreateMapSDDraft(mapDoc,sddraft,service_name,'ARCGIS_SERVER',con,True,'Test',summary,tags)
if analysis['errors']=={}:
arcpy.StageService_server(sddraft, sd)
arcpy.UploadServiceDefinition_server(sd, con)
else:
print analysis['errors']
两个重要方法说明:
1、创建草图文件方法CreateMapSDDraft (map_document, out_sddraft, service_name, {server_type}, {connection_file_path}, {copy_data_to_server}, {folder_name}, {summary}, {tags})
参数 | 说明 | 类型 |
map_document | Map Document 类型的对象,即一个mxd文档。 | mxd类型 |
out_sddraft | Service Definition Draft (.sddraft) 文件输出路径。 | string |
service_name | 服务的名字,由字母和数字组成,不允许使用空格或特殊字符,长度不得超过120。 | string |
server_type | 服务的类型,如果未提供「connection_file_path」参数,则必须提供「server_type」。如果提供了「connection_file_path」参数,则从连接文件中获取「 server_type」。 • ARCGIS_SERVER — ArcGIS for Server 服务类型,默认值。 • FROM_CONNECTION_FILE — 从 connection_file_path 参数获取服务类型。 • SPATIAL_DATA_SERVER — Spatial Data Server 服务类型,ArcGIS 10.2.1 版本之后就不再支持。 • MY_HOSTED_SERVICES — My Hosted Services 服务类型,应用与 ArcGIS Online 或者 Portal for ArcGIS 的托管服务。 | string |
connection_file_path | ArcGIS for Server connection file (.ags) 文件的路径。通常在ArcCatalog创建后的路径为「C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.2\ArcCatalog」 | string |
copy_data_to_server | mxd文档的数据是否要拷贝到服务器中。当数据没有在服务器内被注册时,此参数应设为false,反之应设为true。 当「server_type」设置为SPATIAL_DATA_SERVER时,「copy_data_to_server」将始终为False。 Spatial Data Server 服务始终使用已注册的数据,因此不会将数据复制到服务器。 当「server_type」设置为MY_HOSTED_SERVICES时,「copy_data_to_server」将始终为True。My Hosted Maps services 服务始终将数据复制到服务器。 | Boolean |
folder_name | 服务发布的文件夹名,如果不存在则会新建,默认值None对应的是根文件夹。 | String |
summary | 服务的摘要。 | String |
tags | 服务的标签。 | String |
2、GIS服务器连接:
arcpy.mapping.CreateGISServerConnectionFile(connection_type, out_folder_path, out_name, server_url, 'ARCGIS_SERVER', use_arcgis_desktop_staging_folder, staging_folder_path, username, password, True)
3、编译能成功发布GIS资源所需的所以必要信息:
arcpy.StageService_server(sddraft, sd)
4、上传服务定义文件,并将其作为GIS服务发布到指定的GIS服务器:
arcpy.UploadServiceDefinition_server(sd, con)
三、遇到的问题
1、编码问题:
解决办法:在代码前面加上:
# -*- coding:UTF-8 -*-
2、路径问题
之前运行时显示找不到 mxd 文件的路径,后天单步调试发现是因为路径中少了“/”。
3、PyCharm调试时,因为我之前电脑用的是 python3.6,需要换到 ArcGIS 安装时安装的 python2.7。但是不知道为啥一直换不去,试了好几遍才成功。
四、运行结果
五、参考博客
https://www.cnblogs.com/lLazy/p/10663157.html