第3章 图层的基本功能开发.doc_第1页
第3章 图层的基本功能开发.doc_第2页
第3章 图层的基本功能开发.doc_第3页
第3章 图层的基本功能开发.doc_第4页
第3章 图层的基本功能开发.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章图层的基本功能开发3.1用程序加裁图层文件加载的图层如果基本固定,一般放在Form_Load过程中。也可以动态加载或卸载图层,这时要在其它过程或函数中进行。3.1.1在同一个文件夹下加载如果你的程序和GIS图层文件(dbf、shp、shx等)在一个文件夹,图层为Mexico文件夹下的States和Rivers,加载程序如下:(工程Chapter302一Form01)Option ExplicitPrivate Sub Form_Load()Dim dc As New DataConnectionDim layer As MapLayerdc.Database = App.Path设当前文件夹为图层文件夹;If Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)Map1.Layers.Add layerMap1.RefreshEnd Sub加载图层后,要用Map1.Refresh进行刷新后一样显示。3.1.2在不同文件夹中加载由于在实际的应用程序中,图层文件和程序文件都很多,为了方便管理,一般程序文件和图层文件不放在一个文件夹,推荐采用一个文件夹(如DATA)单独存放图层文件,而把各个程序文件和它并列放置。例如应用程序文件夹路径为“D:MO”,程序在“D:MOVB1”文件夹下,图层文件放在“D:MOMexico”文件夹下,这时要用+”.”返回上级文件夹;(工程Chapter301一Form02)Option ExplicitPrivate Sub Form_Load()Dim dc As New DataConnectionDim layer As MapLayerdc.Database = App.Path + . + MexicoIf Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)Map1.Layers.Add layerMap1.RefreshEnd Sub如果你的图层文件夹要向上返回2级,可以用以下2级返回语句:dc.Database = App.Path + . + Mexico3.1.3图层的卸载和移动用语句:Map1.Layers.Remorve O可以把第O层卸载。注意:卸载了一个图层后,其它图层的序号就发生了变化。用语句:Map1.Layers.Clear可以一次卸载所有的图层。可以用MoveTo方法来把图层从位置l移动到位置2,如原来图层cities在第2层,用以下语句可以把它移动到第0层:Map1.Layers.MoveTo 2,03.1.4图层的选择和隐藏用图层的索引号:Set layer = Map1.Layers (0)或图层名称:Set layer = Map1.Layers (“States”)来选择当前图层。用语句:layer.Visible = False来隐藏当前的图层。另外,还可以通过设置Mapl.Visible来隐藏或显示整个Map控件。以下是一个完整的例子。其在Form上放置一个Map控件和6个Command控件,程序为如下。(工程Chapter301一Form02)Option ExplicitDim dc As New DataConnectionDim layer As MapLayerPrivate Sub Command1_Click() 图层加载LayerSetMap1.RefreshEnd SubPrivate Sub Command2_Click()图层卸载Map1.Layers.Clear 清除Map1的所有图层。End SubPrivate Sub Command3_Click()图层0不可见On Error GoTo err1 如果Map1已经被清除,不进行操作。Set layer = Map1.Layers(0)layer.Visible = FalseMap1.RefreshExit Suberr1:MsgBox 没有图层!End SubPrivate Sub Command4_Click()图层0可见On Error GoTo err1 如果Map1已经被清除,不进行操作。Set layer = Map1.Layers(0)layer.Visible = TrueMap1.RefreshExit Suberr1:MsgBox 没有图层!End SubPrivate Sub Command5_Click()隐藏地图Map1.Visible = FalseEnd SubPrivate Sub Command6_Click()显示地图Map1.Visible = TrueEnd SubPrivate Sub LayerSet() 图层设置模块Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)Map1.Layers.Add layerEnd SubPrivate Sub Form_Load()dc.Database = App.PathIf Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfLayerSetMap1.RefreshEnd Sub程序界面如图3.1所示。图3.1图层隐藏示例3.2图层基本属性设置面状图层基本属性包括图层颜色、区域界线宽度、区域界线样式、区域界线颜色等,线状图层的属性包括线宽度、线样式、线颜色等,点状图层属性包括点大小、点样式、点颜色等,另外,还有属性的标注等。3.2.1设置图层颜色调试前面的程序时,你会发现图层的颜色是随机出现的。设置Symbol对象的color属性,可以很容易地设置固定的图层颜色。P16(工程Chapter302Form02)Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)layer.Symbol.Color = moRed设本图层(河流)为红色Map1.Layers.Add layer其中moRed是MO的内设常数MO中常用的颜色有moBlack、moRed、moGreen、moBlue、moMagenta、moCyan、moWhite、moLingtGray、moDarkGray、moGray、moPlaneYellow、moLigntYellow、moYellow、moLimeGreen、moTeal、moDarkGreen、moMaroon、moPurple、moOrange、moKhaki、moOlive、moBrown、moNavy等23个常数也可以使用VB的颜色设置和RGB颜色设置,具体方法见附录C。3.2.2设置区域界线当图层为面状图层时,用layer.Symbol.Size可以设置区域界线的宽度,layer.Symbol.Size = 1是较细的线型,layer.Symbol.Size = 2是较粗的线型。还可以用layer.Symbol.Color设置区域界线的颜色,用layer.Symbol.Style设置线的样式,具体填充方式,具体方法参见附录D。3.2.3设置线属性当图层为线状图层时,用layer.Symbol.Size可以设置线的宽度,layer.Symbol.Size=1是较细的线型,layer.Symbol.Size =2是较粗的线型。还可以用layer.Symbol.Color设置线的颜色,用layer.Symbol.Style设置线的样式,具体方法参见附录D。3.2.4设置点属性当图层为点状图层时,用layer.Symbol.Size可以设置点的大小,一般用36,3是较小的点,6是较大的点。还可以用layer.Symbol.Color设置点的颜色,用layer.Symbol.Style设置点的样式,具体方法参见附录D。3.2.5属性设置的综合示例下面例子为加载墨西哥地图的州(States)、河流(Rivers)和城市(Cities)3种不同的图层,再用不同的颜色和样式来设置。(工程Chapter302一Form03)Option ExplicitPrivate Sub Form_Load()Dim dc As New DataConnectionDim layer As MapLayerdc.Database = App.Path + . + MexicoIf Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)layer.Symbol.Color = moOrangelayer.Symbol.Size = 1layer.Symbol.Style = 2 对角线填充layer.Symbol.OutlineColor = moBrownMap1.Layers.Add layer Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)layer.Symbol.Color = moDarkGreenlayer.Symbol.Size = 2layer.Symbol.Style = 1 虚线Map1.Layers.Add layer Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Cities)layer.Symbol.Color = moRedlayer.Symbol.Size = 5layer.Symbol.Style = 2 三角形符号Map1.Layers.Add layerMap1.RefreshEnd Sub其运行界面如图3.2所示。图3.2图层设置结果3.3图层标注利用MO的标注对象LabelRenderer,可以自动添加图层上对象的标注。3.3.1属性标注属性标注方法为:Set Layer.Renderer=New LabelRenderer 设置标注对象Layer.Renderer.Field=”Name” 指定要显示的字段Layer.Renderer.AllowDuplicates=True 允许标注重复其中”Name”是保存标注名称的字段。标注语句要在图层添加语句:Map1.Layers.Add layer的前面。3.3.2设置图上字体以上的标注是按缺省方式来设置的字体,还可以利用标注对象的Symbol数组,来自己动手设置更合适的字体。(工程Chapter302一Form04)Set layer.Renderer = New LabelRendererlayer.Renderer.Field = NAME 指定要显示的字段layer.Renderer.Symbol(0).Font.Name = 幼圆layer.Renderer.Symbol(0).Font.Bold = False 缺省为Truelayer.Renderer.Symbol(0).Color = moBlacklayer.Renderer.Symbol(0).Font.Size = 8layer.Renderer.AllowDuplicates = True以上设置的字体是固定大小,不随着图形大小的改变而改变。也可以用以下方法设置字体的高度,使之随着图形的大小改变:layer.Renderer.Symbol(0).Height = 5000 设置高度这时Height设置有优先权,Font.Size和Font.Bold设置不起作用。3.4图层控制用程序添加图层时,系统会自动设置图层对象的序号,最后添加的为图层0,其上为图层1,依次类推。在使用时,往往要打开或关闭一些图层,这可以用Check控件来实现。但在图层较多时,利用Check控件来编写比较麻烦,可以利用MO提供的图层控制控件建立一个Legend,减少很多编程的工作量。Legend英文原意是图例,但其主要作用是数字地图的控制面板,故以下我们还是用英文名表示。3.4.1 使用Check控件控制图层的显示在Form上添加Check1控件控制图层的显示Check1.Caption=”城市”Check1.Value=1 (选中状态)对图层0的控制程序:Private Sub Check1_Click()Set layer=Map1.Layers(0)If Check1.Value=0 Thenlayer.Visible = FalseElseLayer.Visible = TrueEnd IfEnd Sub3.4.2 作用Check控件控制图层的文字标注用以上的方法,一个图层和它的文字标注在一起,只能同时被显示或隐藏。在需要单独隐藏文字或图形时,可以用2个Check控件来控制它们,再用一个过程来重复调用设置Labe1Renderer对象的许多语句。以下是一个包含4个Check控件的程序,分别控制州界、河流、城市和城市名称。在Form上添加1个Map1控件和4个Check控件,设置如下:Check1.Caption=”城市”Check1.value=1 (选中状态)Check2.Caption=”河流”Check2.value=1 (选中状态)Check3.Caption=”州界”Check3.value=1 (选中状态)Check4.Caption=”城市名称”Check4.value=1 (选中状态)全部程序如下。(工程Chapter302一Form05)Option ExplicitDim dc As New DataConnectionDim layer As MapLayerPrivate Sub Check1_Click()Set layer = Map1.Layers(0)If Check1.Value = 0 Thenlayer.Visible = FalseElselayer.Visible = TrueEnd IfMap1.RefreshEnd SubPrivate Sub Check2_Click()Set layer = Map1.Layers(1)If Check2.Value = 0 Thenlayer.Visible = FalseElselayer.Visible = TrueEnd IfMap1.RefreshEnd SubPrivate Sub Check3_Click()Set layer = Map1.Layers(2)If Check3.Value = 0 Thenlayer.Visible = FalseElselayer.Visible = TrueEnd IfMap1.RefreshEnd SubPrivate Sub Check4_Click()Set layer = Map1.Layers(0)Set layer.Renderer = New LabelRendererIf Check4.Value = 0 Thenlayer.Renderer.AllowDuplicates = FalseElseCall Layer0Render(layer)End IfMap1.RefreshEnd SubPrivate Sub Layer0Render(layer1 As MapLayer)重复设置Layer1Renderer对象的过程Set layer1.Renderer = New LabelRendererlayer1.Renderer.Field = NAME 指定要显示的字段layer1.Renderer.Symbol(0).Font.Name = Times New Romanlayer1.Renderer.Symbol(0).Font.Bold = False 缺省为Truelayer1.Renderer.Symbol(0).Color = moBlacklayer1.Renderer.Symbol(0).Font.Size = 8layer1.Renderer.AllowDuplicates = TrueEnd SubPrivate Sub LayerSet()图层设置的过程Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)layer.Symbol.Color = moYellowlayer.Symbol.Size = 1layer.Symbol.Style = 2layer.Symbol.OutlineColor = moBrownMap1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)layer.Symbol.Color = moDarkGreenlayer.Symbol.Size = 2Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Cities)layer.Symbol.Color = moRedlayer.Symbol.Size = 4layer.Symbol.Style = 0Call Layer0Render(layer)Map1.Layers.Add layerEnd SubPrivate Sub Form_Load()dc.Database = App.Path + . + MexicoIf Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfLayerSetMap1.RefreshEnd Sub程序的界面如图3.3所示。图3.3使用Check控件控制图层的显示3.4.3使用Legend控件使用Legend组件,可以调用图层控制功能。在部件中选择ArcExplore Legend组件,添加一个legend1控件。程序如下:(工程Chapter302一Form06)在Form_Load中写入:legend1.setMapSource Map1legend1.LoadLegend True再添加legend1_AfterSetLayerVisible过程,可以在取消和添加图层后刷新:Private Sub legend1_AfterSetLayerVisible(index As Integer, isVisible As Boolean)Map1.RefreshEnd Sub运行程序,效果如图3.4所示。可以看见,Legend控件不仅可以自动标上图层名称,而且可以上下拖动,改变加载的顺序。但有时你会担心用户上下拖动,给图层造成混乱,可以这样取消图层拖动的功能:legend1.EnableDragDrop=False还可以在Legend控件的属性框中设置Font(字体)、BackColor、ForeColor等。3.4.4 在Legend上显示中文图层名由于Legend控件的图层名称是自动加上的,所以一般不能显示图层的中文名称。要在Legend上显示中文名称,有以下2种方法:(1)把所有图层文件改为中文,如把所有“Rivers”开头的文件全部变为“河流”。(2)程序设定:Set layer = Map1.Layers(1)layer.Name = “河流”3.4.5在Legend上控制图层的标注在Legend上不能控制图层的标注,但可以采用多加载一个显示标注的图层的迂回方法,就可以实现控制图层标注的目的。程序如下:(工程Chapter302一Form07)Option ExplicitDim dc As New DataConnectionDim layer As MapLayerPrivate Sub legend1_AfterSetLayerVisible(index As Integer, isVisible As Boolean)Map1.RefreshEnd SubPrivate Sub LayerSet()Set layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)layer.Symbol.Color = moYellowlayer.Symbol.Size = 1layer.Symbol.Style = 2layer.Symbol.OutlineColor = moBrownlayer.Name = 行政区Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Rivers)layer.Symbol.Color = moDarkGreenlayer.Symbol.Size = 2layer.Name = 河流Map1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Cities)layer.Name = 城市名称layer.Symbol.Size = 0Set layer.Renderer = New LabelRendererlayer.Renderer.Field = NAME 指定要显示的字段layer.Renderer.Symbol(0).Font.Name = 幼圆layer.Renderer.Symbol(0).Font.Bold = False 缺省为Truelayer.Renderer.Symbol(0).Color = moBlacklayer.Renderer.Symbol(0).Font.Size = 8layer.Renderer.AllowDuplicates = TrueMap1.Layers.Add layerSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(Cities)layer.Symbol.Color = moRedlayer.Symbol.Size = 3layer.Symbol.Style = 0layer.Name = 城市Map1.Layers.Add layer End SubPrivate Sub Form_Load()dc.Database = App.Path + . + MexicoIf Not dc.Connect ThenMsgBox 在指定的文件夹下没找到图层数据文件!EndEnd IfLayerSet 调用设置图层过程legend1.setMapSource Map1legend1.LoadLegend TrueMap1.RefreshEnd Sub3.4.6MO图层基本功能开发的综合示例在Form上添加Map1、ToolBar1、Imagelist1、Legend1、Command1、Command2,如图3.4放置和设置,全部程序如下:(工程Chapter302一Form08)Option ExplicitDim dc As New DataConnectionDim layer As MapLayerDim r As MapObjects2.RectanglePrivate Sub Command1_Click()EndEnd SubPrivate Sub Command3_Click()Dim Bs As StringBs = 选择工具栏,可以实现放大、缩小、移动和还原的功能。 & vbCrLf & _点击左边的图例控制面板,可以打开和关闭图层。 & vbCrLf & vbCrLf & Xue Wei,2003/5/3MsgBox Bs, , 墨西哥地图浏览系统帮助End SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Toolbar1.Buttons(1).Value = 1 ThenSet Map1.Extent = Map1.TrackRectangleElseIf Toolbar1.Buttons(3).Value = 1 ThenMap1.PanElseIf Toolbar1.Buttons(2).Value = 1 ThenSet r = Map1.Extentr.ScaleRectangle 1.5Map1.Extent = rEnd IfEnd SubPrivate Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)If Toolbar1.Buttons(1).Value = 1 ThenMap1.MousePointer = moZoomInElseIf Toolbar1.Buttons(3).Value = 1 ThenMap1.MousePointer = moPanElseIf Toolbar1.Buttons(2).Value = 1 ThenMap1.MousePointer = moZoomOutElseIf Toolbar1.Buttons(4).Value = 1 ThenSet Map1.Extent = Map1.FullExtentMap1.MousePointer = moDefaultEnd IfEnd SubPrivate Sub legend1_AfterSetLayerVisible(index As Integer, isVisible As Boolean)Map1.RefreshEnd SubPrivate Sub LayerSet()Dim Sline As ObjectSet layer = New MapLayerSet layer.GeoDataset = dc.FindGeoDataset(States)layer.Symbol.Color = moYellowlayer.Symbol.SymbolType = moLineSymbollayer.Symbol.Size = 1layer.Symbol.OutlineColor = moBrownlayer.Name = 行政区Map1.Layers.Add layer

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论