在前面的例子中,图层由一组来自相同的数据集的特征组成,使用同样的样式来呈现。然而,你可能不希望绘制的所有特征包含在一个给定的数据集,或者您可能不希望以同样的方式绘制的所有特征。例如,使每一个数据集,包含所有公路的世界地图将需要相当长的时间并且产生的地图过于杂乱以至于不是太有用的。同样使用相同的符号,渲染乡村道路与高速公路方式产生的地图,图形功能之间无法区分;而在现实世界上,这种区别是很明显的。
类允许你基于属性的区分功能和基于类区分特征。前面的图使用类,因为每一层都必须至少有一个类。最简单的,默认的类包括数据集的每一个特征。在这种情况下,该层具有一个类并且在这个类中的每一个特征以同样的方式呈现。
然而,你通常希望避免只使用默认的类,并转而选择分类特征,前面提到的两个原因: 首先,你可能不希望绘制每一个特征,第二,你可能想用不同的符号,颜色或尺寸呈现属性不同的某些特征。
通过使用在数据中的非空间属性信息,可以创建这样的地图:
或者是:
下面是地图文件 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 | LAYER | 7 | LAYER | ||
n | 8 | NAME "world-country" | n | 8 | NAME "states_poly" |
9 | DATA "wcountry.shp" | 9 | DATA "wcountry.shp" | ||
11 | TYPE POLYGON | 11 | TYPE POLYGON | ||
n | n | 12 | CLASSITEM "NAME" | ||
12 | CLASS | 13 | CLASS | ||
n | 13 | NAME "States" | n | 14 | NAME "China" |
15 | EXPRESSION "CHINA" | ||||
14 | STYLE | 16 | STYLE | ||
n | 15 | COLOR 232 232 232 | n | 17 | COLOR 232 30 30 |
18 | END | ||||
19 | END | ||||
20 | CLASS | ||||
21 | NAME "Others" | ||||
22 | STYLE | ||||
23 | COLOR 198 198 255 | ||||
16 | END | 24 | END | ||
19 | LAYER | 27 | LAYER | ||
n | 20 | NAME "country-line" | n | 28 | NAME "states_line" |
21 | DATA "wcountry.shp" | 29 | DATA "wcountry.shp" | ||
23 | TYPE LINE | 31 | TYPE LINE | ||
n | n | 32 | CLASSITEM "NAME" | ||
24 | CLASS | 33 | CLASS | ||
n | 25 | NAME "State Boundary" | n | 34 | NAME "China Boundary" |
35 | EXPRESSION "land" | ||||
26 | STYLE | 36 | STYLE | ||
t | 27 | COLOR 132 132 32 | t | 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 | ||||
28 | END | 46 | END |
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的映射文件参考文档中有一个拼写错误的数字“不等于”运算符, !=
不显示感叹号( !
)。
!=
, Numeric =
, Numeric >
, Numeric <
, Numeric >=
, Numeric<=
, Numeric and
, Logical or
, Logical eq
, Stringge
, Stringgt
, Stringle
, Stringlt
, Stringne
, String注意虽然必须使用一个单一的方法定义一个类,每类在一层可以使用不同的方法。