图6—1 交操作
七 地图表示
当我们在地图控件上增加一个图层时,该图层的所有要素以一种缺省的符号进行显示。一方面,我们可以改变显示的符号,另一方面我们可以对图层中的不同要素以不同的符号进行显示(专题制图)。 1、 显示符号
在MO中,Symbol是一个符号对象,它有SymbolType(符号类型)、Style(样式)、Color(颜色)、Size(尺寸)等属性。符号类型包括点(Point)、线(Line)和多边形(Fill),不同类型的符号可以设置的属性是不一样的,如轮廓线颜色只能对多边形符号进行设置。 Style是指符号的样式,点、线和多边形三种类型符号分别有相应的样式集合(图7—1,图7—2,图7—3)。
图7—1点符号样式集合
图7—2 线符号样式集合
图7—3填充符号样式集合
利用符号对象的Custom特性可以产生定制的点、线和填充符号。
每一符号可以用不同颜色显示,颜色的定义有几种方法:利用VB颜色常数,如vbBlue,或利用MO颜色常数,如moRed。MapObjects定义了如下23种颜色常量:MoBlack,MoRed,MoGreen,moBlue,moMagenta,moCyan,moWhite,moLightGray,moDarkGray,moGray,moPaleYellow,molightYellow,moyellow,moLimeGreen,moTeal,moDarkGreen,moMaroon,moPurple,moOrange,moKhaki,moOlive,moBrown,moNavy。
对点符号,还可以设置符号尺寸、旋转等属性。
对线符号,还可以设置线的宽度等属性。
对填充符号,还可以设置多边形轮廓线的宽度、颜色等属性。 利用符号对象的Custom特性可以产生定制的点、线和填充符号。
改变图层的显示符号,首先是得到图层的符号对象,然后对符号对象的属性进行赋值,地图刷新后,即以新的符号显示。
下面的代码是改变MapLayer的符号为moRed。 Dim ly As MapObjects2.MapLayer Set ly = Map1.Layers(0) Ly.Symbol.Color = moRed
Map1.Refresh
如要改变符号的多个属性,可利用With语句定义 With ly.Symbol .Style = 2 .Color = moRed
.Size = 20 End With
2、 利用图例改变地图显示符号
包括两个过程,首先是点击图例中的一个图层,打开符号编辑窗口;然后在符号编辑窗口中设置符号属性,确认后,该图层以新的符号显示。
点、线、多边形三种类型图层分别用Point、Line和Fill三种符号表示。这三种符号可以设置的属性是不一样的,针对不同类型的图层,在符号编辑窗口中显示不同的界面(图)。
对话框包括五个Label控件、一个PictureBox控件、三个组合框控件、一个文本框控件以及一个命令按纽控件。
Label控件的Caption属性在程序中设置,当点击的图层是点图层时,五个Label控件的Caption分别为:Marker Color、Style、Size、Font和Character Index;当点击的图层是线图层时,前三个Label控件的Caption分别为:Line Color、Style和Line width,后两个Label控件不显示;当点击的图层是多边形图层时,前三个Label控件的Caption分别为:Fill Color、Style和Outline width,后两个Label控件不显示。
PictureBox控件不显示图片,只显示背景颜色,初始背景颜色是点击图层原有的颜色,可通过Layer.Symbol.Color语句获得。点击PictureBox控件,将打开颜色选择对话框(Commondialog1.ShowColor),用户在颜色框中选择一个颜色,该颜色将作为PictureBox控件的背景颜色。
第一个组合框控件用于显示符号的Style,可通过组合框的AddItem方法把不同的Style名称增加到组合框中。不同类型符号的Style是不一样。确省的Style是点击图层原有的Style,可通过Layer.Symbol.Style语句获得。用户在组合框中选择一个Style,该Style将作为选中的Style。
当点击的图层是点图层,显示第二和第三个组合框。 当Style是moTrueType(字符形式的符号)时,第二个组合框用于显示所有Font的名称(C:\\WINDOWS\\Fonts\\),可利用组合框的AddItem Screen.Fonts(i),确省的Font可利用layer.Symbol.Font.Name语句获得。
Private Sub Combo1_Click()
Dim i As Integer
Dim fnt As New StdFont
If Combo1.Text = \ For i = 0 To Screen.FontCount - 1 Combo2.AddItem Screen.Fonts(i) Next i
Combo2.Text = lyr.Symbol.Font.Name End If End Sub
当用户在第二个组合框中选中一个Font,第三个组合框用于显示该Font中的所有TrueType marker符号。首先是定义Font名称(fnt.Name = Combo2.Text),然后,把该字体中的所有TrueType符号增加到第三个组合框中(在增加符号前可以把原有清除),所有Font中的字符索引(index)都是从0到255。
Private Sub Combo2_Click() Dim i As Integer Dim fnt As New StdFont fnt.Name = Combo2.Text Combo3.Clear Combo3.Font = fnt For i = 0 To 255
Combo3.AddItem Chr(i) Next End Sub
文本框控件用于显示点符号的Size、线符号的width或多边形符号的Outline width,都是用数字表示,初始的值通过Layer.Symbol.Size语句获得,用户可以在文本框中输入一个值。
点击OK按钮,分别把PictureBox控件的背景颜色、组合框控件的列表选择和文本框控件的输入值作为图层符号的颜色、Style和Size,并对地图进行刷新,刷新后的地图以新的符号显示。
Dim sym As MapObjects2.Symbol Set sym = lyr.Symbol
sym.Color = Picture1.BackColor sym.Style = Combo1.ListIndex sym.Size = Text1.Text
If sym.Style = moTrueTypeMarker Then Dim fnt As New StdFont fnt.Name = Combo2.Text Set sym.Font = fnt
sym.CharacterIndex = Asc(Combo3.Text) End If
Form1.legend1.LoadLegend True Form1.Map1.Refresh
3、 地图显示方式(专题制图)
在MapObjects中,有8个renderer对象(ValueMapRenderer对象、ClassBreaksRenderer对象、DotDensityRenderer对象、ChartRenderer对象、ZRenderer对象、EventRenderer对象、LabelRenderer对象和GroupRenderer对象),分别用于不同的地图显示方式。 2.1 ValueMapRenderer(按要素字段值显示地图)
按要素字段值显示地图即不同字段值的要素用不同的符号表示,如一个图层表示土地地块,有些地块为居住用地,有些地块为公园,有些为工业用地,等等,我们根据土地利用类型用不同符号表示,就可以利用ValueMapRenderer对象。