通常我们使用ArcCatalog或者ArcGIS Server Manager等图形界面工具来发布ArcGIS服务,然而有些情况下,比如需要发布的服务数量很多,而且需要不定期随时发布的时候,再使用这些工具进行人工操作就显得力不从心了。ArcGIS的强大之处就在于其为我们提供了多种选择,我们可以通过Python编写脚本,调用ArcPy模块中的功能来实现自动扫描文件夹并将其中的地图文档发布为地图服务。
本文将创建一个publishHelper.py文件,在其中编写两个方法,一个是PublishAll,用来遍历文件夹并调用另一个方法PublishMxd,后者完成具体的服务发布工作。
在服务发布之前,需要首先检查mxd文档路径,读取mxd文档,转为msd,分析文档等,最后才是发布服务。
# -*- coding: utf-8 -*-
import arcpy, os
__name__ = 'publishHelper'
# 将指定目录下所有的.mxd文档发布为地图服务
# folder:包含mxd文档的文件夹路径
# serviceDir:服务目录URL,例如http://localhost/arcgis/rest/services
# serviceFolder:服务所在文件夹,如果为空,则表示根目录
def PublishAll(folder,serviceDir,serviceFolder):
print "检查文件夹路径……"
if os.path.isdir(folder) == False:
print "输入的文件夹路径无效!"
return
print "遍历文件夹……"
files = os.listdir(folder)
for f in files:
if f.endswith(".mxd"):
mxdPath = os.path.join(folder, f)
print "publishing: " + f
PublishMxd(mxdPath, serviceDir, serviceFolder)
else:
continue
#将mxd文档发布为服务:1.将mxd转为msd;2.分析msd;3.发布msd
def PublishMxd(mxdPath, serviceDir, serviceFolder):
#检查mxd和msd文件是否存在
print "检查文件路径……"
if os.path.exists(mxdPath) == False:
print "指定路径的mxd文档不存在!"
return
# 打开mxd文档
try:
print "正在打开mxd文档……"
mxd = arcpy.mapping.MapDocument(mxdPath)
except Exception, e:
print "open mxd error: ", e
return
else:
print "mxd文档打开成功……"
# 获取默认的数据框
print "正在读取mxd文档默认数据框……"
df = ""
try:
frames = arcpy.mapping.ListDataFrames(mxd, "图层")
if len(frames) == 0:
frames = arcpy.mapping.ListDataFrames(mxd, "Layers")
df = frames[0]
except Exception, e:
print "读取mxd文档默认数据框失败:", e
return
# 构造msd文档名称
msdPath = mxdPath.replace(".mxd", ".msd")
# 将mxd转为msd
print "正在将mxd文档转换为msd文档……"
arcpy.mapping.ConvertToMSD(mxd, msdPath, df, "NORMAL", "NORMAL")
# 分析msd
print "正在分析文档……"
analysis = arcpy.mapping.AnalyzeForMSD(mxd)
# 列出分析结果信息
for key in ('messages', 'warnings', 'errors'):
print "----" + key.upper() + "---"
vars = analysis[key]
for ((message, code), layerlist) in vars.iteritems():
print " ", message, " (CODE %i)" % code
print " applies to:",
for layer in layerlist:
print layer.name,
print
#获取服务器信息
serviceName = os.path.basename(msdPath).replace(".msd", "")
serverName = serviceDir.split("/")[2]
try:
#发布msd
print "正在发布服务……"
arcpy.mapping.PublishMSDToServer (msdPath, serviceDir, serverName, serviceName, serviceFolder, ["WMS", "KML"])
except Exception, e:
print "发布服务失败:", e
else:
print "服务发布成功!"
调用代码:
sys.path.append("E:\\Codes\\Python")
from publishHelper import PublishAll # 必须要有正确的许可,否则导入失败
PublishAll("D:\\TestData", "http://localhost/ArcGIS/rest/services", "sichuan")
如此即可通过Python脚本去遍历文件夹,并发布其中的mxd文档为地图服务。稍作完善,还可作为windows服务自动运行,实现服务的随到随发。