首先来看解决方案的技术流程图:
首先,我们先在D盘下建一个“MxdPublisher”的目录,然后创建一个python脚本文件:“MxdPublish.py”,里面代码如下:
#-*-coding:utf-8 __author__ = 'suwen' import os import arcpy import xml.dom.minidom as DOM def CreateContectionFile(wrkspc,userName,password,serverName): con="http://"+str(serverName)+":6080/arcgis/admin" connection_file_path=str(wrkspc)+"/tmp.ags" # if os.path.exists(connection_file_path): os.remove(connection_file_path) agsname=os.path.basename(connection_file_path) arcpy.mapping.CreateGISServerConnectionFile("ADMINISTER_GIS_SERVICES", wrkspc, agsname, con, "ARCGIS_SERVER", username=userName, password=password, save_username_password=True) return connection_file_path def PublishService(connection_file_path,wrkspc,mapDoc): #get the serviceName serviceName =os.path.basename(mapDoc).replace(".mxd","") #create the .sddraft path sddraftname=os.path.basename(mapDoc).replace(".mxd",".sddraft") sddraft =str(wrkspc)+"/"+str(sddraftname) #create the .sd file path sdname=os.path.basename(mapDoc).replace(".mxd",".sd") sd=str(wrkspc)+"/"+str(sdname) #check the file exists or not if(os.path.exists(sd)): os.remove(sd) analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, serviceName, 'ARCGIS_SERVER', connection_file_path, True, 'ProjectData',None,None) #启用WMS doc = DOM.parse(sddraft) typeNames = doc.getElementsByTagName('TypeName') for typeName in typeNames: if typeName.firstChild.data == 'WMSServer': extention = typeName.parentNode for extElement in extention.childNodes: if extElement.tagName == 'Enabled': extElement.firstChild.data = 'true' f = open(sddraft,'w') doc.writexml(f, encoding='utf-8') f.close() arcpy.StageService_server(sddraft, sd) arcpy.UploadServiceDefinition_server(sd, connection_file_path) connection_file_path="D:\MxdPublisher" mxdfolder=u"D:\MxdPublisher" wrkspc=r"D:\MxdPublisher" serverName="192.168.173.100" userName="lixw" password="info12345" connection_file_path=CreateContectionFile(wrkspc,userName,password,serverName) # the mxd file list of the mxdPath mxds=os.listdir(mxdfolder) mxd_files=[] for file in mxds: if file.endswith(".mxd"): mxdpath=os.path.join(mxdfolder,file) mxd_files.append(mxdpath) for mxd in mxd_files: PublishService(connection_file_path,wrkspc,mxd)
注意,代码里下面的几个变量根据实际情况进行修改:
connection_file_path="D:\MxdPublisher" mxdfolder=u"D:\MxdPublisher" wrkspc=r"D:\MxdPublisher" serverName="192.168.173.100" userName="lixw" password="info12345"
接下来,可以往“D:\MxdPublisher”目录下手动拷贝一个mxd及其相关文件进去(注意,mxd须保存为相对路径),然后执行“MxdPublish.py”脚本即可进行测试(机器需安装ArcGIS Desktop 10.x环境),脚本执行过程可能有点慢,请耐心等待,执行完后可能会报错,这个不用管,登录arcgis server 10.x可查看发布是否成功。
如果上面手动测试OK,后面就是在C#里调用“MxdPublish.py”脚本进行动态发布了,backgroundWorker1_DoWork里的代码如下:
string mxdPath = e.Argument as string; //创建临时文件夹 string tempDir = @"D:\MxdPublisher"; if (Directory.Exists(tempDir) == false) { Directory.CreateDirectory(tempDir); } else { this.ClearMxdPublishTempDir(tempDir); } //拷贝mxd及其所在文件夹下所有文件及其子文件夹到临时文件夹 string mapServerName = this.CopyMxdDocument2TempDir(mxdPath, tempDir); //执行脚本 string pyPath = Path.Combine(Application.StartupPath, "MxdPublish.py"); try { ProcessStartInfo info = new ProcessStartInfo(pyPath); info.WindowStyle = ProcessWindowStyle.Hidden; Process pro = new Process(); pro.StartInfo = info; pro.Start(); while (!pro.HasExited) { System.Threading.Thread.Sleep(500); Application.DoEvents(); } string wmsUrl = string.Format("http://192.168.173.100:6080/arcgis/services/ProjectData/{0}/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities", mapServerName); e.Result = wmsUrl; } catch (Exception ex) { e.Result = null; MessageBox.Show(ex.Message); }