动态图表

作者

托马斯堡

联系

gmail.com的thomas.bonfort

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-04-15

从5.0版开始,MapServer包括自动绘制饼图或条形图的能力,这些饼图或条形图的值是根据数据源的属性获取和调整的。

../_images/pie-chart-na.png

本文档假设您已经熟悉MapServer应用程序开发,尤其是设置 mapfiles . 您也可以查看 Vector Data Access Guide 其中有许多关于如何访问特定数据源的示例。

安装程序

支持的渲染器

动态图表通过 AGG 渲染器(用于PNG输出)和cairo渲染器(用于PDF和SVG输出)用于MapServer 7和更高版本,因为在MapServer 7.0版本中删除了GD渲染器;MapServer 5和6版本支持GD和 AGG 动态图表的渲染器。

尝试使用不受支持的呈现器添加图表层将导致未定义的行为。使用gd渲染器(如果使用的是MapServer 5或6)渲染质量低于最佳值,特别是对于小图,这是因为缺少子像素渲染功能。

来自agg和gd渲染器的输出

映射服务器聚合呈现

../_images/renderer-agg.png

MapServer GD呈现

../_images/gd-renderer.png

向 Mapfile 添加图表层

层式

新类型的层已添加到映射文件语法中。要指定图表层,请使用

LAYER
...
    TYPE CHART
    ...
END

没有添加其他特定的关键字,以便在mapfile语法中将不同关键字的数量保持在最小,因此所有图表特定的配置都由处理指令决定。

指定每个图表的大小

每个图表的大小由chart_size指令指定。如果为该参数指定了两个值,则将指定每个图表的宽度和高度(这仅适用于条形图)。默认情况下,图表为20x20像素。

LAYER
    TYPE CHART
    PROCESSING "CHART_SIZE=21" # specify size of the chart for pie or bar graphs
    #PROCESSING "CHART_SIZE=20 10" # specify width and height for bar graphs
    ...
END

饼图的直径可以使用图表大小范围处理属性绑定到属性:

PROCESSING "CHART_SIZE_RANGE = itemname minsize maxsize minval maxval exponent"

或者只是

PROCESSING "CHART_SIZE_RANGE = itemname"

在哪里?

  • itemname是驱动图表大小的属性的名称(例如,总销售额)

  • minSize和maxSize是以像素为单位的最小和最大图表大小值(例如“10 100”)。

  • minval和maxval是与minSize和maxSize的图表大小相对应的属性的最小值(例如1000000)。

  • 指数(可选)将指数因子应用于直径,计算公式为:

    diameter=mindiameter +
       pow((attribute_value-minvalue)/(maxvalue-minvalue),1.0/exponent)*
       (maxdiameter-mindiameter);
    

如果属性值小于“minval”,则图表大小将为minSize像素;如果属性值大于maxval,则图表大小将为maxSize像素。

指定要绘制的值

要绘制的每个值(即饼图中的一个切片或par图中的一个条形图)都在图表层的类中指定。要绘制的值取自类的第一个样式块的大小关键字。这在语义上有点笨拙,但在mapfile语法中,将不同关键字的数量保持在最小。当然,给size关键字指定的值可以是静态值,但是动态图表只对属性绑定有意义。

LAYER
...
    CLASS
        # include a NAME keyword if you want this class to be included
        # in the legend
        NAME "value 1"
        STYLE
            # specify which value from the data source will be used as the
            # value for the graph
            SIZE [attribute]
            ...
        END
    END
    CLASS
        ...
    END
...
END

必须至少指定2个类块才能绘制图表(但如果您希望图表至少传达这一点,您已经知道这一点 some 信息)。

指定样式

图表中每个值的样式由常用的mapserver语法指定。每个类只支持一种样式,任何其他样式块都将被静默忽略。仅支持样式关键字的子集:

STYLE
    SIZE [attribute]
    # specify the fill color
    COLOR r g b

    # if present will draw an outline around the corresponding bar or slice
    OUTLINECOLOR r g b

    #specify the width of the outline if OUTLINECOLOR is present (defaults to 1)
    WIDTH w

    # only for pie charts. 'a' is the number of pixels the corresponding
    # slice will be offset relative to the center of the pie. This is useful
    # for emphasizing a specific value in each chart. 'b' is required by the
    # mapfile parser but is ignored.
    OFFSET a b
END

饼图

这是呈现的图表的默认类型。也可以在图层属性中使用处理关键字进行特殊设置:

PROCESSING "CHART_TYPE=PIE"

对于层数据源中的每个形状,样式大小用于设置每个饼图切片的相对大小(值),其中自动计算切片的角度以形成完整的饼图。例如:

 1LAYER
 2    NAME "Ages"
 3    TYPE CHART
 4    CONNECTIONTYPE postgis
 5    CONNECTION "blabla"
 6    DATA "the_geom from demo"
 7    PROCESSING "CHART_TYPE=pie"
 8    PROCESSING "CHART_SIZE=30"
 9    STATUS ON
10    CLASS
11        NAME "Population Age 0-19"
12        STYLE
13            SIZE [v1006]
14            COLOR 255 244 237
15        END
16    END
17    CLASS
18        NAME "Population Age 20-39"
19        STYLE
20            SIZE [v1007]
21            COLOR 255 217 191
22        END
23    END
24    CLASS
25        NAME "Population Age 40-59"
26        STYLE
27            SIZE [v1008]
28            COLOR 255 186 140
29        END
30    END
31END

在上面的示例中,如果给定形状的v1006=1000、v1007=600和v1008=400,则每个类的实际饼图切片将分别为总饼图大小的50%、30%和20%。

饼图表达式

表达式可在类中用于为层生成饼图。这最好通过一个例子来解释。假设我们有3个多边形,具有以下裁剪类型属性:

ID

NAME

TYPE

1

多边形1

玉米、大米

2

多边形2

小麦

3

多边形3

水稻、玉米、小麦

我们可以使用表达式为每种作物类型指定特定的颜色,例如:

LAYER
  NAME "pie-charts"
  TYPE CHART
  STATUS ON
  DATA "croptype.shp"
  PROCESSING "ITEMS=TYPE"
  PROCESSING "CHART_TYPE=pie"
  PROCESSING "CHART_SIZE=70"
  CLASSITEM "TYPE"
  CLASS
    NAME "corn"
    EXPRESSION /(^|,)corn($|,)/
    STYLE
      SIZE 1
      COLOR 255 0 0
    END
  END
  CLASS
    NAME "wheat"
    EXPRESSION /(^|,)wheat($|,)/
    STYLE
      SIZE 1
      COLOR 0 255 0
    END
  END
  CLASS
    NAME "rice"
    EXPRESSION /(^|,)rice($|,)/
    STYLE
      SIZE 1
      COLOR 0 0 255
    END
  END
END # layer
../_images/pie-chart-expressions.png

有关使用表达式执行映射文件的更多示例,请参阅 msautotest suite

备注

饼图的大小实际上是通过以下方式设置的:处理“图表大小=70”,而不是通过类内的样式。

条形图

条形图绘制在图层属性中设置处理关键字:

PROCESSING "CHART_TYPE=BAR"

对于层数据源中的每个形状,样式大小用于设置图形中每个条形图的相对大小(值)。默认情况下,每个条形图的垂直轴按相应形状的值缩放,并且始终包括原点(=0)。例如

  • 样式大小包含值5、8、10、3的形状将绘制在垂直轴跨度为0到10的图表上。

  • 其样式大小包含值-5、-8、-10、-3的形状将绘制在其垂直轴跨度为-10到0的图表上。

  • 其样式大小包含值-5、-8、10、3的形状将绘制在其垂直轴跨度为-8到10的图表上。

其他处理指令用于可选地指定垂直轴的边界,以便可以以相同的比例绘制所有形状的图形:

PROCESSING "CHART_BAR_MINVAL=val"
PROCESSING "CHART_BAR_MAXVAL=val"

数据源中高于图表条形图最大值或低于图表条形图最小值的值将分别剪切到这些值。如果只包含这些指令中的一个,则另一个指令将自动针对每个形状进行调整,以至少包含原点,即所有形状的图形将处于相同的比例。 only if 所有值都是相同的符号(正或负)。

堆积条形图

堆叠条形图可使用以下方法绘制:

PROCESSING "CHART_TYPE=VBAR"