本文档将向您展示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
您可以使用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。你可以使用 x
, y
, z
模板中的变量,但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 .
当您想用现有的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
您可以为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
,如果要强制获取请求。
您有不断变化的动态层,不希望缓存这些层。您可以使用直接来源。请参见下一个示例。
如果不想缓存数据,但仍想使用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
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中 body
第一份文件。如果缺少HTML骨架,则maproxy将创建它。::
<p>FI1</p>
和:
<p>FI2</p>
将导致:
<html>
<body>
<p>FI1</p>
<p>FI2</p>
</body>
</html>
多个XML文档放在第一个文档的根目录中。
<root>
<a>FI1</a>
</root>
和:
<other_root>
<b>FI2</b>
</other_root>
将导致:
<root>
<a>FI1</a>
<b>FI2</b>
</root>
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
[...]
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
.
您有一个需要身份验证的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
如果系统不允许直接访问源,则maproxy可以使用HTTP代理向源发出请求。你需要设置 http_proxy
和 https_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可以具有不同的全局配置和不同的服务和缓存。 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:
[...]
这不适用于 srs.proj_data_dir ,因为它直接影响到proj4库。
在Microsoft多点触摸表上运行的某些软件需要一个静态四键生成的缓存。maproxy将QuadKey理解为客户机和缓存选项。
实例部分 mapproxy.yaml
要生成四键缓存,请执行以下操作:
caches:
osm_cache:
grids: [GLOBAL_WEBMERCATOR]
sources: [osm_wms]
cache:
type: file
directory_layout: quadkey
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图块:
/wmts/mapnik_hq/webmercator_hq/0/0/0.png
返回512x512像素的同一个图块:
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