动态更新 AGS Cache
作者:Flyingis
提升ArcGIS Server访问速度最佳的方式是Cache,将所有图层切片保存在服务器,客户端请求时直接访问cache好的图片,这里分为两种情况,一是所有图层都做cache,二是部分图层做cache,部分图层仍通过ags服务生成,即multi_layer,它们可能会经常被更新(基于b/s浏览器端的更新,或在c/s客户端更新,或通过mobile无线移动的更新),这样做虽然可以从一定程度上解决访问速度问题,但在有些情况下,对地图的实时性要求不是非常高,或业务并不需要经常编辑部分图层,那么我们可以通过定时更新cache的方式,让客户端访问的总是已经cache好的地图,既保证客户端浏览速度最大化,又满足系统一定的实时性要求。
我们知道,arctoolbox以及arccatalog都可以管理ags cache,那我们可以利用geoprocessing tool编写脚本,实现ags cache的生成、更新。这里需要注意两点:
1.如果客户端要浏览实时数据,并且实时性要求非常高,不建议使用动态更新cache,multi_layer方式更好。
2.如果cache特别大,并且全图的数据、符号经常改变,不建议使用动态更新cache,指定地图局部范围的更新更适合动态更新。
对大数据量的图层做过cache的工程师知道,数据量越大、放大缩小分级越多,生成cache的时间呈指数上升,使用动态更新cache,就需要将更新的时间控制在一定的时间内,如果时间太长就没有意义了,甚至会影响应用。
Python脚本编写比较简单:
# Access the geoprocessing tools
import arcgisscripting
gp = arcgisscripting.create()
# Set up all of the variables for the update tool
server_name = "myserver1"
object_name = "Precipitation"
data_frame = "Layers"
layers = ""
constraining_extent = ""
scales = "32000000;16000000;8000000;4000000;2000000"
update_mode = "Recreate All Tiles"
thread_count = "2"
antialiasing = "NONE"
# Run the Update Map Server Cache tool
try:
print 'Starting Cache Update'
gp.UpdateMapServerCache(server_name, object_name, data_frame, layers, constraining_extent, scales, update_mode, thread_count, antialiasing)
print 'Finished Cache Update'
# Get the error messages if the tool fails
except:
gp.AddMessage(gp.GetMessages(2))
print gp.GetMessages(2)
如果对python script控制arctoolbox不熟,建议看ArcGIS Desktop Help。
更新的脚本已经写好了,最后是如何定时更新,这里要用到windows任务管理,这是windows非常普通的一个功能,但在实际中使用的很少,“开始--所有程序--附件--系统工具--任务计划”,创建一个新的任务,除此之外,还可以用命令行创建任务,schtasks命令:
http://technet2.microsoft.com/windowsserver/en/library/1d284efa-9d11-46c2-a8ef-87b297c68d171033.mspx?mfr=true
更新cache需要关注另外三个问题:
1.更新过程两次重启ags服务,一次在更新之前,一次在更新完成后,重启过程服务将暂时不能使用。
2.更新过程要消耗一定的实例,如果采用池化方式,应该注意thread_count小于maximun number of instances。
3.更新尽量在夜晚网络低峰期。
Flyingis @ China
email: dev.vip#gmail.com
blog: http://flyingis.cnblogs.com/