当在不同客户端(Web 客户端或基于桌面的客户端)中使用地图缓存时,需要考虑这些应用程序处理切片的方式、切片是否存储在本地以及叠加缓存需要满足的条件。
应用程序如何访问和使用缓存
在您定义了地图服务的切片方案之后,服务即会开始尝试使用缓存。任何可以显示地图服务的 ArcGIS 应用程序都将使用该缓存,只不过各应用程序检索和使用切片的方式各不相同。
Web 应用程序
当使用 ArcGIS API for JavaScript 进行开发时,您需要使用特定的类来指定正在连接的是一个切片(缓存的)地图服务。例如,可使用 ArcGISTiledMapServiceLayer 连接到缓存服务。而使用这一缓存服务时,则要通过 REST 调用将切片从缓存目录检索到地图服务中。切片请求所采用的格式为 http://<map service URL>/tile/<level>/<row>/<column>。
在任一 Web 应用程序中查看单个缓存服务时,如果平移到了某个不存在任何切片的区域,应用程序将不会显示动态图像,从而导致您无法看到任何内容。可确保您在平移到未缓存区域时仍能看到地图的唯一方式就是启用按需缓存。
提示:
如果地图的显示速度比预期慢,请检查地图图像的 URL,以确定应用程序是否正在检索切片。可通过以下方式执行此操作:在 Mozilla Firefox 中打开该应用程序,然后单击 Firefox > Web 开发者 > Web 控制台。打开控制台后,单击网络按钮,然后开始缩放或平移地图。
如果 URL 如下所示,则说明应用程序正通过 REST 请求成功获取切片:
http://gisserver.domain.com:6080/arcgis/rest/services/myService/MapServer/tile/10/1723/3495.jpg
如果地图图像的 URL 格式不是以上任意一种形式,则说明应用程序正以一种低效方式检索切片,或者根本未使用缓存。
ArcMap 和 ArcGIS Pro
您可以使用添加数据按钮向 ArcMap 和 ArcGIS Pro 中添加缓存的地图服务,添加方式与添加任何其他地图服务的方式完全相同。有两种方法可以查看缓存:
- 通过地图服务访问缓存 - 要以此种方式查看缓存,请浏览至用于创建缓存的 GIS 服务器和地图服务。这种情况下,将与 GIS 服务器建立一个初始连接,以确定此服务是否具有缓存。然后会从服务器文件系统上的缓存目录中检索切片。
- 以访问栅格数据集的形式访问这一缓存 - 要按此种方式查看缓存,请浏览至包含缓存切片的目录,然后添加数据集。表示缓存的图标与通过添加数据按钮添加所有其他栅格时所使用的图标相同。作为栅格访问的缓存只能进行查看,不能进行查询。此种类型缓存的优势在于,它不与地图服务相绑定,因此,即便断开了与服务器的连接,只要仍能访问缓存目录,便可继续查看该缓存。
对切片执行请求时,如果切片比例与缓存中某一比例级别完全匹配,地图服务就将直接返回该切片。但更多时候,请求并不与缓存中的任一比例级别完全匹配。此种情况下,通常会请求下一个最接近比例级别下的切片,然后对其重采样以匹配所请求的比例。该重采样过程仍然要比动态生成切片快得多,但它会导致图像发生变形。正是由于该重采样过程,以某种比例读取缓存的地图标注时可能会遇到困难。因此,要获得最佳结果,请以创建缓存时所用的比例或与该比例相接近的比例查看地图。
ArcGlobe 和 ArcGIS Explorer
ArcGlobe 和 ArcGIS Explorer 可读取 2D 缓存并将其叠加在地球表面上。如果使用 ArcGIS Online/Google 地图/Bing 地图切片方案构建缓存,将会获得最佳性能。如果无法使用这些切片方案,则可通过使用 globe 服务来获得最佳性能。
当您创建了一个 2D 地图缓存并想基于该 2D 缓存创建相同的 3D globe 缓存时,您可能会希望将地图服务添加至 ArcGlobe 中。此种情况下,您需要考虑的仅是生成缓存而已,而不用考虑导航地球。
提高缓存地图服务的显示性能
当客户端向 ArcGIS Server 发送请求以显示地图服务时,服务器上的响应通常由浏览器进行缓存,并在一段时间之内重复使用。此行为有助于 ArcGIS Server 获得最理想的地图服务显示性能。但您可以考虑根据地图服务及其相关数据在应用程序中的使用方式来调整浏览器缓存中的响应将使用多长时间。通过将名为 cacheControlMaxAge 的属性添加到服务的 JavaScript 对象标记法 (JSON),可实现上述操作。
cacheControlMaxAge 属性的使用方式
ArcGIS Server 地图服务响应包括实体标签 (ETag) 和缓存控制头。ETag 头值是响应的唯一标识符。缓存控制头具有一个最长期限值,该值可向浏览器提供有关浏览器缓存中响应可供重复使用的最大时段的信息。该值由 cacheControlMaxAge 属性控制。
如果重复请求且尚未超过缓存的最长期限,则浏览器将使用缓存的响应而不会将请求发送到服务器。如果最长期限已过期,则浏览器必须将请求发送到服务器,并通过与其缓存中响应相对应的相关 ETag 值设置 IF-NONE-MATCH 头。ArcGIS Server 将评估请求,并使用 ETag 值来确定响应是否更改。如果服务器的响应与浏览器中的副本不同,则服务器会将一个全新的响应发送到浏览器。如果响应与浏览器中的副本一致,则服务器将提示浏览器继续使用其缓存中的响应。
定义 cacheControlMaxAge 属性值
要指定允许浏览器使用缓存响应的时长,请定义 cacheControlMaxAge 属性。每一个服务缓存都能设置该属性。通过减少 ArcGIS Server 发送完整响应的需要,可提高浏览器缓存的效率,有助于优化应用程序,从而节省网络带宽。
对于不允许客户端本地缓存切片的缓存地图服务,默认值为 0。这表示浏览器始终重新发送请求,且 ArcGIS Server 将处理请求并在内容发生更改的情况下向浏览器发送完整的响应。此值适用于大多数应用程序。
对于允许客户端本地缓存切片的缓存地图服务,默认值为 86,400 秒(1 天)。这表示如果在 1 天内重复请求,浏览器将使用其缓存中的响应。
对于地图或数据不会发生频繁更改的缓存地图服务,建议将默认值增加到 30 天(259.2000 秒)或更长,从而最大限度地降低网络流量。
要将 cacheControlMaxAge 属性添加到服务并指定其默认值,请执行以下操作:
- 在 web 浏览器中打开 ArcGIS Server 管理员目录,然后以具有管理员权限的用户身份进行登录。URL 地址格式为 http://gisserver.domain.com:6080/arcgis/admin。
- 单击服务,然后从服务列表中选择要修改的地图服务。如果此处没有列出您的服务,则可能在根文件夹下的目录中列出。
- 在服务 - <服务名称> (<服务类型>) 页面,滚动至底部然后单击编辑。
- 在服务属性对话框中,找到服务 JSON 的属性部分。
- 将 cacheControlMaxAge 属性添加到该部分,然后指定属性值(以秒为单位),如:
"properties": { "cacheControlMaxAge": "2592000",
- 单击保存编辑。
- 在服务 - <服务名称>(<服务类型>)页面,验证属性部分中是否显示 cacheControlMaxAge 属性以及您为该属性指定的值。
叠加缓存
设计将与其他地图缓存相叠加的地图缓存时,应用程会要求坐标系和切片大小必须匹配。此外,应使匹配的比例数目尽可能地多。
达到此目的的最简便方式就是先匹配两个缓存的切片方案,然后仅以对每个缓存均适用的比例创建切片。这样便可确保坐标系和切片大小均匹配,而且软件也能辨别出两个缓存具有相同的比例。
强制动态绘制
如果您发现切片因为重采样而质量较差,或者想以特定的比例查看动态数据,则可以强制服务忽略缓存并动态绘制地图。您可以在地图上的特定级别实现这一点。
例如,假设您想大比例显示实时数据。您有一个地图在缩放级别 0 - 15 范围内缓存,但应在级别 16 - 19 范围内动态绘制。解决方案是在级别 16 - 19 范围内启用动态图层,然后在地图请求里指定您希望在这些级别使用动态图层。否则,服务将返回一个由可用切片构建的地图,该地图在切片不存在的区域将为空白。