本教程将向您简要介绍maproxy配置。
你应该有一个 working MapProxy installation ,如果您想遵循本教程。
maproxy的配置使用yaml格式。yaml是json的超集。这意味着每个有效的JSON也是有效的yaml。maproxy不使用yaml的高级特性,所以您甚至可以使用json。yaml使用更可读和用户友好的语法。我们鼓励您使用它。
如果你熟悉山药,可以跳到下一节。
yaml配置由注释、字典、列表、字符串、数字和布尔值组成。
哈希字符后的所有内容 (#
)是注释,将被忽略。
任何数值,比如 12
, -4
, 0
和 3.1415
.
单引号或双引号内的任何字符串。如果字符串在yaml语法中没有其他含义,则可以省略引号。例如::
'foo'
foo
'43' # with quotes, otherwise it would be numeric
'[string, not a list]'
A string with spaces and punctuation.
列表是其他有效对象的集合。有两种格式。压缩形式使用方括号:
[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和层名称,但是您可以添加更多选项,如 transparent 或 format .
在定义了一个源之后,我们可以使用它 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中,您应该看到一个演示站点,如下所示。
在这里,您可以看到您配置的服务的功能,并观察它的运行情况。
为了用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]
默认情况下,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_GEODETIC 和 res 定义我们的首选解决方案。分辨率始终以SRS为单位,在这种情况下,以每个像素的度数为单位。你可以使用 MapProxy scales util 在刻度和分辨率之间转换。
我们也可以定义一个用于计算分辨率的因子,而不是定义固定分辨率。此因子的默认值为2,但可以将其设置为所需的每个值。只是改变 res 具有 res_factor 在后面加上你喜欢的因素。
神奇的价值 res_factor 是 SqRT2 ,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 我们的网格与数据源不同。
如果您有两个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]
有时,您不想在一个层中提供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 Tiling 和 Meta 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 在那里你可以得到支持。