按属性类别显示图层

在前面的例子中,图层由一组来自相同的数据集的特征组成,使用同样的样式来呈现。然而,你可能不希望绘制的所有特征包含在一个给定的数据集,或者您可能不希望以同样的方式绘制的所有特征。例如,使每一个数据集,包含所有公路的世界地图将需要相当长的时间并且产生的地图过于杂乱以至于不是太有用的。同样使用相同的符号,渲染乡村道路与高速公路方式产生的地图,图形功能之间无法区分;而在现实世界上,这种区别是很明显的。

查看地图

类允许你基于属性的区分功能和基于类区分特征。前面的图使用类,因为每一层都必须至少有一个类。最简单的,默认的类包括数据集的每一个特征。在这种情况下,该层具有一个类并且在这个类中的每一个特征以同样的方式呈现。

然而,你通常希望避免只使用默认的类,并转而选择分类特征,前面提到的两个原因: 首先,你可能不希望绘制每一个特征,第二,你可能想用不同的符号,颜色或尺寸呈现属性不同的某些特征。

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

或者是:

地图文件

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

01 MAP
02     IMAGETYPE "PNG"
03     EXTENT -180 -90 180 90
04     SIZE 600 300
05     SHAPEPATH "/gdata"
06     IMAGECOLOR 255 255 255
07     LAYER
08         NAME "states_poly"
09         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
49 END

图层分类的 Mapfile

地图文件的结构,通过对象,看起来这样

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

文件变动如下:

7    LAYER7    LAYER
n8        NAME "world-country"n8        NAME "states_poly"
9        DATA "wcountry.shp"9        DATA "wcountry.shp"
11        TYPE POLYGON11        TYPE POLYGON
nn12        CLASSITEM "NAME"
12        CLASS13        CLASS
n13            NAME "States"n14            NAME "China"
15            EXPRESSION "CHINA"
14            STYLE16            STYLE
n15                COLOR 232 232 232n17                COLOR 232 330
18            END
19        END
20        CLASS
21            NAME "Others"
22            STYLE
23                COLOR 198 198 255
16            END24            END
19    LAYER27    LAYER
n20        NAME "country-line"n28        NAME "states_line"
21        DATA "wcountry.shp"29        DATA "wcountry.shp"
23        TYPE LINE31        TYPE LINE
nn32        CLASSITEM "NAME"
24        CLASS33        CLASS
n25            NAME "State Boundary"n34            NAME "China Boundary"
35            EXPRESSION "land"
26            STYLE36            STYLE
t27                COLOR 132 132 32t37                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
28            END46            END

Mapfile 中属性说明

MapFile 仍然只有两个图层,但多边形层被细分为两大类。看一下额外的参数:

CLASSITEM "NAME"

这个关键字是用来指定分离的类对象使用什么属性。在这个例子中,属性是 NAME 。如果你打开​​相关联的数据库文件这层的 Shapefile ,你会看到有一个列(属性)称作 NAME

使用表达式定义类的最简单的(和最快)方法来确定类包含的MapServer是使用字符串的比较。您可以使用层级的关键字 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的计算,或者在桌面如GIS软件QGIS。如果数据有元数据(应该有),可以通过元数据文件的内容来了解。还可以使用 ogrinfo 在 Shapefile 显示基本属性信息 - 回头看例1.1(最后几行后,“LayerSRS WKT:”显示属性名称和类型)。

EXPRESSION "CHINA"

对于每一类,指定使用的属性值。这是最简单的表达形式。表达式可以是比这更加复杂的,允许一个常规的比较表达式或逻辑表达式。

基于比较表达式的分类

允许为更复杂的功能分类,是基于逻辑表达式一个或多个属性值。不需要指定CLASSITEM (实际上,将被忽略,如果至今)。关键字表达式介绍了逻辑表达式,这是分隔括号中。语法很简单:一个逻辑表达式由属性名括在方括号中,一个比较操作符和值。例如,下面的代码进行比较的值的数字归因于人口与数值100000:

EXPRESSION ( [POPULATION] < 100000 )

它将包括一个功能,只有不到10万人口属性值。像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的映射文件参考文档中有一个拼写错误的数字“不等于”运算符, != 不显示感叹号( ! )。

  • Operator, Data Type
  • !=, Numeric
  • =, Numeric
  • >, Numeric
  • <, Numeric
  • >=, Numeric
  • <=, Numeric
  • and, Logical
  • or, Logical
  • eq, String
  • ge, String
  • gt, String
  • le, String
  • lt, String
  • ne, String

注意虽然必须使用一个单一的方法定义一个类,每类在一层可以使用不同的方法。