配置示例

本文档将向您展示maproxy的一些使用场景,并解释一些可能对您有用的配置选项组合。

合并多个层

您有两个WMS,希望提供一个包含来自两个服务器的数据的单层。每个maproxy缓存可以有多个数据源。maproxy将在将数据块存储到磁盘之前合并来自源的结果。这些组合层也可以通过平铺服务请求。

应该从下到上定义源。除底部源以外的所有源都必须是透明的。

例子::

layers:
  - name: combined_layer
    title: Aerial image + roads overlay
    sources: [combined_cache]

caches:
  combined_cache:
    sources: [base, aerial]

sources:
  base:
    type: wms
    wms_opts:
      featureinfo: True
      version: 1.1.1
    req:
        url: http://one.example.org/mapserv/?map=/home/map/roads.map
        layers: roads
        transparent: true
  aerial:
    type: wms
    req:
        url: http://two.example.org/service?
        layers: aerial

注解

如果这些层来自同一个WMS服务器,则可以直接将它们添加到 layers 参数。例如。 layers: water,railroads,roads .

合并平铺源

也可以合并多个平铺源。您需要告诉maproxy所有覆盖源都是透明的:

sources:
  tileoverlay:
    type: tile
    url: http://localhost:8080/tile?x=%(x)s&y=%(y)s&z=%(z)s&format=png
    transparent: true

访问本地服务器

默认情况下,maproxy将以其用于缓存数据的相同格式请求数据,如果在png中缓存文件,maproxy将从png中的源wms请求所有图像。这种编码对于您的WMS服务器来说是CPU密集型的,但是减少了数据量,而不需要在WMS和MapProxy之间进行传输。如果两台服务器都在同一主机上,或者连接的带宽较高,则可以使用未压缩的TIFF作为请求格式。

例子::

sources:
  fast_source:
    type: cache_wms
    req:
      url: http://localhost/mapserv/?map=/home/map/roads.map
      layers: roads
      format: image/tiff
      transparent: true

从现有的平铺服务器创建WMS

您可以使用maproxy使用现有平铺服务器中的数据创建WMS服务器。该tile服务器可以是WMT、TMS或任何其他tile服务,您可以通过简单的HTTP请求访问tile。您总是需要在maproxy中配置一个缓存,以从图块源获取WMS,因为缓存是执行图块拼接和重新投影的部分。

下面是一个最小的例子:

layers:
 - name: my_layer
   title: WMS layer from tiles
   sources: [mycache]

caches:
  mycache:
    grids: [GLOBAL_WEBMERCATOR]
    sources: [my_tile_source]

sources:
  my_tile_source:
    type: tile
    url: http://tileserver/%(tms_path)s.png

您需要修改 url 模板参数以匹配服务器的URL。你可以使用 xyz 模板中的变量,但maproxy也支持 quadkey 与Bing兼容的Tile服务和 bbox 用于WMS-C服务。见 tile source documentation 对于所有可能的模板值。

以下是WMTS源的示例:

sources:
  my_tile_source:
    type: tile
    url: http://tileserver/wmts?SERVICE=WMTS&REQUEST=GetTile&
       VERSION=1.0.0&LAYER=layername&TILEMATRIXSET=WEBMERCATOR&
       TILEMATRIX=%(z)s&TILEROW=%(y)s&TILECOL=%(x)s&FORMAT=image%%2Fpng

注解

你需要避开百分号 (% )在URL中重复它们 (%%

你可以使用 GLOBAL_WEBMERCATOR 用于OpenStreetmap或谷歌地图兼容源的网格。大多数TMS服务应该与 GLOBAL_MERCATOR 类似于 GLOBAL_WEBMERCATOR 但是使用不同的来源(西南(tms)而不是西北(osm/wmts/google maps/etc))。其他平铺服务可能使用不同的SRS、边界框或分辨率。您需要检查您的服务的功能和 configure a compatible grid .

当您想要更改网格的名称时,您还需要创建自己的网格,它将出现在WMTS或TMS URL中。

OpenStreetmap平铺服务的配置示例:

 layers:
   - name: my_layer
     title: WMS layer from tiles
     sources: [mycache]

 caches:
   mycache:
     grids: [webmercator]
     sources: [my_tile_source]

 sources:
   my_tile_source:
     type: tile
     grid: GLOBAL_WEBMERCATOR
     url: http://a.tile.openstreetmap.org/%(z)s/%(x)s/%(y)s.png

grids:
 webmercator:
   base: GLOBAL_WEBMERCATOR

注解

请确保允许您访问磁贴服务。商业切片供应商通常禁止直接使用切片。OpenStreetmap的Tile服务 Tile Usage Prolicy .

在Openlayers中使用OpenStreetmap或Google地图覆盖图块

当您想用现有的OpenStreetmap或GoogleMaps图块在Openlayers中覆盖maproxy图块时,需要考虑一些选项。

使用mapproxy的这个用例的基本配置可能如下所示:

layers:
  - name: street_layer
    title: TMS layer with street data
    sources: [street_cache]

caches:
  street_cache:
    sources: [street_tile_source]

sources:
  street_tile_source:
    type: tile
    url: http://osm.omniscale.net/proxy/tiles/ \
      1.0.0/osm_roads_EPSG900913/%(z)s/%(x)s/%(y)s.png
    transparent: true

现在需要做的就是配置Openlayers客户机。第一个示例在WebMercator投影中创建一个简单的Openlayers映射,并使用我们的maproxy tile服务添加一个OSM基础层和一个TMS覆盖层。::

<script src="http://openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
  var map;
  function init(){
      map = new OpenLayers.Map('map', {
          projection: new OpenLayers.Projection("EPSG:900913")
      });

      var base_layer = new OpenLayers.Layer.OSM();

      var overlay_layer = new OpenLayers.Layer.TMS(
          'TMS street_layer',
          'http://127.0.0.1:8080/tiles/',
          {layername: 'street_layer_EPSG900913',
           type: 'png', isBaseLayer: false}
      );

      map.addLayer(base_layer);
      map.addLayer(overlay_layer);
      map.zoomToMaxExtent();
  };
</script>

注意我们使用了 /tiles 服务而不是 /tms 在这里。见 the tile service documentation 更多信息。

还请记住,openstreetmap和google maps切片的原点在地图的左上角,而不是像tms一样的左下角。看看 example configuration for OpenStreetMap tiles 有关该主题的更多信息。Openlayers TMS和OSM层已经处理了这种差异。

如果要将maproxy tile服务与openlayers osm layer类一起使用,或者要使用没有tms层的客户机,则可以更改maproxy计算tile坐标原点的方式。

以下示例使用类openlayers.layer.osm::

var overlay_layer = new OpenLayers.Layer.OSM("OSM osm_layer",
    "http://x.osm.omniscale.net/proxy/tiles/ \
    osm_roads_EPSG900913/${z}/${x}/${y}.png?origin=nw",
    {isBaseLayer: false, tileOptions: {crossOriginKeyword: null}}
);

URL末尾的origin参数告诉maproxy,客户机希望origin位于左上角(北/西)。通过使用 origin 选择权 tms 服务。见 TMS standard tile origin 更多信息。

使用现有缓存

1.5.0 新版功能.

在某些特殊的用例中,您可能希望使用缓存作为另一个缓存的源。例如,您可能需要更改现有缓存的网格以覆盖更大的边界框,或者支持期望不同网格的平铺客户机,但您不想再次对数据进行种子设定。

下面是一个utm缓存的例子,它使用WebMercator投影中现有缓存的数据。

layers:
  - name: lyr1
    title: Layer using data from existing_cache
    sources: [new_cache]

caches:
  new_cache:
    grids: [utm32n]
    sources: [existing_cache]

  existing_cache:
    grids: [GLOBAL_WEBMERCATOR]
    sources: [my_source]

grids:
  utm32n:
    srs: 'EPSG:25832'
    bbox: [4, 46, 16, 56]
    bbox_srs: 'EPSG:4326'
    origin: 'nw'
    min_res: 5700

回注切片

1.5.0 新版功能.

当需要访问与源平铺服务器不同的投影中的平铺时,可以使用 缓存为缓存源 从上往下看。下面是一个使用OSM图块作为源并在UTM投影中提供它们的示例。这个 disable_storage 选项防止maproxy建立两个缓存。这个 meta_size 使maproxy一次重新投影多个图块。

下面是一个使OSM图块在UTM中可用作图块的示例。请注意,重新投影矢量数据会导致质量损失。为了获得更好的结果,您需要在两个网格之间找到相似的分辨率。

layers:
  - name: osm
    title: OSM in UTM
    sources: [osm_cache]

caches:
  osm_cache:
    grids: [utm32n]
    meta_size: [4, 4]
    sources: [osm_cache_in]

  osm_cache_in:
    grids: [GLOBAL_WEBMERCATOR]
    disable_storage: true
    sources: [osm_source]

sources:
  osm_source:
    type: tile
    grid: GLOBAL_WEBMERCATOR
    url: http://a.tile.openstreetmap.org/%(z)s/%(x)s/%(y)s.png

grids:
  utm32n:
    srs: 'EPSG:25832'
    bbox: [4, 46, 16, 56]
    bbox_srs: 'EPSG:4326'
    origin: 'nw'
    min_res: 5700

创建灰度图像

1.9.0 新版功能.

通过创建将多个带区合并到单个带区的缓存,可以从现有源创建灰度层。带源可以来自缓存,也可以来自任何直接源。你可以 disable_storage 以进行即时转换。以下示例将源的RGB带与与大多数人的强度感知相匹配的因子混合:

caches:
 grayscale_cache:
     disable_storage: true
     sources:
         l: [
             {source: dop, band: 0, factor: 0.21},
             {source: dop, band: 1, factor: 0.72},
             {source: dop, band: 2, factor: 0.07},
         ]

缓存栅格数据

您有一个WMS服务器,它提供像航空图像这样的栅格数据。默认情况下,maproxy使用png图像作为缓存格式。PNG文件的编码过程占用大量CPU资源,因此缓存过程本身需要更长的时间。对于航空图像,通常不需要像PNG这样的损失较少的图像格式的质量。为了获得最佳性能,您应该使用jpeg作为缓存格式。

默认情况下,maproxy使用 bicubic 重采样。这种重采样方法还可以对矢量图像进行锐化处理。航空影像不需要这个,所以你可以使用 bilinear 甚至是最近的邻居(‘最近的’)重新采样。::

caches:
  aerial_images_cache:
    format: image/jpeg
    image:
      resampling_method: nearest
    sources: [aerial_images]

您可能还想尝试使用不同的jpeg压缩级别。更高的值 jpeg_quality 以较慢的编码速度和较大的文件大小为代价,获得更好的图像质量。见 mapproxy.yaml configuration .

globals:
  jpeg_quality: 80

混合模式

当您想将图像覆盖在其他图像上(例如,在航空图像覆盖范围的边界处)时,需要以透明的方式存储图像。PNG支持透明度,但对Arial图像无效,而JPEG对航空图像有效,但不支持透明度。

MapProxy has a mixed image format 对于这种情况。与 mixed 格式,根据每个图块的透明度,maproxy将图块存储为png或jpeg。具有透明度的图像将存储为PNG,完全不透明的图像将存储为JPEG。

注解

缓存源必须支持透明图像,并且需要设置相应的选项。

caches:
  mixed_cache:
    format: mixed
    sources: [wms_source]
    request_format: image/png

sources:
  wms_source:
    type: wms
    req:
      url: http://localhost:42423/service
      layers: aerial
      transparent: true

您现在可以在所有maproxy服务中使用缓存。wms getmap请求将以请求的格式返回图像。使用tms或wmts,您只能请求png图块,但实际响应图像是png或jpeg。HTTP协议 content-type 相应地设置标题。所有Web浏览器都支持此功能。

缓存矢量数据

您有一个WMS服务器,它可以像路线图一样呈现矢量数据。

缓存分辨率

默认情况下,maproxy缓存两个图像金字塔的传统功能,每个金字塔级别之间的分辨率加倍。例如,如果第一个级别的分辨率为10公里,它还将缓存5公里、2.5公里、1.125公里等分辨率。分辨率为7公里的请求将由10公里的缓存数据生成。这种方法的问题是,所有东西都需要缩小,线条会变细,文本标签会变得不可读。解决方案很简单:只需在金字塔中添加更多级别。有三种选择可以做到这一点。

您可以在 res 层的选项。::

caches:
  custom_res_cache:
    grids: [custom_res]
    sources: [vector_source]

grids:
  custom_res_cache:
    srs: 'EPSG:31467'
    res: [10000, 7500, 5000, 3500, 2500]

可以指定另一个用于计算分辨率的系数。默认情况下,使用系数2(10、5、2.5,…),但可以设置较小的值,如1.6(10、6.25、3.9,…):

grids:
  custom_factor:
    res_factor: 1.6

第三个选项是前一个选项的方便变体。系数1.41421,即2的平方根,将得到10、7.07、5、3.54、2.5……的分辨率。注意,每一个第二个决议都与两个决议的权力相同。如果您不仅在经典的WMS客户机中使用该层,而且还希望在基于平铺的客户机(如Openlayers)中使用该层,这非常方便,因为Openlayers只要求这些分辨率。

grids:
  sqrt2:
    res_factor: sqrt2

注解

这不会提高航空图像或扫描地图的质量,因此您应该避免使用这些图像。

重采样方法

您可以配置maproxy在缩放或转换数据时用于重新采样的方法。从观察者的角度来看,要获得矢量数据的最佳结果,您应该使用双三次重采样。您可以为每个缓存或Globals部分配置:

caches:
  vector_cache:
    image:
      resampling: bicubic
    # [...]

# or

globals:
  image:
    resampling: bicubic

具有样式化层描述(SLD)的WMS源

您可以为WMS源配置SLD。

sources:
  sld_example:
    type: wms
    req:
      url: http://example.org/service?
      sld: http://example.net/mysld.xml

maproxy还支持本地文件URL。maproxy将使用文件的内容作为 sld_body . 路径可以是绝对路径(例如 file:///path/to/sld.xml 或相对 (file://path/to/sld.xml )到maproxy.yaml文件。文件应该是UTF-8编码的。

您还可以使用配置原始SLD sld_body 选择权。您需要缩进整个SLD字符串。

sources:
  sld_example:
    type: wms
    req:
      url: http://example.org/service?
      sld_body:
        <sld:StyledLayerDescriptor version="1.0.0"
        [snip]
        </sld:StyledLayerDescriptor>

在这种情况下,maproxy将使用HTTP POST请求。你可以改变 http.method ,如果要强制获取请求。

添加高度动态层

您有不断变化的动态层,不希望缓存这些层。您可以使用直接来源。请参见下一个示例。

重新投影WMS层

如果不想缓存数据,但仍想使用maproxy的动态重投影WMS层功能,则可以使用直接层。直接将源添加到层而不是缓存中。

您应该显式定义源WMS支持的SRS。其他SRS中的请求将被重新拒绝。您应该至少指定一个地理和一个投影的SRS,以限制重新投影造成的变形。

layers:
  - name: direct_layer
    sources: [direct_wms]

sources:
  direct_wms:
    type: wms
    supported_srs: ['EPSG:4326', 'EPSG:25832']
    req:
      url: http://wms.example.org/service?
      layers: layer0,layer1

FeatureInformation

maproxy可以将FeatureInformation请求传递给WMS源。您需要启用每个源::

sources:
  fi_source:
    type: wms
    wms_opts:
      featureinfo: true
    req:
      url: http://example.org/service?
      layers: layer0

maproxy将使用此源的所有层标记为 queryable . 它也适用于与缓存一起使用的源。

对于WMS,默认情况下启用FeatureInfo支持。为了 WMTS you need to enable FeatureInfo queries by configuring the supported formats .

注解

更高级的功能 require the lxml library .

级联

来自不同来源的功能信息被连接为纯文本,这意味着XML文档可能会变得无效。但是,当 lxml 可用。

HTML

将多个HTML文档放入HTML中 body 第一份文件。如果缺少HTML骨架,则maproxy将创建它。::

<p>FI1</p>

和:

<p>FI2</p>

将导致:

<html>
  <body>
    <p>FI1</p>
    <p>FI2</p>
 </body>
</html>

XML

多个XML文档放在第一个文档的根目录中。

<root>
  <a>FI1</a>
</root>

和:

<other_root>
  <b>FI2</b>
</other_root>

将导致:

<root>
  <a>FI1</a>
  <b>FI2</b>
</root>

XSL转换

maproxy支持XSL转换,以便更好地控制功能信息。这也需要 lxml . 您可以为每个WMS源(传入)和WMS服务(传出)添加一个XSLT脚本。

您可以使用源的XSLT将所有传入文档转换为单一的统一格式,然后使用传出的XSLT脚本将此格式转换为HTML或XML/GML输出。

例子

假设我们有两个WMS源,我们无法控制功能信息响应的格式。

一个源只提供HTML功能信息。XSLT脚本从表中提取数据。我们迫使大 WMS INFO_FORMAT 到HTML featureinfo_format 选项,以便maproxy不会查询其他格式。XSLT脚本返回XML而不是HTML。我们用 featureinfo_out_format 选择权。

fi_source:
  type: wms
  wms_opts:
    featureinfo: true
    featureinfo_xslt: ./html_in.xslt
    featureinfo_format: text/html
    featureinfo_out_format: text/xml
  req: [...]

第二个源支持XML功能信息。脚本将XML数据转换为与HTML脚本相同的格式。此服务使用WMS 1.3.0,格式为 text/xml .

fi_source:
  type: wms
  wms_opts:
    version: 1.3.0
    featureinfo: true
    featureinfo_xslt: ./xml_in.xslt
    featureinfo_format: text/xml
  req: [...]

然后,我们定义两个将中间格式转换为最终结果的传出XSLT脚本。我们可以为不同的格式定义脚本。根据WMS版本和 INFO_FORMAT 请求的。

wms:
  featureinfo_xslt:
    html: ./html_out.xslt
    xml: ./xml_out.xslt
  [...]

具有维度的WMTS服务

1.6.0 新版功能.

maproxy中的维度支持仍然有限,但您可以使用它为多维WMS服务创建一个WMTS前端。

首先,您需要添加WMS源并配置映射代理应转发到服务的所有维度::

temperature_source:
  type: wms
  req:
    url: http://example.org/service?
    layers: temperature
  forward_req_params: ['time', 'elevation']

我们需要创建一个缓存,因为我们要从平铺服务(WMT)访问源。目前无法进行实际缓存,因此有必要使用 disable_storage: true .

caches:
  temperature:
    grids: [GLOBAL_MERCATOR]
    sources: [temperature_source]
    disable_storage: true
    meta_size: [1, 1]
    meta_buffer: 0

然后我们可以添加一个具有所有可用维度的层:

layers:
  - name: temperature
    title: Temperature
    sources: [temperature]
    dimensions:
      time:
        values:
          - "2012-11-12T00:00:00"
          - "2012-11-13T00:00:00"
          - "2012-11-14T00:00:00"
          - "2012-11-15T00:00:00"
      elevation:
        values:
          - 0
          - 1000
          - 3000
        default: 0

您可以知道通过WMTSKVP服务访问这个具有高度和时间维度的层。RESTful服务需要包含维度的自定义URL模板。例如::

services:
  wmts:
    restful_template: '/{Layer}/{Time}/{Elevation}/{TileMatrixSet}
        /{TileMatrix}/{TileCol}/{TileRow}.{Format}'

切片可在 /wmts/temperature/GLOBAL_MERCATOR/1000/2012-11-12T00:00Z/6/33/22.png . 你可以使用 default 对于缺失的尺寸,例如 /wmts/map/GLOBAL_MERCATOR/default/default/6/33/22.png .

具有HTTP身份验证的WMS层

您有一个需要身份验证的WMS源。maproxy支持HTTP基本身份验证和HTTP摘要身份验证。您只需要将用户名和密码添加到URL。由于基本身份验证和摘要式身份验证并不真正安全,您应该将此功能与HTTPS结合使用。您需要配置SSL证书以允许maproxy验证HTTPS连接。见 HTTPS configuration for more information . ::

secure_source:
  type: wms
  req:
    url: https://username:mypassword@example.org/service?
    layers: securelayer

在URL被记录或插入服务异常之前,mapproxy会删除用户名和密码。

如果不需要证书验证,可以禁用它。::

secure_source:
  type: wms
  http:
    ssl_no_cert_checks: True
  req:
    url: https://username:mypassword@example.org/service?
    layers: securelayer

通过HTTP代理访问源

如果系统不允许直接访问源,则maproxy可以使用HTTP代理向源发出请求。你需要设置 http_proxyhttps_proxy 代理URL的环境变量。如果安装的maproxy pip .

在Linux/UNIX上::

$ export http_proxy="http://example.com:3128" https_proxy="http://example.com:3128"
$ mapproxy-util serve-develop mapproxy.yaml

在Windows上::

c:\> set http_proxy="http://example.com:3128" https_proxy="http://example.com:3128"
c:\> mapproxy-util serve-develop mapproxy.yaml

您也可以在 server script ::

import os
os.environ["http_proxy"] = "http://example.com:3128"
os.environ["https_proxy"] = "http://example.com:3128"

如果HTTP代理需要身份验证,请向URL添加用户名和密码。例如 http://username:password@example.com:3128 .

你可以使用 no_proxy 环境变量(如果需要绕过某些主机的代理)::

$ export no_proxy="localhost,127.0.0.1,196.168.1.99"

为多个maproxy实例提供服务

可以将多个maproxy实例加载到单个进程中。每个maproxy可以具有不同的全局配置和不同的服务和缓存。 1 你可以使用 MultiMapProxy 按需加载多个maproxy配置。

例子 config.py ::

from mapproxy.multiapp import make_wsgi_app
application = make_wsgi_app('/path/to/projects', allow_listing=True)

映射代理配置来自 /path/to/projects/app.yaml 然后在 /app .

您可以使用 base 选择权。您可以将所有常用选项放入单个基本配置中,并在实际配置中引用该文件:

base: mapproxy.yaml
layers:
   [...]
1

这不适用于 srs.proj_data_dir ,因为它直接影响到proj4库。

生成用于多点触控表的静态QuadKey/虚拟地球缓存

在Microsoft多点触摸表上运行的某些软件需要一个静态四键生成的缓存。maproxy将QuadKey理解为客户机和缓存选项。

实例部分 mapproxy.yaml 要生成四键缓存,请执行以下操作:

caches:
  osm_cache:
    grids: [GLOBAL_WEBMERCATOR]
    sources: [osm_wms]
    cache:
      type: file
      directory_layout: quadkey

HQ/视网膜贴片

maproxy不支持提供高分辨率的图块,但如果您的源代码支持使用不同的比例因子或dpi渲染,则可以使用hq图块创建第二个图块层。

一开始你需要两个网格。一个规则网格和一个分辨率为一半但大小是切片的两倍的网格。以下示例配置两个与WebMercator兼容的网格:

grids:
  webmercator:
    srs: "EPSG:3857"
    origin: nw
    min_res: 156543.03392804097
  webmercator_hq:
    srs: "EPSG:3857"
    origin: nw
    min_res: 78271.51696402048
    tile_size: [512, 512]

然后需要两层和两个缓存:

layers:
  - name: map
    title: Regular map
    sources: [map_cache]
  - name: map_hq
    title: HQ map
    sources: [map_hq_cache]

caches:
  map_cache:
    grids: [webmercator]
    sources: [map_source]
  map_hq_cache:
    grids: [webmercator_hq]
    sources: [map_hq_source]

最后是两个来源。HQ图块的源需要使用较高的比例/dpi设置渲染图像。这个 mapnik SOURCE通过 scale_factor 选择权。例如,mapserver支持 map_resolution 请求参数。

sources:
  map_source:
    type: mapnik
    mapfile: ./mapnik.xml
    transparent: true

  map_hq_source:
    type: mapnik
    mapfile: ./mapnik.xml
    transparent: true
    scale_factor: 2

有了这个配置 /wmts/mapnik/webmercator/0/0/0.png 返回常规WebMercator图块:

_images/mapnik-webmerc.png

/wmts/mapnik_hq/webmercator_hq/0/0/0.png 返回512x512像素的同一个图块:

_images/mapnik-webmerc-hq.png

为单个层提供多个缓存

1.8.2 新版功能.

您有一个数据集需要与不同的网格(即WMTS平铺矩阵集)一起使用。

可以使用多个网格创建缓存,并将其用作层源:

layers:
  - name: map
    title: Layer with multiple grids
    sources: [cache]

caches:
  cache:
    grids: [full_grid, sub_grid]
    sources: [source]

这个 map 层在WMS和Tile服务中可用。网格在WMT中可用作单独的平铺矩阵集。但是,对于每个层,这仅限于一个缓存。不能重复使用 full_grid 对于 sub_grid .

你需要使用 tile_sources 使多个缓存作为一个层可用。 tile_sources 允许您重写 sources 切片服务。这允许你 use caches that build up on other caches .

例如::

layers:
  - name: map
    title: Layer with sources for tile services and for WMS
    tile_sources: [full_cache, inspire_cache]
    sources: [full_cache]

caches:
  full_cache:
    grids: [full_grid]
    sources: [source]
  inspire_cache:
    grids: [sub_grid]
    sources: [full_cache]
    disable_storage: true