2.7. 按属性类别显示图层

在上一个示例中,这些层由同一数据集中的一组要素组成,使用相同的样式进行渲染。然而您可能不希望绘制给定数据集中包含的所有要素,或者也可能不希望以相同的方式绘制所有要素。例如,制作一张包含每个数据集的所有道路的世界地图将需要相当长的时间,并且结果地图将太杂乱而不是很有用。同样的符号用于渲染乡村公路和高速公路生成的地图,图形功能之间没有区别;在现实世界中,区别是显而易见的。

2.7.1. 查看地图

类允许您区分基于属性的要素和基于类的要素。上图使用类,因为每个层必须至少有一个类。在最简单的情况下,默认类包括数据集的所有功能。在这种情况下,该层有一个类,该类中的每个要素都以相同的方式渲染。

不过通常希望避免只使用默认类,而是选择分类要素,这是出于前面提到的两个原因:首先,可能不想绘制每个要素,其次,可能希望使用不同的符号、颜色或大小来呈现具有不同属性的某些要素。

通过使用数据中的非空间属性信息,可以创建如下地图:

http://webgis.cn/cgi-bin/mapserv?map=/owg/mfk3.map&layer=country&layer=weq&mode=map

或者:

http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa3.map&layer=states_poly&layer=states_line&mode=map

2.7.2. Mapfile 文件

以下是地图文件MapFile( mfa3.map ):

 1MAP
 2    IMAGETYPE "PNG"
 3    EXTENT -180 -90 180 90
 4    SIZE 600 300
 5    SHAPEPATH "/gdata"
 6    IMAGECOLOR 255 255 255
 7    LAYER
 8        NAME "states_poly"
 9        DATA "wcountry.shp"
10        STATUS OFF
11        TYPE POLYGON
12        CLASSITEM "NAME"
13        CLASS
14            NAME "China"
15            EXPRESSION "CHINA"
16            STYLE
17                COLOR 232 30 30
18            END
19        END
20        CLASS
21            NAME "Others"
22            STYLE
23                COLOR 198 198 255
24            END
25        END
26    END
27    LAYER
28        NAME "states_line"
29        DATA "wcountry.shp"
30        STATUS OFF
31        TYPE LINE
32        CLASSITEM "NAME"
33        CLASS
34            NAME "China Boundary"
35            EXPRESSION "land"
36            STYLE
37                COLOR 32 32 32
38                WIDTH 1
39            END
40        END
41        CLASS
42            NAME "Others Boundary"
43            STYLE
44                COLOR 150 150 150
45                WIDTH 0.4
46            END
47        END
48    END
49END

用于图层分类的 Mapfile

通过对象, Mapfile 的结构如下所示

                                  MAP
      (states_poly) LAYER----------|---------LAYER (states_line)
                      |                      |
       (land) CLASS---|---CLASS (water)      |-CLASS
                  |       |                    |
            STYLE-|       |-STYLE              |-STYLE

文件的更改如下:

Open the file:diff_mfa3_mfa2.html

2.7.3. Mapfile中的属性描述

MapFile仍然只有两个层,但多边形层被细分为两大类。请看一下其他参数:

CLASSITEM "NAME"

此关键字用于指定分离的类对象使用哪些属性。在本例中,该属性为 NAME 。如果打开与该属性相关联的数据库文件的shapefile,将看到有一个名为的列(属性) NAME

使用表达式定义类以确定类包含哪个MapServer的最简单(也是最快)方法是使用字符串比较。可以使用Hierarchy关键字 CLASSITEM 以标识将用于分类功能的属性名称。指定使用类级关键字表示比较字符串。引用字符串以确保正确解释字符是一种很好的做法。这如下面的代码片段所示。 CLASSITEM 属性表示将与数据集的每个功能关联的字符串的值。如果表达式字符串与相同的 CLASSITEM 值,则该函数将包含在此类中。尽管此方法快速且易于使用,但它并不十分灵活,因为必须传递指定的字符串表达式 CLASSITEM 以确定匹配的属性值。

12         CLASSITEM "NAME"
13         CLASS
14             NAME "China"
15             EXPRESSION "CHINA"
16             STYLE
17                 COLOR 232 30 30
18             END
19         END
20         CLASS
21             NAME "Others"
22             STYLE
23                 COLOR 198 198 255
24             END
25         END

Shapefile数据库记录存储在DBF文件中,可以在桌面上打开一个电子表格程序,如OpenOffice.org Compute,或一个地理信息系统软件,如QGIS。如果数据具有元数据(应该如此),则可以从元数据文件的内容中获知它。还可以使用 ogrinfo 要在shapefile中显示基本属性信息,请回顾示例1.1(在最后几行之后,“LayerSRS wkt:”显示属性名称和类型)。

EXPRESSION "CHINA"

对于每个类,指定要使用的特性值。这是最简单的表达形式。表达式可以比这更复杂,允许使用正则比较表达式或逻辑表达式。

2.7.4. 基于比较表达式的分类

允许基于一个或多个属性值的逻辑表达式对更复杂的功能进行分类。 CLASSITEM 不需要指定(实际上,如果到目前为止它将被忽略)。关键字表达式引入逻辑表达式,这些表达式在圆括号中分隔。语法很简单:逻辑表达式由方括号括起的属性名称、比较运算符和值组成。例如,下面的代码将属于总体的值数与值100000进行比较:

EXPRESSION ( [POPULATION] < 100000 )

它将包括人口属性值小于100,000的要素。与C和Perl一样,MapServer对字符串使用不同的比较,也对数字使用不同的比较,必须注意观察差异。如果属性是字符串值,则必须用引号将其引用括起来,并且必须比较这些值。可以使用单引号和双引号,但它们必须匹配。请考虑以下代码:

EXPRESSION ( '[STATE_FIPS]' eq 'MN' )

仅当此值属性为 state_FIPS 等于字符串Mn。逻辑表达式可以使用合取、分隔运算符和或进行组合。请考虑以下示例:

EXPRESSION (( [POPULATION] < 100000 ) and ( '[STATE_FIPS]' eq 'MN' ))

这将匹配人口少于100000的要素 STATE_FIPS 等于MN。

请注意,如果字符串值属性包含数字字符串(例如 "123" )。如果从数值上比较字符串值属性,则永远不会有匹配( 123 永远不会等于 "123" ),并且永远不会有错误,可以了解有关数据类型的更多信息。

请注意,MapServer的Mapfile参考文档有一个拼写错误的数字运算符“Not Equals”,以及 != 不显示感叹号( ! )。

  • 运算符,数据类型

  • != ,数字

  • = ,数字

  • > ,数字

  • < ,数字

  • >= ,数字

  • <= ,数字

  • and ,合乎逻辑

  • or ,合乎逻辑

  • eq ,字符串

  • ge ,字符串

  • gt ,字符串

  • le ,字符串

  • lt ,字符串

  • ne ,字符串

请注意,尽管类必须使用单个方法定义,但每个类都可以在某个级别使用不同的方法。