GetLegendGraphic

本章介绍是否使用GetLegendGraphics请求。SLD规范1.0.0对GetLegendgraphic请求进行了很好的描述:

The GetLegendGraphic operation itself is optional for an SLD-enabled WMS. It provides a general mechanism for acquiring legend symbols, beyond the LegendURL reference of WMS Capabilities. Servers supporting the GetLegendGraphic call might code LegendURL references as GetLegendGraphic for interface consistency. Vendor-specific parameters may be added to GetLegendGraphic requests and all of the usual OGC-interface options and rules apply. No XML-POST method for GetLegendGraphic is presently defined .

下面是一个调用示例:

http://localhost:8080/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states

它将生成四个20x20图标,以图形方式表示topp:states层默认样式的规则。

../../../_images/samplelegend.png

示例图例

下表列出了可以使用的整套GetLegendGraphic参数。

Parameter

Required

Description

REQUEST

要求的

值必须为“GetLegendGraphic”。

LAYER

要求的

用于生成图例图形的层。

STYLE

可选的

要为其生成图例图形的层的样式。如果不存在,则选择默认样式。样式可以是任何可用于层的有效样式,包括非SLD内部定义的样式。

FEATURETYPE

可选的

要为其生成图例图形的功能类型。如果图层只有一种特征类型,则不需要这样做。

RULE

可选的

用于生成图例图形的样式规则(如果适用)。如果一个样式有多个规则,但没有选择特定的规则,那么地图服务器有义务生成一个代表该样式所有规则的图形。

SCALE

可选的

如果没有为样式指定规则,则此参数可以通过消除超出范围的内部规则来帮助服务器选择更合适的代表性图形。该值是第10.2节中定义的标准比例分母。指定比例也将使符号使用测量单位根据指定比例调整大小。

SLD

可选的

此参数指定对外部SLD文档的引用。它的工作方式与wms getmap操作的sld=参数相同。

SLD_BODY

可选的

此参数允许将SLD文档直接包含在HTTP-GET请求中。它的工作方式与wms getmap操作的sld_body=参数相同。

FORMAT

要求的

这将提供用于返回图例图形的文件格式的mime类型。允许的值与WMS GETMAP请求的FORMAT=参数相同。

WIDTH

可选的

这将以像素为单位提示返回图形的宽度。矢量图形可以使用该值作为要包括的详细程度的提示。

HEIGHT

可选的

这将以像素为单位提示返回图形的高度。

EXCEPTIONS

可选的

这将给出返回异常的格式的mime类型。允许的值与wms getmap请求的exceptions=参数相同。

LANGUAGE

可选的

允许为样式标题和规则标题设置标签语言;需要正确本地化的SLD才能正常工作;如果所请求的语言中没有标签,将使用默认文本;请查看 SLD中的I18N 更多详情。

使用图例选项控制图例外观

geoserver允许通过vendor参数更好地控制图例外观 LEGEND_OPTIONS .一般格式 LEGEND_OPTIONS 是一样的 FORMAT_OPTIONS ,即:

...&LEGEND_OPTIONS=key1:v1;key2:v2;...;keyn:vn

以下是可用于 LEGEND_OPTIONS

  • 字体名(字符串) 生成规则标题时要使用的字体的名称。字体必须在服务器上可用

  • 字体样式(字符串) 可以设置为斜体或粗体来控制文本样式。现在不允许使用其他组合,但我们也可以实现它。

  • 字体大小(整数) 允许我们为各种文本元素设置字体大小。请注意,默认大小为12。

  • 字体颜色(十六进制) 允许我们为规则和标签的文本设置颜色(有关如何创建值的建议,请参阅上文)。数值表示为 0xRRGGBB 格式

  • fontAntiAliasing (true/false) 如果为true,则为规则标题启用抗锯齿

  • bgcolor(十六进制) 生成的图例的背景色,值以 0xRRGGBB 格式

  • dpi(整数) 为当前请求设置dpi,方法与getmap支持的方法相同。将dpi设置为大于91(默认值)会使所有字体、符号和线条宽度在不更改当前比例的情况下增大,从而使获得适合打印输出的高分辨率图例版本成为可能。

  • 力标签 “on”表示始终绘制标签,即使只有一个规则可用。“关闭”表示即使有多个规则可用,也不会绘制标签。默认关闭。

  • 强制所有权 “关闭”表示不会为图层组绘制图层标题。默认打开。

  • 标签页边距 在图标和标签之间使用的边距(像素)。

  • 布局 将图标布局设置为 垂直的 (默认)或 水平的 .

  • 柱高度 使能够 多列 布局为时的布局 垂直的 .每个列的高度都受列高度值(像素)的限制。

  • 行宽 使能够 多行 布局为时的布局 水平的 .每行宽度都受行宽度值的限制(以像素为单位)。

  • 使能够 多列 布局为时的布局 垂直的 .该值是图例的最大列数。使用的行等于下一个更大的整数<total of icons>/<number of columns>。

  • rows 使能够 多行 布局为时的布局 水平的 . 该值是图例的最大行数。使用的列等于下一个大整数<total of icons>/<number of rows>。

  • 组布局 层组的方向,可能的值为 水平的垂直的 (未指定默认值)。

  • 计数匹配 设置为true时,在每个标签的末尾添加当前映射中与该规则匹配的特征数。需要额外参数,请参阅 dedicated section .

  • 隐匿 如果设置为“真”,则隐藏与任何特征都不匹配的规则。

  • wrap 设置为True时,Word会换行较长的图例标签,从而导致图例较高但较小。

  • wrap_limit 设置后,它会用指定像素数对图例标签进行换行。

以下是一个示例请求,展示了大多数选项:

http://localhost:8080/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states&legend_options=fontName:Times%20New%20Roman;fontAntiAliasing:true;fontColor:0x000033;fontSize:14;bgColor:0xFFFFEE;dpi:180
../../../_images/legendoptions.png

Using LEGEND_OPTIONS to control the output

控制图例布局

一组图例选项键用于控制生成的图例图像中的图标布局。尤其是, 垂直的水平的 可以选择布局。

多列或多行布局是可能的,由ColumnHeight/RowWidth选项(限制每个列/行的大小)或Columns/Rows选项(固定要使用的列/行的大小)控制。

columnhight/columns和rowwidth/rows都可以用来限制生成的图像的整个大小(如果某些图标不符合给定的限制,则会跳过这些图标)。

此外,可以使用GroupLayout选项配置图层组中图例的方向。

栅格图例说明

本章旨在简要介绍我所做的工作,以支持栅格数据的图例,这些数据从SLD 1.0rastersymboler元素的各个位提取信息。回想一下,到目前为止还没有办法为栅格数据创建图例,因此我们试图通过提供getLegendGraphic请求的实现来填补这个空白,该请求将与SLD 1.0 RasterSymboler的ColorMap元素一起工作。请注意,一些关于样式的“调试”信息,如colormap type和band used也会被打印出来。

什么是栅格图例

下面我画了一个典型的图例的结构,其中一些感兴趣的元素是参数化的。

../../../_images/rasterlegend1.png

典型传说的结构

以本页附带的SLD文件之一为例,上表中的每一行都从colormapentry元素中提取其精华,如下所示:

<ColorMapEntry color="#732600" quantity="9888" opacity="1.0" label="<-70 mm"/>

栅格图例的制作者将使用这些元素来构建图例,请注意:

  • 颜色元素的宽度由GetLegendGraphic请求的请求宽度驱动。

  • 标签和规则的宽度和高度根据所用的字体和字体大小进行计算。( 目前没有新线管理

  • 颜色元素的高度由GetLegendgraphic请求的宽度决定,但请注意,对于渐变,我们稍微扩展了一点,因为目标是将各种颜色元素转换为单个长条带。

  • 每行的高度设置为单个元素的最大高度

  • 每行的宽度设置为不同元素的宽度加上各种填充的总和。

  • Dx和Dy 元素和行之间的间距被设置为请求宽度和高度的15%。注意到 dy 对于类型的颜色映射忽略 ramp 因为它们必须创建一个连续的色带。

  • 绝对蛋白 真/假,用于更改 dx 从百分比(如果为假)到固定像素数(如果为真)。

  • MX,我的 图例边框的边距设置为图例总大小的1.5%。

总之,下面我将添加一个图例示例的图像,其中包含所有工作中的各种选项。生成它的请求如下:

http://localhost:8081/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=100&HEIGHT=20&LAYER=it.geosolutions:di08031_da&LEGEND_OPTIONS=forceRule:True;dx:0.2;dy:0.2;mx:0.2;my:0.2;fontStyle:bold;borderColor:0000ff;border:true;fontColor:ff0000;fontSize:18

别担心,如果它看起来像是用古老的死语写的,我将在下面解释各种参数。

../../../_images/rasterlegend2.png

栅格图例示例

栅格图例类型

正如您可能知道的(实际上,由于我从未写过任何关于RasterSymbolar工作的真实文档),GeoServer支持三种类型的颜色映射:

  • ramp 这就是SLD 1.0所规定的,这意味着对各种颜色映射项之间的值进行加权的线性插值。

  • 价值观 这是一个扩展,允许将数量链接到ColorMapEntries数量指定的颜色。未指定的值将转换为透明像素。

  • 这是一个扩展,允许基于从ColorMapEntries数量创建的间隔进行纯分类。未指定的值将转换为透明像素。

下面我将列出在雨量浮点geotiff上使用附加样式的各种示例。

颜色映射类型是值

请参阅附件中的sld rainth.sld。

../../../_images/rasterlegend3.png

Raster legend - VALUES type

颜色映射类型为类

参见附件中的SLD降雨等级。

../../../_images/rasterlegend4.png

Raster legend - CLASSES type

颜色映射类型为渐变

参考SLD降雨量_类.sld在附件中。请注意,第一个图例显示默认的边框行为,而第二个图例被迫为呈现文本所描述的colormap条目数量的断点颜色绘制边框。注意,每个颜色元素都有一个部分,该部分显示它所描述的colormap条目中的固定颜色(它的最低部分,下面第二个图例中的边框勾勒出的元素),而元素的上部有一个渐变,将每个元素连接到上一个元素,以指出我们使用线性插值的事实。

../../../_images/rasterlegend5.png

Raster legend - RAMP type

各种控制参数及设置方法

现在,我将简要说明可用于控制图例布局和内容的各种参数。这里显示了一个放置所有各种选项的请求:

http://localhost:8081/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=100&HEIGHT=20&LAYER=it.geosolutions:di08031_da&LEGEND_OPTIONS=forceRule:True;dx:0.2;dy:0.2;mx:0.2;my:0.2;fontStyle:bold;borderColor:0000ff;border:true;fontColor:ff0000;fontSize:18

现在让我们逐个检查所有有趣的元素。请注意,我不会讨论GetLegendgraphic操作的机制,因为您可能希望参考SLD 1.0规范,我的目标是简要讨论Legend_选项参数。

  • 强制规则(布尔值) 默认情况下,除非完全没有标签,否则不会绘制颜色映射项的规则来保持图例的小和紧凑。您可以通过将此参数设置为true来更改此行为。

  • dx,dy,mx,my(双) 可用于设置元素之间的边距和缓冲区

  • 边框(布尔值) 激活或取消激活颜色元素上的边框,以便使分隔更清晰。注意到我决定 总是 有一条线可以分割颜色映射的渐变类型的各种颜色元素。

  • 边框颜色(十六进制) 允许我们将边框的颜色设置为0xrrggbb格式

cql表达式和env

如果在ColorMapEntry属性中使用CQL表达式(请参见 here )要创建从env获取值的动态颜色映射,可以将用于get map的相同env参数指定给getlegendgraphic以获取所需的图例项。

与内容相关的图例

geoserver允许构建内容相关的图例,即其内容依赖于当前显示的地图的图例。为了支持它,getlegendgraphic调用需要以下额外参数:

  • BBOX

  • SRS或CRS(取决于WMS版本,SRS用于1.1.1,CRS用于1.3.0)

  • SRCWIDTH和SRCHEIGHT,引用映射的大小(宽度和高度在GetLegendGraphic中已经有不同的含义)

还可以添加其他参数以更好地匹配getmap请求,例如,建议镜像筛选供应商参数,例如,cql_filter、filter、featureid、time、elevation。

通过以下图例选项参数启用内容相关评估:

  • CountMatched:在规则标签的末尾添加与特定规则匹配的功能数(需要可见标签才能工作)。仅适用于矢量层。

  • hideEmptyRules:隐藏与任何功能都不匹配的规则。仅当countMatched为true时才适用。

例如,假设将以下布局添加到geoserver (legend.xml 放置在 GEOSERVER_DATA_DIR/layouts ):

<layout>
    <decoration type="legend" affinity="top,right" offset="0,0" size="auto"/>
</layout>

这将使一个图例显示在getmap响应中。以下预览请求使用布局嵌入图例并激活其中的功能计数:

http://localhost:8080/geoserver/topp/wms?service=WMS&version=1.1.0&request=GetMap&layers=topp:states&styles=&bbox=-124.73142200000001,24.955967,-66.969849,49.371735&width=768&height=330&srs=EPSG:4326&format=application/openlayers&format_options=layout:legend&legend_options=countMatched:true;fontAntiAliasing:true

结果如下:

../../../_images/states-all.png

嵌入的图例,完整映射

../../../_images/states-four.png

嵌入的图例,四种状态

../../../_images/states-one.png

嵌入式图例,单状态

../../../_images/states-one-hide-empty.png

嵌入图例,单个状态,隐藏空规则

使用独立的getlegendgraphic请求也可以实现这一点:

http://localhost:8080/geoserver/topp/wms?service=WMS&version=1.1.0&request=GetLegendGraphic&width=20&height=20&layer=topp:states&bbox=-124.73142200000001,24.955967,-66.969849,49.371735&srcwidth=768&srcheight=330&srs=EPSG:4326&format=image/png&legend_options=countMatched:true;fontAntiAliasing:true
../../../_images/legend-all.png

直接图例请求

或者使用独立的GetLegendGraphic请求隐藏空规则:

http://localhost:8080/geoserver/topp/wms?service=WMS&version=1.1.0&request=GetLegendGraphic&width=20&height=20&layer=topp:states&bbox=-101.0028076171875,31.025390625,-96.7840576171875,32.838134765625&srcwidth=768&srcheight=330&srs=EPSG:4326&format=image/png&legend_options=countMatched:true;fontAntiAliasing:true;hideEmptyRules:true
../../../_images/legend-not-empty.png

直接图例请求

JSON输出格式

从2.15.0版开始,就可以使用 application/json 作为GetLegendgraphic请求中的输出格式。这允许支持JSON的客户机接收图例图形的JSON表示,以用于其自身的呈现需求。

可以使用简单的HTTP请求::

http://localhost:9000/geoserver/wms?service=WMS&version=1.1.0&request=GetLegendGraphic&layer=topp:states&format=application/json

返回JSON响应:

{"Legend": [{
  "layerName": "states",
  "title": "USA Population",
  "rules":   [
        {
      "title": "< 2M",
      "filter": "[PERSONS < '2000000']",
      "symbolizers": [{"Polygon":       {
        "fill": "#4DFF4D",
        "fill-opacity": "0.7"
      }}]
    },
        {
      "title": "2M - 4M",
      "filter": "[PERSONS BETWEEN '2000000' AND '4000000']",
      "symbolizers": [{"Polygon":       {
        "fill": "#FF4D4D",
        "fill-opacity": "0.7"
      }}]
    },
        {
      "title": "> 4M",
      "filter": "[PERSONS > '4000000']",
      "symbolizers": [{"Polygon":       {
        "fill": "#4D4DFF",
        "fill-opacity": "0.7"
      }}]
    },
        {
      "title": "Boundary",
      "symbolizers":       [
        {"Line":         {
          "stroke": "#000000",
          "stroke-width": "0.2",
          "stroke-opacity": "1",
          "stroke-linecap": "butt",
          "stroke-linejoin": "miter"
        }},
        {"Text":         {
          "label": "[STATE_ABBR]",
          "fonts": [          {
            "font-family": ["Times New Roman"],
            "font-style": "Normal",
            "font-weight": "normal",
            "font-size": "14"
          }],
          "label-placement":           {
            "x-anchor": "0.5",
            "y-anchor": "0.5",
            "rotation": "0.0"
          }
        }}
      ]
    }
  ]
}]}

这个JSON包含一个图例数组(每个请求的层对应一个),每个图例包含一些关于该图例的元数据和一个 rule 样式的要素类型中每个规则的对象。每个 rule 包含与规则关联的元数据,任何 filter 元素和数组 symbolizer 物体。

筛选器和表达式

过滤器编码使用 ECQL ,具有elsefilter的规则将元素“elsefilter”设置为值“true”。在样式中遇到表达式时,表达式也在ECQL中编码(包装在[]中)。

符号

  • PointSymbolizer

    点符号将表示为一系列包含元数据和 graphics 符号(参见 here )这些都是众所周知的 marks 或外部图形。点符号器还提供一个“URL”元素,允许客户端向GeoServer发出请求,以获取点符号的PNG图像。

    {"Point":     {
        "title": "title",
        "abstract": "abstract",
        "url": "http://localhost:9000/geoserver/kml/icon/capitals?0.0.0=",
        "size": "6",
        "opacity": "1.0",
        "rotation": "0.0",
        "graphics": [      {
          "mark": "circle",
          "fill": "#FFFFFF",
          "fill-opacity": "1.0",
          "stroke": "#000000",
          "stroke-width": "2",
          "stroke-opacity": "1",
          "stroke-linecap": "butt",
          "stroke-linejoin": "miter"
        }]}}
    
  • LineSymbolizer

    行符号表示为元数据元素列表,并且 stroke parameters ,有可能有一个 graphic-stroke 元素也是。

    {"Line":     {
      "stroke": "#AA3333",
      "stroke-width": "2",
      "stroke-opacity": "1",
      "stroke-linecap": "butt",
      "stroke-linejoin": "miter"
    }}
    
    
    {"Line":       {
        "graphic-stroke":         {
          "url": "http://local-test:8080/geoserver/kml/icon/Default Styler",
          "size": "6",
          "opacity": "0.4",
          "rotation": "[(rotation*-1)]",
          "graphics": [          {
            "mark": "square",
            "fill": "#FFFF00",
            "fill-opacity": "1.0"
          }]
        },
        "stroke-opacity": "1",
        "stroke-linecap": "butt",
        "stroke-linejoin": "miter",
        "perpendicular-offset": "10"
      }}
    
  • PolygonSymbolizer

    多边形符号包含 stroke parametersfill parameters .

    {"Polygon":       {
      "stroke": "#000000",
      "stroke-width": "0.5",
      "stroke-opacity": "1",
      "stroke-linecap": "butt",
      "stroke-linejoin": "miter",
      "fill": "#0099CC",
      "fill-opacity": "1.0"
    }}
    

    或图形笔划和/或图形填充(如上所述)。

    {"Polygon":       {
      "graphic-stroke":         {
        "url": "http://local-test:8080/geoserver/kml/icon/Default Styler",
        "size": "6",
        "opacity": "0.4",
        "rotation": "[(rotation*-1)]",
        "graphics": [          {
          "mark": "square",
          "fill": "#FFFF00",
          "fill-opacity": "1.0"
        }]
      },
      "stroke-opacity": "1",
      "stroke-linecap": "butt",
      "stroke-linejoin": "miter",
      "graphic-fill":         {
        "url": "http://local-test:8080/geoserver/kml/icon/Default Styler",
        "size": "4",
        "opacity": "0.4",
        "rotation": "[(rotation*-1)]",
        "graphics": [          {
          "mark": "circle",
          "fill": "#FFFFFF",
          "fill-opacity": "1.0"
        }]
      }}}
    
  • RasterSymbolizer

    栅格符号包含 colormap 有一个数组 entries ,每个条目包含 labelquantitycolor 元素。

    {"Raster":   {
      "colormap":     {
        "entries":       [
                  {
            "label": "values",
            "quantity": "0",
            "color": "#AAFFAA"
          },
                  {
            "quantity": "1000",
            "color": "#00FF00"
          },
                  {
            "label": "values",
            "quantity": "1200",
            "color": "#FFFF00"
          },
                  {
            "label": "values",
            "quantity": "1400",
            "color": "#FF7F00"
          },
                  {
            "label": "values",
            "quantity": "1600",
            "color": "#BF7F3F"
          },
                  {
            "label": "values",
            "quantity": "2000",
            "color": "#000000"
          }
        ],
        "type": "ramp"
      },
      "opacity": "1.0"
    }}
    
  • TextSymbolizer

    文本符号包含 label 表达式,后跟一个数组 fonts 和A label-placement 包含如何放置标签的详细信息的对象。

    {"Text":         {
            "label": "[STATE_ABBR]",
            "fonts": [          {
                    "font-family": ["Times New Roman"],
                    "font-style": "Normal",
                    "font-weight": "normal",
                    "font-size": "14"
            }],
            "label-placement":           {
                    "x-anchor": "0.5",
                    "y-anchor": "0.5",
                    "rotation": "0.0"
            }
    }}
    

供应商选项

如果符号中包含一个或多个供应商选项,则 vendor-options 输出中包含的元素。此对象将为每个供应商选项包含一行。

"vendor-options": {
  "labelAllGroup": "true",
  "spaceAround": "10",
  "followLine": "true",
  "autoWrap": "50"
}