按需进行地图缓存
ArcGIS Server 允许依照用户访问时的需要创建地图缓存切片。当对应切片由服务器绘制时,首先导航至未缓存区域的用户必须进行等待。然后,切片会被添加到服务的缓存文件夹中,并一直保留在服务器上,直到服务器管理员对其进行更新或将其删除为止。这意味着,随后访问该区域的用户不必再等待切片创建完成。
巧妙地使用按需缓存可以为您节省大量时间和磁盘空间。大多数地图,尤其是以大比例(放大后)显示时,地图读者都会看到一些空旷的、不可用的或不感兴趣的区域。按需缓存可以减轻您在创建和存储这些不必要切片时的负担,但用户仍可以在需要它们的时候对其进行查看。
尽管按需缓存是一个非常有用的功能,但误用或滥用按需缓存功能会对性能造成一些不必要的影响。本主题中包括有效使用按需缓存方面的提示。
获得最佳性能
全地图缓存的一个好处就是可以快速提供漂亮而复杂的地图,因为服务器只是在分发地图的切片图像,而不是依照每个请求绘制地图。但是,如果使用按需缓存,当用户导航至未缓存区域时,服务器必然 会动态绘制切片。动态绘制切片会比常规请求花费更长的时间,因为服务器需要一次创建一组切片。如果正在使用抗锯齿功能,这组切片的尺寸为 2048 x 2048 像素,否则为 4096 x 4096 像素。
为什么服务器不是每次只创建一个切片?如果一次仅创建一个切片,将会看到许多同名标注,因为标注引擎无法确定相邻切片上的标注。因此,服务器将一次创建一组切片,您必须准备好地图,以便以某个可接受的速度绘制较大区域。本部分介绍了几种用来减少按需缓存性能开销的方法。
确定进行按需缓存的位置
配置按需缓存时需要确定的最重要的内容是:要按需创建的区域以及预缓存区域。切勿使用按需缓存来构建整个缓存。您始终应该在希望用户流量最大的地图区域中预创建一些切片,从而最大限度地减少用户按需请求切片时所消耗的服务器资源。
如何确定地图的哪些区域最有人气?这在很大程度上取决于绘制地图的目的和地图读者。对于常规的底图而言,人口密集场所、道路、海岸线、停车场以及其他感兴趣的位置被访问的机会要比其他区域多。Microsoft Hotmap 是一份颇吸引人的案例研究,它显示了不同比例下在线底图的热门切片。请注意:对于比例较大的地图,未使用切片所占的比例也会增加。
专题地图热门地点的倾向性可能会有所不同。例如,在矿业公司所使用的地图中,利用率最高的区域可能为矿产高密度区。而矿产高密度区很可能是一般人群很少关注的人迹罕至区域或山区。
若要确定预缓存区域的位置,请先检查当前地图的使用模式,是在线模式还是桌面模式。可通过观测用户所倾向的导航位置和所查询的要素来了解更多信息。
数据的可用性和分辨率也很重要。如果某些区域中的数据较少或不存在任何数据,则可以不对这些区域进行缓存。如果没有数据需要进行显示,即使某个用户请求了按需切片,绘制也不会花费太长时间。
数据也可能与绘制地图的目的紧密相关。例如,为交通部门绘制地图,需要确保能够对道路和铁路的高密度区域进行预缓存。空间分析工具,如核密度分析可以帮助您确定热门要素较多的常用区域。
确定完用户最经常访问的区域后,应创建一个要素类来隔离这些区域。运行“管理地图服务器缓存切片”工具时将引用此要素类来确保切片仅在其边界内创建。
可以在模型或脚本中将几个工具组合在一起使用,以获得热门地点的此种要素类。模型中可包含各种预计将成为关注点的要素输入,可以选择缓冲这些要素或确定其密度,最后对输出进行后处理以确保生成的要素类适用于缓存模板。例如,要针对其边界进行缓存的要素类中不应该含有大量小要素。聚合面工具可以消除小孔洞和面,而融合工具可以使用大量要素创建一个多部分 (multipart) 要素。
您隔离地图上的热门区域越多,使用预缓存切片(而不是按需创建切片)所能满足的请求就越多。例如,您可能会发现在大比例等级地图中,只需要缓存地图区域的一小部分即可满足 99% 的用户请求。您可能会决定使用您所节省下来的磁盘空间来战略性地缓存其他比例等级。
测试和优化地图
很多组织都有复杂的地图文档 (MXD),此文档最初是准备用于桌面 GIS 的。这些地图往往需要进行调整,以获得网络用户所期望的快速反应时间。
在更改地图之前,您可能想要创建一个小区域的测试缓存来获得一些基准数字。选择一个很好的混合了地图各地形的区域,例如,城镇和乡村、平原和山区等。记录创建测试缓存所花费的时间。然后启用按需缓存并缩放至未缓存区域。记录切片以不同比例显示时所需要的时间。如果此时性能可以接受,那么可以选择不作任何调整。
如果想要改进按需创建切片(甚至常规缓存创建)的速度性能,可以使用 ArcMap 中“地图服务发布”工具条来识别和修复地图的性能瓶颈问题。使用工具条来保存地图服务定义 (MSD) 文件,发布地图服务时应使用此文件作为源文档。对于很多地图服务,使用 MSD(而不是 MXD)作为源文档可以大幅提升性能。
欲对地图服务中的低效图层执行更多高级检测,请将 ArcGIS Server 记录级别设置为“信息:详细”。对地图服务发出一个绘制请求,如缩放至 ArcMap 中的某个书签。然后检查日志中的 ExportMapImage 请求并记录每个图层的绘制时间。您很快便可以识别出占用大部分时间的图层。随机选择地图的不同区域,以不同的缓存比例重复此项测试将会是一个很好的做法。完成测试后,请不要忘记将记录级别设回“常规”,因为“信息:详细”会写入更多通常并不需要的日志信息。
地图优化完成后,请再对缓存进行一次测试并记录按需创建切片所需的时间。如果此时性能仍然不能接受,可以选择执行以下操作之一:
- 预缓存更大区域。这样遇到按需切片的机会将有所降低。可以尝试将按需缓存限定在比例最大、最为空旷的区域内,进而确保不需要一次绘制很多要素。
- 创建完全缓存。通过预缓存所有切片,您将不再需要按需创建切片。如果您有时间和空间来创建一个完全缓存,这可能是最好的选择,并且它不需要经常更新。如果服务器停机,而缓存成为令人关注的问题,您可以设定在晚上和周末进行缓存作业,以便能够稳定地构建缓存,直至创建一个完全缓存为止。您也可以选择将一个服务实例专门用于进行缓存,而将其他的实例用于处理用户请求。
- 使用动态服务。如果构建完全缓存并不可行,而使用动态服务后的性能是可以接受的,则完全可以选择不进行缓存。虽然使用此选项不会获得最佳性能,但所获得的数据永远是最新的。
更新切片
编辑源数据库时,需要先更新缓存,之后用户才能看到所做的更改。如果依照建议将某一区域依据要素类进行预缓存并按需填入了其他缓存,则需要注意此更新将涉及所有必需的区域。
如果您一直在按需创建切片,则可使用以下两种策略来更新缓存:
-
删除所有按需创建的切片,然后再执行更新。如果正在按需创建切片,则可依据要素类预缓存某一特定区域。通常情况下,您也可以依据要素类执行更新,此时如果不删除按需切片,它们就会过期。
要删除这些切片,请运行“管理地图服务器缓存切片”,并使用“删除切片”模式。应该依据非预缓存要素类删除切片。可以使用 ArcGIS 编辑工具创建一个用来表示地图全图范围的面,并在其内部剪出一个洞表示预缓存区域。由此产生一个圆环面,应删除此区域内的切片。有关如何使用“裁剪”命令在面中剪出孔的说明,请参阅在现有面中剪出孔。
也可先删除缓存中的所有切片,之后再进行更新,但如果缓存较大,这样做的开销可能会大一些。
如果担心用户每次更新后都需要等待某个地点完成按需缓存操作,应考虑将此地点添加到预缓存区域中。如果预缓存应用得当,将仅在地图冷门区域以随机模式偶尔进行按需缓存。如果用户经常返回至某地点,应该对此地点进行预缓存。
-
使缓存更新操作仅限定在已对数据进行编辑的区域。实现此操作的一种方法是:使用地理数据库存档或自定义工具来追踪自上次更新之后所做的所有更改,然后将这些做过更改的区域导出到某个要素类中,并基于此要素类的边界更新切片。
如果确实打算仅更新执行过编辑操作的区域,则不必删除所有按需创建的切片。