http://blog.newnaw.com/?p=789html
两年前我写过一篇关于ArcGIS地图切图/缓存原理的文章,《ArcGIS Server的切图原理深刻》,里面以tiling scheme为主,讲了缓存图片的存储结构以及相关坐标的计算。那时仍是ArcGIS 9.3版本,如今ArcGIS 10已经推出快一年多了,地图缓存/切图方面有了很大改进,好比增长了compact缓存格式,增长了import/export map server cache工具,增长了mixed图片模式等。此次就在上篇文章的基础上,以ArcGIS 10为例,看看其中地图切图/缓存制做的工做机制。
注:本文旨在深刻了解ArcGIS目前切图(即制做地图服务的缓存)的机制,以帮助工做中有须要的朋友们提升工做效率,由于切图,尤为是大比例尺,耗时耗资源,实在是一件伤不起的工做。这里已经假设你知道了如何为缓存地图服务配置地图,如何检查发布地图服务的地图文档的性能,开始动手前务必进行小范围、全比例尺切图试验等等注意事项,如否,请查阅相关资料。缓存
supertile和bundle工具
要深刻了解ArcGIS在切图时的工做机制,有两个概念必须明白,就是supertile和bundle。
假设一个tile(切片)的大小是256*256,在切图时若是按照这个大小直接exportmap,开启了动态标注的地图服务上线图层和面图层就会有不少重复的标注。由于exportmap时,每一个tile都会包含一个要素的标注,若是一个要素横跨了多个tile(这在大比例尺下基本是确定的),那么这些tile上就会出现相同的标注,exportmap时并不知道相邻的tile上已经有了该要素的标注。性能
为了解决这个问题,ArcGIS在切图时引入了supertile的概念,开启抗锯齿时supertile大小为2048*2048,反之为4096*4096。真正切图时会首先exportmap出一个supertile,而后将它们分割成指定大小的tile。对于每一个要素,每一个supertile中只包含一次标注,这样保证一个superfile大小的范围内不会出现重复标注。事实上在绘制supertile时,会尽量多地包含周围的标注,因此在每一个supertile的边界周围仍会有重复标注。解决重复标注的根本办法就是使用annotation,而不是label。
ArcGIS 10中推出了新的compact缓存格式,将原来离散的每一个tile图片(exploded格式),保存成连续的二进制文件(.bundle),每一个.bundle文件最多可存储128*128个tile。相比之前成千上万的tile文件,这样作有明显的好处:易于缓存迁移,减小占用磁盘空间,减小硬盘i/o等,esri在任什么时候候都推荐使用compact格式来建立缓存,除非你须要本身读取每一个tile(技术上来讲这点能够不成立)。ArcGIS 10在切图时,也采用了bundle的概念:对于每一级比例尺,首先从tiling scheme origin开始,将切图范围分红若干个bundle,每一个bundle覆盖的范围是128*128个tile大小。好比在1:4096比例尺时,若是tile大小是256*256,DPI为96,那么每一个bundle范围的大小是:((4096*2.54/96)/100/1000*256*128)^2=1261.086平方公里。以后,有且仅有(这么作是为了不多个进程同时读写一个磁盘文件)一个服务实例/一个arcsoc.exe进程(若是是high isolated)来负责此bundle范围的切图,先输出supertile,而后再切成tile。即便选择了exploded缓存格式,ArcGIS 10中也会采用这种机制来切图。spa
9.3.1及之前版本中,每一个服务实例工做的单位是supertile。即一个arcsoc.exe负责生成一个supertile,而后切成tile,再继续生成下一个supertile……相比supertile这种处理单位来讲,采用bundle做为处理单位的ArcGIS 10中的服务实例能够将更多精力投入到连续切图中去,而不是频繁切换本身负责的范围。在大比例尺切图中,这种新机制能很大程度上减小切图时间;但在小比例尺切图中,这种新机制有可能反而增长切图时间。由于小比例尺时可能全图范围只有不到一个bundle范围大小,这样只会有一个服务实例来切图,其余实例都处于空闲状态,而9.3.1及之前版本中,全部服务实例都会“一拥而上”。rest
网格切图和按featureclass范围切图server
有过大比例尺范围切图经验的朋友确定会知道,通常切图策略是:小比例尺全图直接切,较小比例尺可能按照某个featureclass范围来切,而大比例尺通常是按照包含网格(grid)的featureclass范围来切。以我国全范围切图为例,小比例尺时全图切没有问题,大比例尺时若是仍然全图范围(包络矩形)切的话,会将周边其余的国家也包含进来,这并不须要的额外工做量在大比例尺时会是一场噩梦。htm
而之因此不只要按指定featureclass范围切图,并且featureclass里要包含网格的缘由在于,便于细化和跟踪切图进度。切图工具会给你指定的featureclass建立一个新的Cached字段,将已经切好的feature标记为YES,以便在选择Recreate Empty Cache时避免重复切图,从而能够将切图工做分为屡次来进行,或者以便在切图失败后排查缘由,继续切图工做。
在指定featureclass范围切图时,是顺序处理该featureclass中的全部feature的。全部的服务实例会首先集体处理一个feature范围,切出该feature范围内全部要求的比例尺级别的结果。此时ArcGIS Server会重启该服务。而后全部服务实例再去切下一个feature范围……因此与每一个feature边界相交的supertile可能会被建立两次或屡次(多个feature的相交处),这也是为何在使用featureclass切图前,须要分别对它进行Generalize,Aggregate和Dissolve的缘由。blog
结合以前bundle的机制咱们知道,若是一个feature范围刚好只包含一个bundle,那么就杯具了,由于对该feature切图时,只会有一个服务实例进行工做(一个bundle同时由且仅由一个服务实例处理),其余服务实例所有处于空闲状态。所以,比较理想的状况是,每一个feature至少包含比服务实例数更多的bundle时,才能充分利用硬件资源来对其切图。
这就会引出一个问题,就是如何来肯定某个比例尺下一个bundle的大小,从而生成这样的featureclass呢?ArcGIS 10中,给咱们提供了一个新的GP工具Map Server Cache Tiling Scheme To Polygons,利用它,咱们能够针对某个地图服务,生成每一个须要切图比例尺下全部的supertile,进而获得以每一个supertile为一个feature的featureclass。以全国地图为例,在1:288,895比例尺(ArcGIS Online Tiling Scheme的第12级)下生成的supertile是这样的:进程
咱们须要的是某个比例尺下bundle的范围,如何根据supertile来肯定bundle的大小呢?在N级比例尺时,一个supertile是16*16个tile,第N+1级比例尺时,该supertile会覆盖32*32个tile,第N+2级比例尺时,覆盖64*64个tile,第N+3级比例尺时,这个第N级的supertile会覆盖128*128个tile,眼熟吧,这正是一个bundle的大小。因为supertile和bundle都是从tiling scheme origin往右下角算起的,所以第N级一个supertile的范围正是第N+3级一个bundle的范围。由此若是咱们要生成第15级的bundle网格,只须要用Map Server Cache Tiling Scheme To Polygons工具生成第12级supertile的网格便可,如上图。
以此为例,咱们来讲明如何有效进行大比例尺切图的问题。假设咱们须要对1:36,111(ArcGIS Online Tiling Scheme的第15级)这个比例尺进行切图,咱们首先生成该范围的bundle网格,刚好是第12级的supertile网格,如上图。为了简便起见,咱们只取其中8个feature来作说明,地图服务的最大实例数是4个(机器是单cpu,4核)。若是每一个feature刚好是一个bundle,那么一个feature只能被一个arcsoc.exe处理,而其余3个服务实例均处在空闲状态(占用内存最少的那个arcsoc.exe是用来清空工做目录的,与具体服务无关):
而咱们对这个featureclass作一个处理,将4个feature(刚好是一个bundle)合并成一个feature(bundle cluster),这样每一个feature就刚好包含了4个bundle,如此咱们所开启的4个服务实例就可全速工做了,发挥了机器的最大性能:
ps:Map Server Cache Tiling Scheme To Polygons工具生成的supertile是从tiling scheme origin开始计算的,而不是地图服务的fullextent左上角,所以利用它生成的supertile合并出来的bundle是最合理的,刚好与理想的bundle分界处一致。所以在大比例尺下利用featureclass切图时,应当利用Map Server Cache Tiling Scheme To Polygons来生成网格,而不是fishnet工具。在ArcGIS 10.1中,将会推出新的GP工具,会根据cpu核数来生成合理的包含bundle cluster大小feature的featureclass。
其余方面还有一些问题,好比切图时最大服务实例数设置多少为好(通常是cpu核数+1),即便全部实例所有工做cpu占用率依然低于90%(有多是内存不足)等问题,与切图机制无关,就不在此讨论了。
总之,切图是一个技术活,要求还比较高,须要考虑的问题不少。若是你只把它当一项体力活来看的话,只能说明认识还不够全面,那就不能怪ArcGIS Server很差。毕竟,人家ArcGIS Online全球的19级缓存都7*24小时上线两年了,还有什么理由说产品很差呢?