教程

本教程将向您简要介绍maproxy配置。

你应该有一个 working MapProxy installation ,如果您想遵循本教程。

配置格式

maproxy的配置使用yaml格式。yaml是json的超集。这意味着每个有效的JSON也是有效的yaml。maproxy不使用yaml的高级特性,所以您甚至可以使用json。yaml使用更可读和用户友好的语法。我们鼓励您使用它。

如果你熟悉山药,可以跳到下一节。

yaml配置由注释、字典、列表、字符串、数字和布尔值组成。

评论

哈希字符后的所有内容 (# )是注释,将被忽略。

数字

任何数值,比如 12-403.1415 .

字符串

单引号或双引号内的任何字符串。如果字符串在yaml语法中没有其他含义,则可以省略引号。例如::

'foo'
foo
'43' # with quotes, otherwise it would be numeric
'[string, not a list]'
A string with spaces and punctuation.

布尔值

正确或错误值:

yes
true
True
no
false
False

列表是其他有效对象的集合。有两种格式。压缩形式使用方括号:

[1, 2, 3]
[42, string, [another list with a string]]

块窗体要求每一个列表项都位于单独的行上,从 - (破折号和空白)::

- 1
- 2
- 3

- 42
- string
- [another list]

辞典

字典将键映射到值。值本身可以是任何有效的对象。

有两种格式。压缩形式使用大括号::

{foo: 3, bar: baz}

块形式需要单独行上的每个键值对:

foo: 3
bar: baz

您还可以嵌套字典。每个嵌套字典都需要缩进一个或多个空格。标签是 not 同一字典的所有键都需要缩进相同数量的空格。

baz:
  ham: 2
  spam:
    bam: True
  inside_baz: 'yepp'

配置布局

maproxy配置是一个字典,每个键配置maproxy的不同方面。有以下键:

  • services :这是激活和配置MapProxy服务的地方

    像WMS和TMS。

  • layers :配置MapProxy提供的层。每一层可以包括

    多个源和缓存。

  • sources

    定义maproxy可以在何处检索新数据。

  • caches

    您可以在这里配置内部缓存。

  • grids :mapproxy将所有缓存图像(分片)与网格对齐。在这里你可以定义

    那个网格。

  • globals :在这里,您可以定义maproxy和默认值的一些内部结构。

    在其他配置指令中使用的。

指令的顺序并不重要,所以您可以按照自己的方式组织它。

配置示例

配置服务

一开始我们需要 configure at least one service . 要启用服务,必须将其名称作为密钥包含在 services 字典。例如::

services:
  tms:

每个服务都是一个yaml字典,以服务类型为键。字典可以是空的,但您需要添加冒号,以便配置解析器知道它是字典。

服务可能接受更多的配置选项。例如,WMS服务使用带有元数据的字典。这些数据在功能文档中使用。

下面是一个包含一些联系信息的示例:

services:
  wms:
    md:
        title: MapProxy WMS Proxy
        abstract: This is the fantastic MapProxy.
        online_resource: http://mapproxy.org/
        contact:
            person: Your Name Here
            position: Technical Director
            organization: 
            address: Fakestreet 123
            city: Somewhere
            postcode: 12345
            country: Germany
            phone: +49(0)000-000000-0
            fax: +49(0)000-000000-0
            email: info@omniscale.de
        access_constraints:
            This service is intended for private and
            evaluation use only. The data is licensed
            as Creative Commons Attribution-Share Alike 2.0
            (http://creativecommons.org/licenses/by-sa/2.0/)
        fees: 'None'

access_constraints 演示如何在多行上编写字符串,只需按与第一行相同的方式缩进每一行。记住,yaml不接受制表符,必须使用空格。

对于本教程,我们添加了另一个名为 demo . 这是一个演示服务,列出了所有配置的WMS和TMS层。您可以使用一个简单的Openlayers客户机测试每个层。所以我们的配置文件应该如下所示:

services:
  demo:
  wms:
    [rest of WMS configuration]

添加源

接下来你需要 define the source 你的数据。每个源都有一个名称和类型。让我们添加一个WMS源:

sources:
  test_wms:
    type: wms
    req:
      url: http://osm.omniscale.net/proxy/service?
      layers: osm

在这个例子中 test_wms 是源的名称,稍后需要此名称来引用它。大多数数据源需要更多的参数——有些是可选的,有些是必需的。类型 wms 需要 req 描述WMS请求的参数。您至少需要定义一个URL和层名称,但是您可以添加更多选项,如 transparentformat .

添加层

在定义了一个源之后,我们可以使用它 create a layer 对于maproxy wms。

一个层需要一个标题,该标题将在功能文档和源中使用。对于这个层,我们要使用 test_wms 数据来源:

layers:
  - name: cascaded_test
    title: Cascaded Test Layer
    sources: [test_wms]

现在我们将maproxy设置为级联WMS。这意味着maproxy只将请求重定向到在中定义的WMS test_wms 数据源。

启动开发服务器

这是第一个配置,您现在可以 start MapProxy ::

mapproxy-util serve-develop mapproxy.yaml

你可以 download the configuration .

当你打字的时候 localhost:8080/demo/ 在WebBrowser的URL中,您应该看到一个演示站点,如下所示。

_images/mapproxy-demo.png

在这里,您可以看到您配置的服务的功能,并观察它的运行情况。

添加缓存

为了用maproxy加速源代码,我们 create a cache 对于这个来源。

每个缓存都需要知道在哪里可以获取新数据,以及应该如何缓存。我们定义我们的 test_wms 作为缓存的源。maproxy将图像拆分为小图块,这些图块将与网格对齐。它还以不同的分辨率缓存图像,如图像金字塔。您可以详细定义这个图像金字塔,但是我们从默认的maproxy网格定义开始。 GLOBAL_GEODETIC 定义一个覆盖整个世界的网格。它使用epsg:4326作为空间参考系统,并与Openlayers使用的默认网格和分辨率对齐。

我们的缓存配置现在应该如下所示:

caches:
  test_wms_cache:
    sources: [test_wms]
    grids: [GLOBAL_GEODETIC]

添加缓存层

我们现在可以使用定义的缓存作为层的源。当客户机请求层时,maproxy会在缓存中查找请求的数据,并且仅当它尚未缓存数据时,才会请求 test_wms 数据源。

层配置现在应该如下所示:

layers:
  - name: test_wms_cache
    title: Cached Test Layer
    sources: [test_wms_cache]

你可以 download the configuration .

定义解决方案

默认情况下,maproxy缓存两个图像金字塔的传统功能,默认缓存的分辨率为20。每层金字塔之间的分辨率是原来的两倍。如果你想改变这个,你可以通过 defining your own grid . 幸运的是,maproxy网格提供了从其他网格继承的能力。我们让网格继承以前使用的 GLOBAL_GEODETIC 网格并添加五个固定分辨率。

网格配置应该如下所示:

grids:
  res_grid:
    base: GLOBAL_GEODETIC
    res: [1, 0.5, 0.25, 0.125, 0.0625]

如你所见,我们曾经 base 继承 GLOBAL_GEODETICres 定义我们的首选解决方案。分辨率始终以SRS为单位,在这种情况下,以每个像素的度数为单位。你可以使用 MapProxy scales util 在刻度和分辨率之间转换。

我们也可以定义一个用于计算分辨率的因子,而不是定义固定分辨率。此因子的默认值为2,但可以将其设置为所需的每个值。只是改变 res 具有 res_factor 在后面加上你喜欢的因素。

神奇的价值 res_factorSqRT2 ,2的平方根。它将缓存的分辨率数量加倍,因此您有40个而不是20个可用的分辨率。每一秒的分辨率都与两个分辨率的功率相同,因此您不仅可以在具有免费Zomming的经典WMS客户机中使用此层,而且可以在基于平铺的客户机(如Openlayers)中使用此层,后者只请求这些分辨率。看看 configuration examples for vector data for more information .

定义网格

在上一节中,我们看到了如何扩展网格以提供自定义的解决方案,但有时 GLOBAL_GEODETIC 网格并不有用,因为它覆盖了整个世界,我们只需要其中的一部分。那么让我们看看如何 define our own grid .

对于这个例子,我们为德国定义了一个网格。我们需要一个与德国区域匹配的空间引用系统(SRS)和一个围绕德国的边界框(BBOX),以限制可请求的AERA。使 bbox 稍微容易一点,我们把 bbox_srs 网格配置的参数。所以我们可以定义 bbox 在EPSG:4326。

这个 grids 配置是一个字典,每个网格配置都由其名称标识。我们称之为网格 germany 其配置应如下所示:

grids:
  germany:
    srs: 'EPSG:25832'
    bbox: [6, 47.3, 15.1, 55]
    bbox_srs: 'EPSG:4326'

我们必须更换 GLOBAL_GEODETIC 在缓存配置中, germany 网格。之后,maproxy将所有数据缓存到utm32中。

maproxy请求网格投影中的源。您可以配置 the supported SRS for each WMS source 如果 srs 我们的网格与数据源不同。

你可以 download the configuration .

合并多个层

如果您有两个WMS,并且想要提供一个包含来自两个服务器的数据的单层,那么可以将它们组合到一个缓存中。maproxy将在磁盘上存储磁贴之前组合图像。应该从下到上定义源,并且除底部之外的所有源都必须是透明的。

下面的代码是将maproxy配置为在一个缓存和一个层中组合两个WMS的示例:

services:
  wms:
  demo:
    
sources:
  test_wms:
    type: wms
    req:
      url: http://osm.omniscale.net/proxy/service?
      layers: osm
  roads_wms:
    type: wms
    req:
      url: http://osm.omniscale.net/proxy/service?
      layers: osm_roads
      transparent: true

caches:
  combined_cache:
    sources: [test_wms, roads_wms]
    grids: [GLOBAL_GEODETIC]

layers:
  - name: cached_test_wms_with_roads
    title: Cached Test WMS with Roads
    sources: [combined_cache]

你可以 download the configuration .

覆盖范围

有时,您不想在一个层中提供WMS的完整数据。使用maproxy,您可以定义数据可用或感兴趣的数据所在的区域。maproxy提供了三种限制可用数据区域的方法:边界框、多边形和ogr数据源。为了简单起见,我们只讨论边界框。有关其他方法的更多信息,请查看 the coverages documentation . 为了用边界框限制区域,我们必须在数据源的覆盖选项中定义它。下面的列表将可请求区域限制为德国:

sources:
  test_wms:
    type: wms
    req:
      url: http://osm.omniscale.net/proxy/service?
      layers: osm
    coverage:
      bbox: [5.5, 47.4, 15.2, 54.8]
      bbox_srs: 'EPSG:4326'

如您所见,覆盖范围边界框的符号与网格选项中的符号类似。

元数据块和元数据缓冲区

当你有经验与 WMS 在切片客户,你应该知道的问题,标签问题。maproxy可以通过调用两个方法来帮助解决这些问题。 Meta TilingMeta Buffering .

有一个 chapter on WMS labeling issues 讨论这些选项。

播种

配置

maproxy根据需要创建所有切片。这意味着,只缓存一次请求的磁贴。幸运的是,maproxy附带了一个命令行脚本,用于预生成所有需要的称为 mapproxy-seed . 它有自己的配置文件,名为 seed.yaml 还有几个选择。我们现在为创建一个配置文件 mapproxy-seed .

和所有的maproxy配置文件一样,它在yaml中被标记。强制选项是 seeds . 在这里,您可以创建多个种子设定任务,定义应该播种的内容。可以指定用于种子设定的缓存列表 caches . 缓存名称应与maproxy配置中的名称匹配。如果在maproxy配置中为一个缓存指定了多个网格,则可以选择这些缓存进行种子设定。它们还必须符合maproxy配置中的缓存。此外,您可以限制应该播种的级别。如果只想在有限的区域播种,可以使用 coverages 选择权。

在下面的示例中,我们配置 mapproxy-seed 为以前创建的缓存播种 test_wms_cache 从6级到16级。为了显示定义覆盖率的不同可能性,我们使用一个多边形文件来确定要播种的区域。

seeds:
  test_cache_seed:
    caches: [test_wms_cache]
    levels:
      from: 6
      to: 16
    coverages: [germany]

coverages:
  germany:
    polygons: ./GM.txt
    polygons_srs: EPSG:900913

正如你在 coverages 截面 polygons 选项指向文本文件。此文本文件包含已知文本(WKT)形式的多边形。第三个选项告诉我们 mapproxy-seed 这个 srs WKT多边形。

你可以 download the configuration 以及 polygon file .

开始播种

现在该开始播种了。 mapproxy-seed 有几个选择。我们必须使用选项 -s 定义我们 seed.yaml-f 对于我们的maproxy配置文件。我们也使用 --dry-run 选择查看maproxy将做什么,而不向我们的源发出任何实际请求。配置错误的播种可能需要几天或几周的时间,因此您应该注意干燥运行打印出来的切片编号。

mapproxy-seed 喜欢:

mapproxy-seed -f mapproxy.yaml -s seed.yaml --dry-run

如果您确定,播种工作正常,请移除 --dry-run .

下一步是什么?

你应该读一下 configuration examples 想知道更多关于Maproxy能做什么的想法。

maproxy有许多可能对您的项目有用的小特性,因此在这之后阅读文档的其他章节是个好主意。

你有什么问题吗?我们有一个 mailing list and IRC channel 在那里你可以得到支持。