MapObejcts组件应用设计(地图数据符号化).doc

上传人:sk****8 文档编号:3534115 上传时间:2019-06-02 格式:DOC 页数:11 大小:128KB
下载 相关 举报
MapObejcts组件应用设计(地图数据符号化).doc_第1页
第1页 / 共11页
MapObejcts组件应用设计(地图数据符号化).doc_第2页
第2页 / 共11页
MapObejcts组件应用设计(地图数据符号化).doc_第3页
第3页 / 共11页
MapObejcts组件应用设计(地图数据符号化).doc_第4页
第4页 / 共11页
MapObejcts组件应用设计(地图数据符号化).doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、2.3.1 Symbol 对象Symbol 对象是图层中的图元的显示符号,在跟踪层中,每个几何对象用一个Symbol 对象描述,在 Map1.Layers 的图层中,每个图层一个 Symbol 属性,全图层的图元共用一个 Symbol 对象。1 Symbol.SymbolType 属性Map1.Layers 中的矢量图层,一个图层中只能有一种类型的图元,按图元的类型分,图层可以分为三种类型:点、线、面,用图层中的 Symbol.SymbolType 的值标识,可用如下程序判断矢量图层中图元的类型:Private Sub Command1_Click()Dim l As ObjectDim ft

2、ype As StringFor Each l In Map1.LayersIf l.LayerType = moMapLayer Then Select Case l.Symbol.SymbolTypeCase moFillSymbol 2ftype = “面”Case moLineSymbol 1ftype = “线”Case moPointSymbol 0ftype = “点”End SelectEnd IfNext lEnd Sub2 Symbol.Style 属性Symbol.Style 的值按矢量图层的类型 (点、线、面) 分成三组,用于点图层,指定点的绘制符号;用于线图层,指定线

3、的类型;用于面图层,指定填充图案。各组的义如下:Symbol.symbolType = 0 (点)符号常量 值 符号moCircleMarker 0 圆moSquareMarker1 长方形moTriangleMarker 2 三角形moCrossMarker 3 十字线moTrueTypeMarker 4 文字Symbol.SymbolType = 2 (面)符号常量 值 填充方法moSolidFill 0 SolidmoTransparentFill 1 TransparentmoHorizontalFill 2 HorizontalmoVerticalFill 3 VerticalmoU

4、pwardDiagonalFill 4 Upward DiagonalmoDownwardDiagonalFill 5 Downward DiagonalmoCrossFill 6 CrossmoDiagonalCrossFill 7 Diagonal CrossmoLightGrayFill 8 Light Gray FillmoGrayFill 9 Gray FillmoDarkGrayFill 10 DarkGray Fill请在 MapObjects2 的帮助中索引 FillStyle Constants LineStyle Constants MarkerStyle Constant

5、s 查看三组图案4 Symbol. Color 属性Color As OLE_COLOR用 Color 指定的颜色绘制 Symbol.Style 指定的符号(线、填充图案)。例 为点图层、线图层、面图层设置显示风格及颜色.(参见光盘中的 Symbol 目录中的程序)Dim sym As MapObjects2.SymbolPrivate Sub Form_Load()Dim strDataPath As StringDim dc As New MapObjects2.DataConnectionDim lyr As New MapObjects2.MapLayer 创建图层对象strDataP

6、ath = ReturnDataPath(“world“) 数据库目录名dc.Database = “d:/mobook/sample/data/world“dc.Database = strDataPathIf Not dc.Connect Then EndSet lyr.GeoDataset = dc.FindGeoDataset(“Country“) 面图层Set sym = lyr.Symbolsym.Style = moVerticalFillsym.Color = 255Map1.Layers.Add lyr 在地图窗口中添加 Country 图层Set lyr = New Map

7、LayerSet lyr.GeoDataset = dc.FindGeoDataset(“rivers“) 线图层lyr.Symbol.Style = moSolidlyr.Symbol.Color = moBlueMap1.Layers.Add lyrSet lyr = New MapLayerSet lyr.GeoDataset = dc.FindGeoDataset(“Cities“) 点图层Set sym = lyr.Symbolsym.Style = moCircleMarkersym.Color = moYellowMap1.Layers.Add lyrSet lyr = New

8、MapLayerSet lyr.GeoDataset = dc.FindGeoDataset(“Lakes“) 面图层Map1.Layers.Add lyr 每次运行显示不同的颜色及图案End Sub多次运行这些程序可以看出,Map1.Layers.Item(“Lakes”) 图层没有指定Symbol.Color 的值,每次运行 Lakes 层的颜色及图案都不同。从这个例子的运行结果可见,Map1.Layers.Item(“Lakes”).Symbol 是一个图层全部地图要素的共用符号,因此全图层的所有的 Lake 都显示成同一种颜色。下一节的专题地图制作中,每个图层对应一个 Symbol 数

9、组,要素用多个 Symbol 符号绘制。习题1 编写程序实现 Symbol 目录中样例程序的功能,每个图层的 Symbol 指定各种值,观看显示效果。2 以习题 1 为基础,为图层的 Symol.Size 、Symol.OutLine 、Symol.Rotation 设置值。总结出这 3 个属性的含义。2.3.2 专题地图制作在 Mapobjects 中,描述数据与地图符号之间的映射关系的对象称为 Renderer,用于制作专题地图,又称为专题地图制作器。MapObjects 可制作九种专题地图,对应的 Renderer 是:MapObjects 的专题地图制作器对象对象名称 解释ValueM

10、apRenderer 唯一值ClassBreaksRenderer 范围值DotDensityRenderer 点密度图ChartRenderer 饼图和棒图LabelRenderer 文字标签LabelPlacer 文字标签GroupRenderer 用于多个RendererEventRenderer 用于测量数据ZRenderer 用 Z 维数据作专题图样例在 ThemeMap 目录中,样例中地图窗口中 Layers(“China”)图层是中国省级行政区划图,图层的属性数据表中 Code 和 uid 字段数据用于制作专题地图。样例显示窗口中的每个按钮制作一种类型专题地图。先运行样例程序获得

11、每种专题地图的感性认识。图层的 Layers(n).Renderer 属性是专题地图制作器。以下语句定义了地图数据与制图符号之间的映射关系:Dim strings As New MapObjects2.strings 字符串集合Set ly = Map1.Layers(“China”)ly.Renderer.Field = “Code” 制作专题地图的数据字段名ly.Renderer.Value(i) = Val(strings(i) 从 Code 字段映射ly.Renderer.Symbol(i).Color = moRed + i * 2 显示的颜色1 ValueMapRenderer 专

12、题地图ValueMapRenderer 专题地图称为唯一值专题地图,制图属性字段的一个唯一值用一个地图符号表示,即重复的值用同一个符号表示,制图符号与属性值之间是一对多的关系。提取一个字段中的非重复值,MapObjects 提供了 Strings 集合对象,加入到集合中的字符串若与先前加入的字符串重复,则无效。ValueMapRenderer 对象的属性中有两个数组:Symbol 与 Value;它们定义制图符号与属性值的对应关系,元素个数都是 ValueMapRenderer.ValueCount。Value 数组储存制图字段的唯一值,是 Varant 类型。Private Sub Comm

13、and1_Click() ValueMapRender 制作专题地图Dim strings As New MapObjects2.stringsDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”)Set recs = ly.Records 寻找 Code 字段中的非重复值Do While Not recs.EOFstrings.Add Str(recs(“Code”).Value)recs.MoveNextLoopSet ly.Renderer = New ValueMapRendererly.Renderer.Field =

14、“Code” 制作专题地图的数据字段名 add the unique values to the rendererly.Renderer.ValueCount = strings.Count 在使用 Value 及 Symbol 数组前执行For i = 0 To strings.Count 1 共有 Count 个非重复值ly.Renderer.Value(i) = Val(strings(i) 从 Code 字段映射ly.Renderer.Symbol(i).Color = moRed + i * 2 显示的颜色Next iMap1.RefreshEnd Sub2 ClassBreaksR

15、enderer 专题地图ClassBreaksRenderer 对象根据数据的逻辑分组,每组用一个符号(或颜色)显示地图。对于每一种分组方案,必须指定分组数,每组数值的上下界,每组对应的地图符号(或颜色)。常见的数据分组方法有:等间距法、分位数法、标准方差法、自然分割法。Private Sub Command2_Click() ClassBreakRenderer 专题地图Dim stats As MapObjects2.StatisticsDim r As MapObjects2.ClassBreaksRendererDim ly As MapObjects2.MapLayerSet ly

16、= Map1.Layers(“China”) 中国省级政区图,面图层Set ly.Renderer = New MapObjects2.ClassBreaksRendererly.Renderer.Field = “uid” 制作专题数据字段Set r = ly.RendererSet stats = ly.Records.CalculateStatistics(“uid”) 计算 uid 字段的统计值Dim breakVal As DoublebreakVal = stats.Minr.BreakCount = 7 数据分组数For i = 0 To 6 数组的下标从 0 开始r.Break

17、(i) = breakVal + (stats.Max - stats.Min) / 7 * i 数据分组界限Next ir.RampColors moRed, moBlue 各组显示颜色渐变Map1.RefreshEnd SubRampColors 是 ClassBreaksRenderer 对象的方法,在设置完数据分组数之后,通过此方法提供第一组的起始颜色与最后一组的终止颜色,就可以向所有的分组提供渐变的颜色。3 DotDensityRenderer 专题地图DotDensityRenderer 制作点密度专题地图,原图应该是面要素图层。根据制图字段数据及每点代表的值计算各个区域点数,在区

18、域中布点形成点密度图。因此DotValue、Field 字段必须赋值。Private Sub Command3_Click() 制作 DotDensityRenderer 专题地图Dim stats As MapObjects2.StatisticsDim r As New MapObjects2.DotDensityRendererDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”) 中国省级政区图,面图层ly.Symbol.Color = moWhite 面图层的区域填充色Set stats = ly.Records.Cal

19、culateStatistics(“uid”) 计算 uid 字段的统计值r.Field = “uid” 专题数据字段r.DotValue = (stats.Min + (stats.Max - stats.Min) / 2) / 20r.DotColor = moRedr.DotSize = 3Set ly.Renderer = rMap1.Refresh 刷新显示End Sub4 LabelRenderer 标注LabelRenderer 用于标注与图层中图元相关联的文字。(1) 单个 Symbol 标注在一个图层中全部文字注记使用一个 Symbol 标注时,全部文字规格相同,如下段程序所

20、示。Private Sub Command4_Click() LabelRenderer 使用一个 Symbol 标注文字Dim r As New MapObjects2.LabelRendererDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”) 中国省级政区图,面图层ly.Symbol.Color = moWhite 面图层的区域填充色r.Field = “name” 省名字段r.AllowDuplicates = True 允许重复文字显示Set ly.Renderer = rMap1.Refresh 刷新显示End S

21、ub(2) Symbol 数组标注在一个图层中文字注记使用 Symbol 数组标注时,文字可有不同的规格 j及显示特性。下段将同 China 图层文字用不同的颜色标注。Private Sub Command5_Click() LabelRenderer2 用多个 Symbol 标注文字Dim r As New MapObjects2.LabelRendererDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”) 中国省级政区图,面图层ly.Symbol.Color = moWhite 面图层的区域填充色r.Field = “na

22、me” 省名字段,标注文字所在字段r.SymbolCount = 4 赋值后,Symbol 属性当数组使用r.SymbolField = “SymbolIdex” 数据库中的 Symbol 索引号字段名r.Symbol(1).Color = moRedr.Symbol(2).Color = moBluer.Symbol(3).Color = moGreenr.AllowDuplicates = True 允许重复文字显示Set ly.Renderer = rMap1.Refresh 刷新显示End Sub缺省情况下 LabelRenderer.symbol 是只有一个元素的数组,等价于简单变量

23、,执行语句r.SymbolCount = 4后,Symbol 具有 4 个元素,起始元素的下标是 0。语句r.SymbolField = “SymbolIndex” SymbolIndex 是 China.dbf 中的字段名建立标注文字字段(Name)的值与 Symbol 数组元素之间的对应关系,SymbolIndex 字段的值是 Symbol 数组元素的下标。例如 ,China.dbf 表 5 号记录Name 字段的值是”黑龙江”、SymbolIndex 的值是 2,则标注” 黑龙江”时使用Symbol(2)。(3)比例标注与非比例标注标注文字的大小随地图的缩放而变化,称为比例标注,用语句L

24、abelRenderer.Symbol.Height = 1200 采用地图数据的长度单位设置标注文字的尺寸。标注文字的大小不随地图的缩放而变化,称为非比例标注,用语句LabelRenderer.Symbol.Size = 14 以屏幕或纸张的点数位单位设置标注文字的大小。LabelRenderer.Symbol 在缺省情况下是非比例标注,文字的大小使用 Windows 操作系统提供的标准值。5 LabelPlacer 文字标注MapObjects2.LabelPlacer 对象与 LabelRenderer 基本相同,对地图提供基于属性的标注。LabelPlacer 还提供了一 LabelR

25、enderer 所不具有的功能,主要有以下几点:可将标注至于文字的上方、下方或要素上。可对标注进行掩膜处理,让标注文字下层的要素不可见。具有自动调整重合功能,使标注自动调整位置,避免文字重叠。Private Sub Command6_Click() LabelPlacer 文字标注Dim r As New MapObjects2.LabelPlacerDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”) 中国省级政区图,面图层ly.Symbol.Color = moWhite 面图层的区域填充色r.Field = “name”

26、省名字段r.ValueCount = 4 赋值后,Symbol 及 Value 属性当数组使用r.ValueField = “name” 数据库中的 Symbol 索引号字段名r.Symbol(0).Font.Size = 16r.Symbol(1).Color = moRedr.Symbol(2).Color = moBluer.Symbol(3).Color = moGreenr.Value(0) = “北京” 这四个标注使用上面的四个 Symbolr.Value(1) = “新疆”r.Value(2) = “黑龙江”r.Value(3) = “广东”其余的标注使用 LabelPlacer

27、.DeFaultSymbolr.AllowDuplicates = True 允许重复文字显示Set ly.Renderer = rMap1.Refresh 刷新显示End Sub6 CharRenderer 专题地图CharRenderer 从属性表中取数据制作饼图和柱状图。(1) 棒图Private Sub Command7_Click() ChartRenderer 制作棒状统计地图Dim cr As New MapObjects2.ChartRenderercr.ChartType = moBar 制作棒图cr.BarHeight = Map1.Height * 0.007cr.Bar

28、Width = Map1.Width * 0.0015cr.FieldCount = 3 使用 3 个作图字段cr.Field(0) = “gdp1990” Chian.dbf 中的数值型字段名cr.Field(1) = “gdp1995”cr.Field(2) = “gdp2000”cr.Color(0) = QBColor(2) 棒体颜色cr.Color(1) = QBColor(3)cr.Color(2) = QBColor(4)Map1.Layers(“china”).Symbol.Color = moWhite 面图层的区域填充色Set Map1.Layers(“china”).Re

29、nderer = crMap1.RefreshEnd Sub(2) 饼图将棒图程序中的前三条语句替换后可的饼图显示程序如下:Private Sub Command8_Click() ChartRender 制作饼图Dim cr As New MapObjects2.ChartRenderercr.ChartType = moPie 制作饼图cr.MinPieSize = Map1.Height / 400cr.MaxPieSize = Map1.Height / 200cr.FieldCount = 3 使用 3 个作图字段cr.Field(0) = “gdp1990” Chian.dbf 中

30、的数值型字段名cr.Field(1) = “gdp1995”cr.Field(2) = “gdp2000”cr.Color(0) = QBColor(2) 棒体颜色cr.Color(1) = QBColor(3)cr.Color(2) = QBColor(4)Map1.Layers(“china”).Symbol.Color = moWhite 面图层的区域填充色Set Map1.Layers(“china”).Renderer = crMap1.RefreshEnd Sub7 GroupRenderer 专题地图前面的几种 Renderer 只能制作单类型的专题地图,有时需要制作复合类型的专

31、题地图,以中国政区图为例,不仅要用不同的颜色表示每个省区,还要表示出每个省区三年的 GDP 组合柱状图。可用 GroupRenderer 来完成这一工作,创建一个 ValueMapRenderer 实例,对省区进行着色,创建一个 ChartRenderer 实例,制作各省的柱状图,两个实例都加入到GroupRenderer 实例中,最后将 GroupRenderer 实例写入到MapLayers(“china”).Renderer 中。下面的程序给出了实际工作代码:Private Sub Command9_Click() GroupRenderer 专题图Dim cr As New MapOb

32、jects2.ChartRenderercr.ChartType = moBar 制作棒图cr.BarHeight = Map1.Height * 0.007cr.BarWidth = Map1.Width * 0.0015cr.FieldCount = 3 使用 3 个作图字段cr.Field(0) = “gdp1990” Chian.dbf 中的数值型字段名cr.Field(1) = “gdp1995”cr.Field(2) = “gdp2000”cr.Color(0) = QBColor(2) 棒体颜色cr.Color(1) = QBColor(3)cr.Color(2) = QBCol

33、or(5)Dim strings As New MapObjects2.stringsDim gr As New MapObjects2.GroupRendererDim vr As New MapObjects2.ValueMapRendererDim ly As MapObjects2.MapLayerSet ly = Map1.Layers(“China”)Set recs = ly.Records 寻找 Code 字段中的非重复值Do While Not recs.EOFstrings.Add Str(recs(“Code”).Value)recs.MoveNextLoopvr.Field = “Code”vr.ValueCount = strings.CountFor i = 0 To strings.Count - 1vr.Value(i) = Val(strings(i)vr.Symbol(i).Color = moRed + i * 2Next i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。