WMS标记

渲染矢量图的平铺通常会导致标签被截断或重复。其中一些问题可以通过正确配置maproxy来解决,但有些问题需要更改源WMS服务器的配置。

本文档描述了maproxy和mapserver的设置,但这些问题和解决方案也适用于其他WMS服务器。请参阅他们的文档,了解如何配置这些设置。

问题

maproxy总是使用小的图块进行缓存。maproxy不将传入请求传递给源wms 1, 但它总是请求与内部网格对齐的图像/图块。maproxy为WMS请求和分块请求(tms/kml)组合、缩放和重新投影这些分块,客户机(openlayers等)组合这些分块。

1

除了未缓存的级联WMS请求。

组合切片时,边界处的文本标签需要同时出现在两个切片上,并且需要放置在完全相同的(地理)位置。

这里有三个常见问题。

不在bbox外放置

WMS服务器不绘制地图边界之外的功能。例如,延伸到相邻地图图块中的城市标签不会绘制在另一个图块中,因为城市的地理特征(单点)只存在于一个图块中。

_images/labeling-no-placement.png

动态标签放置

WMS服务器可以调整标签的位置,以便在地图上放置更多的标签。例如,城市标签并不总是显示在同一地理位置,而是移动以适应请求的地图或为其他标签留出空间。

_images/labeling-dynamic.png

重复标签

WMS服务器为每个请求中的多边形区域呈现标签。大面积的标签将重复多次,每次贴一次。

_images/labeling-repeated.png

映射代理选项

有两个选项可以帮助解决这些问题。

元瓦片

您可以使用meta-tiles来减少标签问题。元图块是多个图块的集合。maproxy不是用单个请求请求请求每个图块,而是请求覆盖多个图块区域的单个图像,然后将响应拆分为实际图块。

下图显示:

_images/labeling-metatiling.png

细线代表切片。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之外没有放置。

_images/labeling-meta-buffer.png

您可以将元平铺和元缓冲区结合起来。然后,maproxy使用配置的缓冲区扩展整个meta-tile。

100的元缓冲区将在请求的每个边缘添加100个像素。元大小为4x4,平铺大小为256x256,请求的图像从1024x1024扩展到1224x1224。BBOX也被扩展以适应新的地理范围。

_images/labeling-metatiling-buffer.png

要解决第一个问题,该值至少应为最长标签的一半:如果文本标签宽度高达200像素,则应使用大约120像素的元缓冲区。

您可以在 globals.cache 截面图和每个截面图 cache . 它默认为 80 . ::

globals:
  cache:
    meta_buffer: 100

caches:
  mycache:
    sources: [...]
    grids: [...]
    meta_buffer: 150

WMS服务器选项

您可以使用meta-tiling减少一些标签问题,并使用meta缓冲区解决第一个问题。动态和重复标记的问题需要对WMS服务器进行一些更改。

通常,需要禁用标签的动态位置,并且需要允许呈现部分标签。

MapServer选项

MapServer有很多影响渲染的设置。两个最重要的设置是

PROCESSING "LABEL_NO_CLIP=ON"LAYER 配置。

使用此选项,标签将固定到整个要素,而不仅仅是当前地图请求中可见的要素部分。默认关闭。

PARTIALSLABEL 配置。

如果此选项为真,则标签将呈现在映射请求的边界之外。默认值为true。

PARTIAL FALSE

解决所有问题的最简单方法是 PARTIAL FALSE 元缓冲区为0。这可以防止任何标签被截断,但它有一个很大的缺点:因为在元图块的边界上没有显示标签,所以您将拥有完全没有标签的区域。这些区域在地图上形成了明显的网格图案。

以下图片演示了一个WMS请求,中间有一个元图块边界。

_images/labeling-partial-false.png

您可以通过为每种类型的几何图形设置正确的配置选项来改进这一点。

如上所述,您可以使用元缓冲区来防止丢失标签。你需要设置 PARTIALS TRUE (默认设置),并配置足够大的元缓冲区。每个请求都需要将标签放置在同一位置。您可以使用配置 POSITION 选项。默认值为 auto 你应该把它设置成一个显式的值, ccuc 例如。

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将标签始终放置在固定位置,即使该位置在当前地图请求之外。

_images/labeling-no-clip.png

如果 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服务器最重要的一步是禁用标签的动态放置。查看如何为您的WMS服务器执行此操作的文档。

如果您想对本文件作出贡献,请加入我们的 mailing list 或者使用我们的 issue tracker .