首页
登录 | 注册

ArcGIS中python实现地图服务的自动发布

https://blog.csdn.net/liyan_gis/article/details/50394716

项目的具体需求是,每天下载几张tiff图片,放在mxd文件里,然后将其发布到ArcGISServer,后来 参照网上有一篇文章,可以自动发布地图服务,但是,后来发现,现在使用的ArcGIS版本10.2.2已经放弃了原来的方式发布服务,根据ArcMap里的帮助文档,发现里面的例子还是挺多的,自己又修改了实现的代码,遇到的问题是,

[python] view plain copy
  1. con = 'C:/Users/IBM_ADMIN/AppData/Roaming/ESRI/Desktop10.2/ArcCatalog/arcgis on localhost_6080 (publisher).ags'  
这个参数是ags文件的地址,默认这个文件是存在c盘的隐藏文件夹里,这个文件,是ArcCatolog里创建ArcGISServer连接的时候创建的。

实现方式是创建一个模板的mxd文件,每次,修改其数据源,这样图层的渲染方式不会改变,曾经想着将模板文件里的图层删掉,再添加新的图层,但,发现默认添加的tiff图层的渲染方式竟然不是ArcMap里自动添加tiff图层的渲染方式(rgb),添加出来的图层是灰色图,python的symbol控制又比较弱,所以,改成修改数据源的方式,实现了最终的效果

下载tiff文件的代码downLoadTiff.py:

[python] view plain copy
  1. import urllib   
  2. import urllib2  
  3. import os,time  
  4. ftime=time.strftime("%Y_%m_%d", time.localtime())#2015_12_01 tiffFonderName  
  5. ftime1=time.strftime("%Y-%m-%d", time.localtime())#2015-12-01 tiffNametime  
  6. ftime='2015_12_07'  
  7. ftime1='2015-12-07'  
  8. tiffFolder='..\\..\\'+ftime  
  9. tiffNameStart='nasa-worldview-'  
  10. os.mkdir(tiffFolder)  
  11. url = 'http://9.186.62.26/weather/satellite/'#nasa-worldview-2015-11-30.tiff'    
  12. print "downloading start from http://9.186.62.26/weather/satellite/"  
  13. tiffName=tiffNameStart+ftime1+'-2.tiff'  
  14. urllib.urlretrieve(url+tiffName, tiffFolder+'\\'+tiffName)  
  15. print "downloading with urllib from "+url+tiffName  
  16. tiffName=tiffNameStart+ftime1+'-3.tiff'  
  17. urllib.urlretrieve(url+tiffName, tiffFolder+'\\'+tiffName)  
  18. print "downloading with urllib from "+url+tiffName  
  19. tiffName=tiffNameStart+ftime1+'-4.tiff'  
  20. urllib.urlretrieve(url+tiffName, tiffFolder+'\\'+tiffName)  
  21. print "downloading with urllib from "+url+tiffName  
  22. tiffName=tiffNameStart+ftime1+'.tiff'  
  23. urllib.urlretrieve(url+tiffName, tiffFolder+'\\'+tiffName)  
  24. print "downloading with urllib from "+url+tiffName  

构造mxd文件,并发布服务的代码publishHelper.py:

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2. import arcpy, os,time  
  3.   
  4. __name__ = 'publishHelper'  
  5.   
  6. # 将指定目录下所有的.mxd文档发布为地图服务  
  7. # folder:包含mxd文档的文件夹路径  
  8. # serviceDir:服务目录URL,例如http://localhost/arcgis/rest/services  
  9. # serviceFolder:服务所在文件夹,如果为空,则表示根目录  
  10. def PublishAll(folder,serviceDir,serviceFolder):  
  11.     print "检查文件夹路径……"  
  12.     if os.path.isdir(folder) == False:  
  13.         print "输入的文件夹路径无效!"  
  14.         return  
  15.     print "遍历文件夹……"  
  16.     files = os.listdir(folder)  
  17.     for f in files:  
  18.         if f.endswith(".mxd"):  
  19.             mxdPath = os.path.join(folder, f)  
  20.             print "publishing: " + f  
  21.             PublishMxd(f,mxdPath, serviceDir, serviceFolder)  
  22.         else:  
  23.             continue  
  24. #将mxd文档发布为服务:1.将mxd转为msd;2.分析msd;3.发布msd  
  25. def PublishMxd(mxdName,mxdPath, serviceDir, serviceFolder):  
  26.     #检查mxd文件是否存在  
  27.     print "检查文件路径……"  
  28.     if os.path.exists(mxdPath) == False:  
  29.         print "指定路径的mxd文档不存在!"  
  30.         return  
  31.       
  32.     # 打开mxd文档  
  33.     try:  
  34.         print "正在打开mxd文档……"  
  35.         mxd = arcpy.mapping.MapDocument(mxdPath)  
  36.     except Exception, e:  
  37.         print "open mxd error: ", e  
  38.         return  
  39.     else:  
  40.         print "mxd文档打开成功……"  
  41.   
  42.     # 获取默认的数据框  
  43.    
  44.   
  45.     # 构造sddraft文档名称     
  46.     sddraft = mxdPath.replace(".mxd"".sddraft")  
  47.     service=mxdName.replace(".mxd", "")  
  48.     sd=mxdPath.replace(".mxd"".sd")  
  49.     con = 'C:/Users/IBM_ADMIN/AppData/Roaming/ESRI/Desktop10.2/ArcCatalog/arcgis on localhost_6080 (publisher).ags'  
  50.     copy_data_to_server=True  
  51.     #正在将mxd文档转换为sddraft文档……"  
  52.     # Create service definition draft  
  53.     arcpy.mapping.CreateMapSDDraft(mxd, sddraft, service,'ARCGIS_SERVER',con,copy_data_to_server, serviceFolder)  
  54.     # Analyze the service definition draft  
  55.     analysis = arcpy.mapping.AnalyzeForSD(sddraft)  
  56.       
  57.     # Print errors, warnings, and messages returned from the analysis  
  58.     print "The following information was returned during analysis of the MXD:"  
  59.     for key in ('messages''warnings''errors'):  
  60.       print '----' + key.upper() + '---'  
  61.       vars = analysis[key]  
  62.       for ((message, code), layerlist) in vars.iteritems():  
  63.         print '    ', message, ' (CODE %i)' % code  
  64.         print '       applies to:',  
  65.         for layer in layerlist:  
  66.             print layer.name,  
  67.         print  
  68.   
  69.     # Stage and upload the service if the sddraft analysis did not contain errors  
  70.     if analysis['errors'] == {}:  
  71.         # Execute StageService. This creates the service definition.  
  72.         arcpy.StageService_server(sddraft, sd)  
  73.     #Execute UploadServiceDefinition. This uploads the service definition and publishes the service.  
  74.         arcpy.UploadServiceDefinition_server(sd, con)  
  75.         print "Service successfully published"  
  76.     else:   
  77.         print "Service could not be published because errors were found during analysis."  
  78.   
  79.     print arcpy.GetMessages()  
  80.   
  81. # demoMXDPath:包含mxd文档名称  
  82. # folder:包含新建的mxd文档以及tiff文件的文件夹路径  
  83. def createMxdDocument(demoMXDPath,folder):  
  84.      if os.path.exists(demoMXDPath) == False:  
  85.         print "mxd document it's not exist!"  
  86.      else:  
  87.         try:  
  88.             print "opening mxd document……"  
  89.             mxd = arcpy.mapping.MapDocument(demoMXDPath)  
  90.             print "repair layer source"  
  91.             if os.path.isdir(folder) == False:  
  92.                 print "invalid document path!"  
  93.                 return  
  94.             print "reading layer document one by one......"  
  95.             files = os.listdir(folder)  
  96.             i=0  
  97.             layerName=""  
  98.             for f in files:  
  99.                 if f.endswith(".tiff"):  
  100.                     if layerName="":  
  101.                         name1=f.replace("nasa-worldview-", "")  
  102.                         layerName=name1[0:9]  
  103.                     if i>3:  
  104.                         continue  
  105.                     if f.index(layerName)>=0:  
  106.                         print layerName+";"+f  
  107.                         df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]  
  108.                         print arcpy.mapping.ListLayers(mxd, "", df)[i].name  
  109.                         lyr = arcpy.mapping.ListLayers(mxd, "", df)[i]  
  110.                         lyr.replaceDataSource(folder,"RASTER_WORKSPACE",f)  
  111.                         lyr.name=f.replace(".tiff", "")  
  112.                         i=i+1  
  113.                 else:  
  114.                     continue  
  115.             mxdName=time.strftime("%Y_%m_%d", time.localtime())+".mxd" #2015_11_24样式文件名  
  116.             newMXD=folder+"\\"+mxdName  
  117.             mxd.saveACopy(newMXD)  
  118.             del mxd  
  119.         except Exception, e:  
  120.             print "open mxd error: ", e  
  121.             return  

执行过程的代码 doPublishHelper.py :

[python] view plain copy
  1. import sys,time  
  2. sys.path.append(r"D:\ly\hb\script\v2"# python文件路径  
  3. from publishHelper import PublishAll # 必须要有正确的许可,否则导入失败  
  4. from publishHelper import createMxdDocument # 必须要有正确的许可,否则导入失败  
  5. tiffFolder=time.strftime("%Y_%m_%d", time.localtime())  
  6. tiffFolder="nasadata"  
  7. folderPath=r"D:\ly"+"\\"+tiffFolder  
  8. createMxdDocument(r"D:\ly\hb\20151124demo.mxd",folderPath)  
  9. PublishAll(folderPath, "http://localhost/ArcGIS/rest/services""ly")  



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.011 s.
京ICP备10005923号