渲染矢量图的平铺通常会导致标签被截断或重复。其中一些问题可以通过正确配置maproxy来解决,但有些问题需要更改源WMS服务器的配置。
本文档描述了maproxy和mapserver的设置,但这些问题和解决方案也适用于其他WMS服务器。请参阅他们的文档,了解如何配置这些设置。
maproxy总是使用小的图块进行缓存。maproxy不将传入请求传递给源wms 1, 但它总是请求与内部网格对齐的图像/图块。maproxy为WMS请求和分块请求(tms/kml)组合、缩放和重新投影这些分块,客户机(openlayers等)组合这些分块。
除了未缓存的级联WMS请求。
组合切片时,边界处的文本标签需要同时出现在两个切片上,并且需要放置在完全相同的(地理)位置。
这里有三个常见问题。
有两个选项可以帮助解决这些问题。
您可以使用meta-tiles来减少标签问题。元图块是多个图块的集合。maproxy不是用单个请求请求请求每个图块,而是请求覆盖多个图块区域的单个图像,然后将响应拆分为实际图块。
下图显示:
细线代表切片。WMS请求(内部框)由20个图块组成,在不进行元平铺的情况下,每个图块都会导致对WMS源的请求。对于4x4大小的meta-tile,只需要向源WMS发送两个更大的请求(粗黑框)。
因为您请求的图像更少,所以标签问题出现的边界也更少。在这种情况下,它将平铺/图像边界的数量从31减少到只有一个。
但是,它只会减少问题,不能解决问题。但是,应该使用它,因为它还减少了源WMS服务器上的负载。
您可以在 globals.cache
截面图和每个截面图 cache
. 它默认为 [4, 4]
.
globals:
cache:
meta_size: [6, 6]
caches:
mycache:
sources: [...]
grids: [...]
meta_size: [8, 8]
这也适用于切片服务。当像openlayers这样的客户机并行地从上面的示例中请求20个图块时,maproxy仍将请求这两个元图块。锁定确保每个meta-tile只被请求一次。
除了元块之外,mapproxy还实现了一个元缓冲区。元缓冲区在请求区域的边缘添加了额外的空间。使用这个缓冲区,您可以解决第一个问题:bbox之外没有放置。
您可以将元平铺和元缓冲区结合起来。然后,maproxy使用配置的缓冲区扩展整个meta-tile。
100的元缓冲区将在请求的每个边缘添加100个像素。元大小为4x4,平铺大小为256x256,请求的图像从1024x1024扩展到1224x1224。BBOX也被扩展以适应新的地理范围。
要解决第一个问题,该值至少应为最长标签的一半:如果文本标签宽度高达200像素,则应使用大约120像素的元缓冲区。
您可以在 globals.cache
截面图和每个截面图 cache
. 它默认为 80
. ::
globals:
cache:
meta_buffer: 100
caches:
mycache:
sources: [...]
grids: [...]
meta_buffer: 150
您可以使用meta-tiling减少一些标签问题,并使用meta缓冲区解决第一个问题。动态和重复标记的问题需要对WMS服务器进行一些更改。
通常,需要禁用标签的动态位置,并且需要允许呈现部分标签。
MapServer有很多影响渲染的设置。两个最重要的设置是
PROCESSING "LABEL_NO_CLIP=ON"
从 LAYER
配置。使用此选项,标签将固定到整个要素,而不仅仅是当前地图请求中可见的要素部分。默认关闭。
和
PARTIALS
从 LABEL
配置。如果此选项为真,则标签将呈现在映射请求的边界之外。默认值为true。
PARTIAL FALSE
¶解决所有问题的最简单方法是 PARTIAL FALSE
元缓冲区为0。这可以防止任何标签被截断,但它有一个很大的缺点:因为在元图块的边界上没有显示标签,所以您将拥有完全没有标签的区域。这些区域在地图上形成了明显的网格图案。
以下图片演示了一个WMS请求,中间有一个元图块边界。
您可以通过为每种类型的几何图形设置正确的配置选项来改进这一点。
如上所述,您可以使用元缓冲区来防止丢失标签。你需要设置 PARTIALS TRUE
(默认设置),并配置足够大的元缓冲区。每个请求都需要将标签放置在同一位置。您可以使用配置 POSITION
选项。默认值为 auto
你应该把它设置成一个显式的值, cc
或 uc
例如。
example.map
::
LABEL
[...]
POSITION cc
PARTIALS TRUE
END
mapproxy.yaml
::
caches:
mycache:
meta_buffer: 150
[...]
meta-tiling减少了重复标签的数量,但它们仍然可以在meta-tiles的边界处出现。
你可以使用 PROCESSING "LABEL_NO_CLIP=ON"
解决此问题的选项。使用此选项,MapServer将标签始终放置在固定位置,即使该位置在当前地图请求之外。
如果 LABEL_NO_CLIP
使用选项, PARTIALS
应该是 TRUE
. 否则,如果标签与地图边界重叠,则不会呈现标签。此选项还需要元缓冲区。
example.map
::
LAYER
TYPE POLYGON
PROCESSING "LABEL_NO_CLIP=ON"
[...]
LABEL
[...]
POSITION cc
PARTIALS TRUE
END
END
mapproxy.yaml
::
caches:
mycache:
meta_buffer: 150
[...]
默认情况下,标签在较长的字符串上重复。重复这些标签的位置取决于该行的当前视图。对于长线,该位置可能在两个相邻图像请求中有所不同。
大多数情况下,当您使用 PARTIALS TRUE
和元缓冲区。但是,您可能会注意到长线字符串上被截断的标签。但实际上,这些问题很少发生。
example.map
::
LAYER
TYPE LINE
[...]
LABEL
[...]
PARTIALS TRUE
END
END
mapproxy.yaml
::
caches:
mycache:
meta_buffer: 150
[...]
您可以禁用重复标签 PROCESSING LABEL_NO_CLIP="ON"
,如果不希望有任何截断的标签。就像多边形一样,你需要设置 PARTIALS TRUE
并使用元缓冲区。这样做的缺点是,每行的中间只会有一个标签。
example.map
::
LAYER
TYPE LINE
PROCESSING "LABEL_NO_CLIP=ON"
[...]
LABEL
[...]
PARTIALS TRUE
END
END
mapproxy.yaml
::
caches:
mycache:
meta_buffer: 150
[...]
还有第三种选择。如果需要重复的标签但不需要任何截断的标签,可以设置 PARTIALS FALSE
. 请记住,您将得到与上面提到的相同的网格模式,但如果您将此层与其他点和多边形层混合,其中 PARTIALS
启用。
使用时需要补偿元缓冲区 PARTIALS FALSE
与其他需要元缓冲区的层结合。你需要设置选项 LABELCACHE_MAP_EDGE_BUFFER
到元缓冲区的负值。
WEB
[...]
METADATA
LABELCACHE_MAP_EDGE_BUFFER "-100"
END
END
LAYER
TYPE LINE
[...]
LABEL
[...]
PARTIALS FALSE
END
END
mapproxy.yaml
::
caches:
mycache:
meta_buffer: 100
[...]
所有WMS服务器最重要的一步是禁用标签的动态放置。查看如何为您的WMS服务器执行此操作的文档。
如果您想对本文件作出贡献,请加入我们的 mailing list 或者使用我们的 issue tracker .