通常我們使用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.發布msddef 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 "服務發布成功!"
調用代碼:
import syssys.path.append("E:\\Codes\\Python")from publishHelper import PublishAll # 必須要有正確的許可,否則匯入失敗PublishAll("D:\\TestData", "http://localhost/ArcGIS/rest/services", "sichuan")
如此即可通過Python指令碼去遍曆檔案夾,並發布其中的mxd文檔為地圖服務。稍作完善,還可作為windows服務自動運行,實現服務的隨到隨發。