使用arcpy脚本发布地图切片服务会比人工发布更加方便快捷,步骤如下(1)发布动态服务;(2)创建地图服务缓存;(3)创建切片文件并生成切片。
import sys, os, time, io, string import arcpy import xml.dom.minidom as DOM import datetime #sys.setdefaultencoding(\'utf-8\')#本意是支持中文字符,结果导致print无输出 #发布服务本地缓存路径 wrkspc = r"C:\cache" #GIS服务器.ags连接文件,注意无空格、特殊字符、中文等 conn = r"C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.2\ArcCatalog\xxxxx_publisher.ags" #发布服务文件夹 foldername = "TEST" #远程GIS服务器上的服务缓存目录 cachepath = r"D:\arcgisserver\directories\arcgiscache" #切片方案文件 tilingscheme = r"D:\CutConfig.xml" #切片方案文件对应的切片比例级数 numscales = "6" #发布Arcgis动态服务,返回服务路径 #mxdpath - mxd文件路径 #agspath - GIS服务器.ags连接文件路径 #serverfolder - 发布服务文件夹 #summary - 服务描述,仅支持英文 #tags - 服务标签,仅支持英文 def PublishService(mxdpath, agspath, serverfolder, summary, tags): print("begin PublishService") new_mxd = arcpy.mapping.MapDocument(mxdpath) dirname = os.path.dirname(mxdpath) mxdname = os.path.basename(mxdpath) dotindex = mxdname.index(\'.\') servicename = mxdname[0:dotindex] sddraft = wrkspc + \'\\temp\\\' + servicename + \'.sddraft\' sd = wrkspc + \'\\\' + servicename + \'.sd\' if os.path.exists(sd): os.remove(sd) #创建服务定义草稿draft文件 arcpy.mapping.CreateMapSDDraft(new_mxd, sddraft, servicename, \'ARCGIS_SERVER\', agspath, False, foldername, summary, tags) #编辑draft文件 doc = DOM.parse(sddraft) #修改参数minScale and maxScale,禁用缓存 configProps = doc.getElementsByTagName(\'ConfigurationProperties\')[0] propArray = configProps.firstChild propSets = propArray.childNodes for propSet in propSets: keyValues = propSet.childNodes for keyValue in keyValues: if keyValue.tagName == \'Key\': if keyValue.firstChild.data == \'isCached\': keyValue.nextSibling.firstChild.data = \'false\'#\'true\' elif keyValue.firstChild.data == \'minScale\': keyValue.nextSibling.firstChild.data = \'3600000\' elif keyValue.firstChild.data == \'maxScale\': keyValue.nextSibling.firstChild.data = \'1000\' #禁用KmlServer typeNames = doc.getElementsByTagName(\'TypeName\') for typeName in typeNames: if typeName.firstChild.data == \'KmlServer\': extension = typeName.parentNode for extElement in extension.childNodes: if extElement.tagName == \'Enabled\': extElement.firstChild.data = \'false\' break #修改sddraft文件路径 outXml = wrkspc + \'\\\' + servicename + \'.sddraft\' draftPaths = doc.getElementsByTagName(\'OnPremisePath\') for draftPath in draftPaths: if draftPath.firstChild.data == sddraft: draftPath.firstChild.data = outXml #保存draft with open(outXml, \'w\') as fh: doc.writexml(fh, encoding=\'UTF-8\') del doc sddraft = outXml #分析sddraft analysis = arcpy.mapping.AnalyzeForSD(sddraft) if analysis[\'errors\'] == {}: arcpy.StageService_server(sddraft, sd) arcpy.UploadServiceDefinition_server(sd, agspath) return agspath.replace(\'.ags\', \'\\\' + serverfolder + \'\\\' + servicename + \'.MapServer\') else: anaErrors = analysis[\'errors\'] for((message,code),layerlist)in anaErrors.iteritems(): print("error " + str(code) + ": " + message) return "" #创建地图服务缓存 #inputService - PublishService返回的服务路径 #serverCachePath - 服务器缓存目录路径 #predefinedTilingScheme - 切片方案文件 #numOfScales - 要在缓存中创建的比例级数(对应切片方案文件) def CreateCache(inputService, serverCachePath, predefinedTilingScheme, numOfScales): print("begin CreateCache") #List of input variables for map service properties tilingSchemeType = "PREDEFINED" scalesType = "" dotsPerInch = "96" tileSize = "256 x 256" predefinedTilingScheme = tilingscheme tileOrigin = "" scales = "" cacheTileFormat = "PNG" tileCompressionQuality = "0" storageFormat = "COMPACT" try: starttime = time.clock() result = arcpy.CreateMapServerCache_server(inputService, serverCachePath, tilingSchemeType, scalesType, numOfScales, dotsPerInch, tileSize, predefinedTilingScheme, tileOrigin, scales, cacheTileFormat, tileCompressionQuality, storageFormat) while result.status < 4: time.sleep(0.2) resultValue = result.getMessages() #print("message: " + str(resultValue))#此处总是报错调到except except Exception, e: #打印出错误号和信息 tb = sys.exc_info()[2] print("error line: " + str(tb.tb_lineno)) print("error: " + e.message) return False return True #生成切片 #inputService - PublishService返回的服务路径 def CreateTiles(inputService): print("begin CreateTiles") scales = "" numOfCachingServiceInstances = 2 updateMode = "RECREATE_ALL_TILES" areaOfInterest = "" waitForJobCompletion = "WAIT" updateExtents = "" try: result = arcpy.ManageMapServerCacheTiles_server(inputService, scales, updateMode, numOfCachingServiceInstances, areaOfInterest, updateExtents, waitForJobCompletion) while result.status < 4: time.sleep(0.2) resultValue = result.getMessages() #print("message: " + str(resultValue))#此处总是报错调到except except Exception, e: #打印出错误号和信息 tb = sys.exc_info()[2] print("error line: " + str(tb.tb_lineno)) print("error: " + e.message) return False return True #mxd文件发布为arcserver切片服务 #mxdpath - mxd文件路径 #summary - 服务摘要(仅支持英文) #tags - 服务标签(仅支持英文) def PublishMxdServer(mxdpath, summary, tags): start = datetime.datetime.now() print("Publish " + mxdpath) resService = PublishService(mxdpath, conn, foldername, summary, tags) #服务路径 = .ags全路径去除后缀 + 服务发布文件夹 + 服务名 + .MapServer #resService = r"C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.2\ArcCatalog\xxxxx_publisher\TEST\server_name.MapServer" if resService == "": sys.exit(0) if CreateCache(resService, cachepath, tilingscheme, numscales) == False: sys.exit(0) if CreateTiles(resService) == False: sys.exit(0) end = datetime.datetime.now() print("End publish : {:.4f}s".format((end-start).seconds)) print("--") #=============================================================================== # *****程序运行入口***** #=============================================================================== #PublishMxdServer(r"D:\mxd\xxx.mxd", "", "") mxddir = r"D:\mxd" for f in os.listdir(mxddir): path = mxddir + "\\" + f if os.path.isfile(path): PublishMxdServer(path, "", "")
附上一个切片方案文件;
<?xml version="1.0" encoding="utf-8" ?> <CacheInfo xsi:type=\'typens:CacheInfo\' xmlns:xsi=\'http://www.w3.org/2001/XMLSchema-instance\' xmlns:xs=\'http://www.w3.org/2001/XMLSchema\' xmlns:typens=\'http://www.esri.com/schemas/ArcGIS/10.6\'> <TileCacheInfo xsi:type=\'typens:TileCacheInfo\'> <SpatialReference xsi:type=\'typens:ProjectedCoordinateSystem\'> <WKT>PROJCS["CGCS2000_3_Degree_GK_Zone_39",GEOGCS["GCS_China_Geodetic_Coordinate_System_2000",DATUM["D_China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",39500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",117.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",4527]]</WKT> <XOrigin>33876800</XOrigin> <YOrigin>-10002100</YOrigin> <XYScale>450265407.00157917</XYScale> <ZOrigin>0</ZOrigin> <ZScale>1</ZScale> <MOrigin>-100000</MOrigin> <MScale>10000</MScale> <XYTolerance>0.001</XYTolerance> <ZTolerance>2</ZTolerance> <MTolerance>0.001</MTolerance> <HighPrecision>true</HighPrecision> <WKID>4527</WKID> <LatestWKID>4527</LatestWKID> </SpatialReference> <TileOrigin xsi:type=\'typens:PointN\'> <X>33876800</X><Y>10002100</Y> </TileOrigin> <TileCols>256</TileCols> <TileRows>256</TileRows> <DPI>96</DPI> <LODInfos xsi:type=\'typens:ArrayOfLODInfo\'> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>0</LevelID><Scale>125000</Scale><Resolution>33.072982812632297</Resolution> </LODInfo> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>1</LevelID><Scale>64000</Scale><Resolution>16.933367200067735</Resolution> </LODInfo> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>2</LevelID><Scale>32000</Scale><Resolution>8.4666836000338677</Resolution> </LODInfo> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>3</LevelID><Scale>16000</Scale><Resolution>4.2333418000169338</Resolution> </LODInfo> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>4</LevelID><Scale>8000</Scale><Resolution>2.1166709000084669</Resolution> </LODInfo> <LODInfo xsi:type=\'typens:LODInfo\'> <LevelID>5</LevelID><Scale>4000</Scale><Resolution>1.0583354500042335</Resolution> </LODInfo> </LODInfos> <PreciseDPI>96</PreciseDPI> </TileCacheInfo> <TileImageInfo xsi:type=\'typens:TileImageInfo\'> <CacheTileFormat>PNG</CacheTileFormat> <CompressionQuality>0</CompressionQuality> <Antialiasing>false</Antialiasing> <BandCount>1</BandCount> <LERCError>0</LERCError> </TileImageInfo> <CacheStorageInfo xsi:type=\'typens:CacheStorageInfo\'> <!--StorageFormat可以修改为esriMapCacheStorageModeCompact,V2版本不兼容10.2.2的ArcGIS--> <StorageFormat>esriMapCacheStorageModeCompactV2</StorageFormat> <PacketSize>128</PacketSize> </CacheStorageInfo> </CacheInfo>