实现ArcGIS Server 10.x自动发布地图的解决方案

原创
2015/09/20 13:16
阅读数 1K

        首先来看解决方案的技术流程图:

        首先,我们先在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);
            }


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部