GeoServer:如何仅为图层属性的外边界创建标签位置(水平和垂直)

时间:2018-04-06 15:12:08

标签: geoserver

我有包含Polygon Grid.I属性的网格shapefile。我导入到GeoServer并创建了网格图层。对于图层的样式,我创建了带有LabelPlacement的SLD文件,其中包含锚点X和Y标记的位置显示在多边形的中间。它工作正常。 以下是SLD风格:

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0" 
 xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
 xmlns="http://www.opengis.net/sld" 
 xmlns:ogc="http://www.opengis.net/ogc" 
 xmlns:xlink="http://www.w3.org/1999/xlink" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a Named Layer is the basic building block of an SLD document -->
  <NamedLayer>
    <Name>default_polygon</Name>
    <UserStyle>
    <!-- Styles can have names, titles and abstracts -->
      <Title>Default Polygon</Title>
      <Abstract>A sample style that draws a polygon</Abstract>
      <!-- FeatureTypeStyles describe how to render different features -->
      <!-- A FeatureTypeStyle for rendering polygons -->
      <FeatureTypeStyle>
        <Rule>
          <Name>rule1</Name>
          <Title>Gray Polygon with Black Outline</Title>
          <Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>

          <PolygonSymbolizer>
            <Stroke>
              <CssParameter name="stroke">#0000FF</CssParameter>
              <CssParameter name="stroke-width">1.5</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
          <TextSymbolizer>
            <Label>
              0<ogc:PropertyName>TWP</ogc:PropertyName>-0<ogc:PropertyName>RGE</ogc:PropertyName>W<ogc:PropertyName>M</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Times New Roman</CssParameter>
              <CssParameter name="font-style">Normal</CssParameter>
              <CssParameter name="font-size">14</CssParameter>
            </Font>

            <LabelPlacement>
              <PointPlacement>
                <AnchorPoint>
                  <AnchorPointX>0.5</AnchorPointX>
                  <AnchorPointY>0.5</AnchorPointY>
                </AnchorPoint>
              </PointPlacement>
            </LabelPlacement>
           <!-- 
            <Displacement>
                <DisplacementX>25</DisplacementX>
                <DisplacementY>0</DisplacementY>
            </Displacement>
            -->

            <Fill>
               <CssParameter name="fill">#0000FF</CssParameter>
            </Fill>

          </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

获得输出是:

enter image description here

但是如何从图层属性中仅为网格的外边界指定标签水平和垂直。我想要像以下图像一样标记:

enter image description here

我试过标签Displacement和AnchorPoint。不知道如何创建(水平和垂直标签)。

请,任何帮助。

1 个答案:

答案 0 :(得分:1)

这很难(也可能是不可能的),GeoServer会尝试(默认情况下)在其中心(或指定的几何体)标记每个要素,因此您首先需要设计一个过滤器,强制它仅标记要素在地图的边缘。您可能希望使用predefined variable wms_bbox,它会为您提供地图外部的位置。

接下来,您需要计算标签的位置,这将是您要标记的要素与wms边界框之间的某种交集。在这里,您需要确定您是在顶部,底部,左侧还是右侧,并相应地调整标签位置。为此,您可以使用functions个范围。我怀疑您需要if_then_elseenv函数来获取上面的边界框变量以及spatial functions以确定您的位置,最后创建geometric functions新几何。

前一段时间geoserver-user的邮件列表上有一个discussion,这个question on gis.stackexchange.com是相关的,但我不认为其中任何一个都能得出一个好的结论。