利用mxd文档和切片文件发布地图切片服务
使用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>