为每个图块重复多边形标签


10

我正在使用独立的GeoWebCache从远程GeoServer提供图块。我的问题是,将多边形标签添加到所服务的每个图块中,而不是在多边形质心中仅添加一次。

我找到了一个讨论该问题的帖子:http :
//osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

第一个答复提到了一个可能的解决方案:

“总而言之,我建议无论如何都使用图块渲染引擎(GeoWebCache,MapProxy,TileCache),而不是从GeoServer请求小图像,然后让图块渲染引擎对图块进行切片。发送给GeoServer的请求会更少( 1张大图片,而不是多张小图片),因此可以加快整个切片缓存的创建时间。”

问题是我无法通过参考GeoWebCache文档找到如何做的方法,并且上面提到的文章没有解释实现该方法的方法。

我还找到了一个带有答案的文章,该文章链接到GeoWebCache“ Tiled”文档,但是我的代码已经准备好使用所有必要的属性,并且标签仍然多次显示:

var Layer_1874 = new OpenLayers.Layer.WMS(
    'Grundkort',
    '/wms10.ashx'
    , {
        format: 'image/png',
        srs: 'EPSG:25832',
        layers: 'ballerupkommune_grundkort_bk',
        tiled: true,
        tilesOrigin: '698804,6173460'
    }
    , {
        displayInLayerSwitcher: true,
        isBaseLayer: true,
        transitionEffect: 'resize',
        displayOutsideMaxExtent: true,
        visibility: false
    }
);

有人有主意吗?


您可以向我们显示您正在使用的SLD文件吗?它控制标签在WMS图层上的显示方式。
katahdin 2012年

Answers:


16

下面是一个SLD规则的示例,该规则将标签放置在要素几何的中心。这使用称为“质心”的ogc:Function放置标签。您可以在GeoServer 文档中阅读有关SLD功能的更多信息,并在此处提供一些示例。

<sld:Rule>
      <MaxScaleDenominator>5000</MaxScaleDenominator>
      <sld:TextSymbolizer>
        <sld:Geometry>
          <ogc:Function name="centroid">
            <ogc:PropertyName>the_geom</ogc:PropertyName>
          </ogc:Function>
        </sld:Geometry>
        <sld:Label>
          <ogc:PropertyName>LOT_NAME</ogc:PropertyName>
        </sld:Label>
        <sld:Font>
          <sld:CssParameter name="font-family">Arial</sld:CssParameter>
          <sld:CssParameter name="font-size">11</sld:CssParameter>
          <sld:CssParameter name="font-style">normal</sld:CssParameter>
          <sld:CssParameter name="font-weight">bold</sld:CssParameter>
        </sld:Font>
        <sld:LabelPlacement>
          <sld:PointPlacement>
            <sld:AnchorPoint>
              <sld:AnchorPointX>
                <ogc:Literal>0.0</ogc:Literal>
              </sld:AnchorPointX>
              <sld:AnchorPointY>
                <ogc:Literal>0.5</ogc:Literal>
              </sld:AnchorPointY>
            </sld:AnchorPoint>
            <sld:Rotation>
              <ogc:Literal>0</ogc:Literal>
            </sld:Rotation>
          </sld:PointPlacement>
        </sld:LabelPlacement>
        <sld:Halo>
          <sld:Radius>
            <ogc:Literal>1.0</ogc:Literal>
          </sld:Radius>
          <sld:Fill>
            <sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
          </sld:Fill>
        </sld:Halo>
        <sld:VendorOption name="conflictResolution">true</sld:VendorOption>
        <sld:VendorOption name="goodnessOfFit">0</sld:VendorOption>
        <sld:VendorOption name="autoWrap">60</sld:VendorOption>
      </sld:TextSymbolizer>
    </sld:Rule>

此外,《SLD食谱》是一个很好的参考。可以令您失望的一件事是SLD中标签的顺序。对于上面的TextSymbolizer规则,您可以通过查看架构定义来查看所需的顺序。不用担心,它并不太吓人!只需在该.xsd文件中搜索“ textsymbolizer”,即可轻松找到“ sequence”标签。在此示例中,您会发现元素引用与顺序匹配。(注意:我没有使用文本符号器的“ fill”属性,我的填充仅适用于光晕。)


1

计算具有冲突解决方案的标签(将标签移开或移出优先级较低的标签,以使它们不会重叠)需要了解可能与您正在绘制的标签发生冲突的每个标签,可能与它们发生冲突的每个标签,等等。 。因此,通常来说,您要么需要通过查看每个要素来一次计算所有标签,要么将地图分成带有在每个块内计算的标签的块。

默认情况下,GeoWebCache使用4x4的图块块,称为“元数据”。当您请求不在缓存中的图块时,GWC将从后端请求整个metatile作为一个大映像,然后将该metatile切片为要缓存的图块。您可以在设置图层时调整元因子。较大的分位数会提供更好看的标签,但会增加缓存未命中的延迟。如果您不在后端使用标签冲突解决方案,则可以将metatiling设置为1x1。

您还可以告诉GWC在该分位数周围添加一个装订线,这是将被切断的额外空间。如果您启用了标签碰撞分辨率,则这样做会很冒险,因为标签的位置可能会有所不同,或者甚至完全被移开了元边界的另一侧。如果您的标签完全固定在位置上,并且永远不会被遮挡以避免碰撞,则可以使用宽装订线来使标签越过瓷砖边界。这将导致性能损失,因为GeoServer必须渲染更大的图块。

您可以在图层配置的“平铺图层”选项卡上设置元数据转移和装订线,或者可以在“缓存默认值”页面上设置用于新图层的默认值。

要禁用冲突解决,可以conflictResolution在样式中使用供应商选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.