第四章 基于VB的AO开发 (入门篇) 主讲:秦昆 博士 第四章 基于VB的AO开发 (入门篇) 主讲:秦昆 博士 Email:qqqkkk@263.net 武汉大学遥感信息工程学院 二零零四年十二月
第四章 基于VB的AO开发(入门篇) 下面介绍如何一步一步进行基于VB的简单的AO程序的开发。 1、设置环境 (1)打开一个Visual Basic工程,并创建一个标准的EXE工程。 如下图所示。
第四章 基于VB的AO开发(入门篇) (2)点击VB的Project菜单,然后点击Components. (3)在Components对话框中,点击ESRI MapControl, 然后点击”确定”
第四章 基于VB的AO开发(入门篇) MapControl将出现在VB工具盒中。
第四章 基于VB的AO开发(入门篇) (4) 点击Project菜单,然后点击References. (5)在References对话框中,点击ESRI Object Library 和ESRI Controls Support Library8.3,然后点击OK。
第四章 基于VB的AO开发(入门篇) 2、添加MapControl 可以在一个VB窗体中添加一个或多个MapControl。 (1)点击VB工具箱中的MapControl图标。 (2)点击并拖动到VB窗体的适当位置。 或者是双击MapControl图标,MapControl将自动放置在窗体上。 如下图所示。
第四章 基于VB的AO开发(入门篇) 3、MapControl的属性页。 MapControl有5个属性页:General, Layers, Map, Color和Picture。 (1)右键点击MapControl,然后点击Properties,打开MapControl的属性页。
第四章 基于VB的AO开发(入门篇) (2) 使用What’s This按钮,获取属性页的帮助。 ( 1)在属性页对话框中,右键点击某个控件或标签 ( 2)然后点击What’s This按钮,将显示相关的帮助信息。 3)点击属性页的其他的任何地方,关闭帮助。
第四章 基于VB的AO开发(入门篇) (3)直接点击属性页对话框的“帮助”按钮,获取相关的AO的帮助。
第四章 基于VB的AO开发(入门篇) (4)使用属性页添加数据 1)右键点击MapControl,然后点击Properties,然后打开MapControl 属性页。 2)点击Layers标签。 3)点击Add Layers 按钮(“+”按钮)。
第四章 基于VB的AO开发(入门篇) 4)在Add Layers对话框中,导航到包含数据的文件夹。 5)点击并高亮显示需要添加的数据,如果需要选择多个数据,通过同时按住shift键的方式进行选择。 6)点击Add按钮,将选中的数据添加到MapControl中。 7)点击“确定”按钮,应用选中的图层,并自动关闭属性页对话框。
第四章 基于VB的AO开发(入门篇) 8)点击“Run”菜单,并点击“Start”子菜单,运行程序(或者直接按F5)。 运行程序,得到如下图所示的结果。
第四章 基于VB的AO开发(入门篇) 5、示例数据的安装 点击安装盘的SampleMaps文件,进行示例数据的安装。
第四章 基于VB的AO开发(入门篇) 6、从Map Document中添加数据。 (1)右键点击MapControl,然后点击“Properties”,在属性页对话框中,点击“Layers”标签。 (2)点击浏览图形文档(Browse Map Document button)按钮。如下图所示。
第四章 基于VB的AO开发(入门篇) (3)在Map Documents对话框中,导航到包含所需要选择的map document的文件夹。 (4)点击并高亮显示目标map document,然后点击“打开”按钮。
第四章 基于VB的AO开发(入门篇) (5)在“Maps in MapDocument”对话框中选择所需要的图形。 (6)点击“Load Selected Map”按钮,添加所有的图层。 或者,在“Layers in Selected Map”中选择某个确定的图层,然后点击“Load Selected Layer”按钮,添加所选择的图层。也可以通过按住shift键,选择多个图层。 (7)点击“确定”按钮, 应用所作的选择。
第四章 基于VB的AO开发(入门篇) (8)点击“Run”,运行程序,得到如图所示的结果。
第四章 基于VB的AO开发(入门篇) 7、使用属性页管理数据。 (1)如下图所示,可以通过点击移动图层顺序的按钮,移动图层的上下顺序,一般将栅格数据放在下面。
第四章 基于VB的AO开发(入门篇) (2)如上图所示,点击“Properties button”(属性按钮),弹出如下图所示的图层属性的设置对话框。可以修改图层的相关属性,例如,将符号(Symbol)该为玫瑰色,如下图。
第四章 基于VB的AO开发(入门篇) (3)运行结果为:
第四章 基于VB的AO开发(入门篇) 8、使用属性页设置控件的外形。 在如图所示的属性页的“General”选项卡,选中“Preview in Design Mode”,然后点击“确定”。 然后改变控件的相关外形,如边界的类型,然后点击“应用”, 就可以在设计模式下观察修改的结果。
第四章 基于VB的AO开发(入门篇) 9、使用属性页设置图形属性 利用“Map” 属性页可以设置图形的相关属性,如坐标系统、比例尺、图形的旋转角度等。 如下图所示,在属性页的“Map”选项卡中,将旋转角度改为30度,运行结果如下图所示。
第四章 基于VB的AO开发(入门篇) 旋转30度的图 原图
第四章 基于VB的AO开发(入门篇) 10、更新属性,编辑代码 (1)更新属性:点击MapControl激活,然后按F4,或者是View菜单,然后点击Properties Windows子菜单,如下图所示。
第四章 基于VB的AO开发(入门篇) 点击Custom属性的(…)按钮,打开MapControl的属性页,如下图,更新相关的属性。
第四章 基于VB的AO开发(入门篇) (2)编辑代码 点击MapControl激活。 点击F7,或双击MapControl,或者点击View菜单,然后点击Code子菜单,进行代码的编辑。
第四章 基于VB的AO开发(入门篇) 11、使用ArcObjects开发帮助 ArcObjects开发帮助提供了关于ArcObjects中的每个对象(object), 属性(property),方法(method)和事件(event)的相关帮助。 (1)打开ArcObjects Developer Help 1)点击MapControl 、激活MapControl。 2)按F1,打开 ArcObjects Developer Help, 如图所示。
第四章 基于VB的AO开发(入门篇) (2)从对象浏览器(Object Browse)中获取帮助 1)点击F2或者点击View菜单,选择Object Browser子菜单。 2)从Project/Library下拉列表中选择esriMapControl。 3)在类列表(Classes)中选择MapControl,然后从成员列表(Members of ‘MapControl’)中选择一个事件、方法或属性。 4)点击Help button(帮助按钮),打开相关的帮助信息。
第四章 基于VB的AO开发(入门篇) 如下图,显示方法AddLayer的相关帮助信息。
第四章 基于VB的AO开发(入门篇) (3)从编辑窗口中获取帮助 在编辑窗口中,移动光标到ArcObjects的某个对象、属性、事件、方法的词上(如下图所示),然后点击F1获取相关的帮助。
第四章 基于VB的AO开发(入门篇) 12、添加ZoomIn(放大)功能 在OnMouseDown程序中添加如下代码:
第四章 基于VB的AO开发(入门篇) 运行程序以后,用鼠标点击图形,然后拉动一个矩形,释放鼠标。 图层将放大显示。
第四章 基于VB的AO开发(入门篇) 13、添加Pan(漫游)功能 修改前面的OnMouseDown程序,如果点击左键,则执行放大操作,如果点击右键,则执行移动操作。代码如下: 运行程序,执行相关的放大和漫游操作。
第四章 基于VB的AO开发(入门篇) 14、添加移动到全范围(Zoom to Full Extent)的功能 (1)在VB的窗体上添加一个命令按钮(CommandButton)。修改命令按钮的Caption属性为”Full Extent” (2)双击Full Extent命令按钮,添加代码。 Private Sub Command1_Click() MapControl1.Extent = MapControl1.FullExtent End Sub (3)点击MapControl控件,修改ShowScrollbars属性为False。 (4)运行程序,测试成果。
第四章 基于VB的AO开发(入门篇) 15、创建Find(寻找)工具 给定一个州的名字,找到该州,并放大显示。 例子数据位于:\\arcgis\arcexe83\\ArcObjects Developer Kit\Samples\Data\Usa 操作如下: (1)使用属性页添加图层states.shp和ushigh.shp。 (2)添加一个Label按钮,并修改其Caption属性为:“State”。 (3)添加一个TextBox按钮,并清除其text属性。 (4)双击TextBox按钮,进入代码编写环境。 (5)选择KeyPress事件,然后添加如下代码。
Private Sub Text1_KeyPress(KeyAscii As Integer) 第四章 基于VB的AO开发(入门篇) Private Sub Text1_KeyPress(KeyAscii As Integer) 'if the return key has been pressed If KeyAscii = vbKeyReturn Then Dim i As Integer Dim pFeatureLayer As IFeatureLayer 'Loop through the MapControl layers to find the States layer For i = 0 To MapControl1.LayerCount - 1 Set pFeatureLayer = MapControl1.Layer(i) If pFeatureLayer.Name = "States" Then Exit For End If Next i
第四章 基于VB的AO开发(入门篇) 'Create a query string Dim sQuery As String sQuery = "STATE_NAME = '" & Text1.Text & "' " 'Create the query filter Dim pQueryFilter As IQueryFilter Set pQueryFilter = New QueryFilter pQueryFilter.WhereClause = sQuery 'Query interface for IFeatureSelection and perform selection Dim pFeatureSelection As IFeatureSelection Set pFeatureSelection = pFeatureLayer pFeatureSelection.SelectFeatures pQueryFilter, esriSelectionResultNew, True 'Get the selection set Dim pSelectionSet As ISelectionSet
第四章 基于VB的AO开发(入门篇) Set pSelectionSet = pFeatureSelection.SelectionSet 'Get the feature cursor Dim pFeatureCursor As IFeatureCursor pSelectionSet.Search Nothing, True, pFeatureCursor 'Get the selected feature Dim pFeature As IFeature Set pFeature = pFeatureCursor.NextFeature If pFeature Is Nothing Then Exit Sub 'Set the MapControl extent to the extent of the selected feature MapControl1.Extent = pFeature.Shape.Envelope End If End Sub
第四章 基于VB的AO开发(入门篇) (6)运行程序 输入美国各州的名称,然后回车,将放大显示相关的图形,例如: 新泽西州
第四章 基于VB的AO开发(入门篇) 俄亥俄州
第四章 基于VB的AO开发(入门篇) 德克萨斯州
第四章 基于VB的AO开发(入门篇) (7)代码的解释: Private Sub Text1_KeyPress(KeyAscii As Integer) 'if the return key has been pressed If KeyAscii = vbKeyReturn Then Dim i As Integer Dim pFeatureLayer As IFeatureLayer 'IFeatureLayer 可以代表某一个具体的图层,可以改变该图层的的一些属性
第四章 基于VB的AO开发(入门篇) 'Loop through the MapControl layers to find the States layer For i = 0 To MapControl1.LayerCount - 1 Set pFeatureLayer = MapControl1.Layer(i) If pFeatureLayer.Name = "States" Then Exit For End If Next i '以上代码表示找到图层名为“States”的图层。
第四章 基于VB的AO开发(入门篇) 'Create a query string Dim sQuery As String sQuery = "STATE_NAME = '" & Text1.Text & "' " ‘定义一个查询条件的一部分,条件为:STATE_NAME(州名)等于文本编辑框给出的名称。 'Create the query filter Dim pQueryFilter As IQueryFilter Set pQueryFilter = New QueryFilter pQueryFilter.WhereClause = sQuery '创建一个查询过滤条件,IQueryFilter用来确定一个查询过滤条件
第四章 基于VB的AO开发(入门篇) 'Query interface for IFeatureSelection and perform selection Dim pFeatureSelection As IFeatureSelection 'IFeatureSelection提供特征选择集 Set pFeatureSelection = pFeatureLayer pFeatureSelection.SelectFeatures pQueryFilter, esriSelectionResultNew, True 'SelectFeatures:基于特定的判定条件选择符合条件的特征。 'Get the selection set Dim pSelectionSet As ISelectionSet 'ISelectionSet:提供对选中的特征的管理
第四章 基于VB的AO开发(入门篇) Set pSelectionSet = pFeatureSelection.SelectionSet 'Get the feature cursor Dim pFeatureCursor As IFeatureCursor 'IFeatureCursor:列出选中的特征集合 pSelectionSet.Search Nothing, True, pFeatureCursor '将搜索的到的特征赋给pFeatureCursor
第四章 基于VB的AO开发(入门篇) 'Get the selected feature Dim pFeature As IFeature Set pFeature = pFeatureCursor.NextFeature '设定选中的特征对象 If pFeature Is Nothing Then Exit Sub 'Set the MapControl extent to the extent of the selected feature MapControl1.Extent = pFeature.Shape.Envelope '放大到选中的对象的范围,并显示边界 End If
第四章 基于VB的AO开发(入门篇) 16、响应窗体大小的改变 当窗体大小改变时,MapControl的大小不能自动改变,下面介绍如何使MapControl随着窗体大小的改变而改变。 在窗体的resize函数中添加以下代码: Private Sub Form_Resize() If (ScaleWidth <> 0) Then 'Constant spacing Dim iSpace As Integer iSpace = Text1.Top - (MapControl1.Top + MapControl1.Height) 'y coordinate for text box, label and command Dim iYCoord As Integer
第四章 基于VB的AO开发(入门篇) iYCoord = ScaleHeight - Text1.Height - iSpace 'MapControl height Dim iMapHeight As Integer iMapHeight = iYCoord - iSpace 'Move the controls If (iMapHeight > 0) Then Command1.Move ScaleWidth - Command1.Width, iYCoord Text1.Move Text1.Left, iYCoord Label1.Move Label1.Left, iYCoord MapControl1.Move 0, 0, ScaleWidth, iMapHeight 'ScaleWidth, iMapHeight:内部的水平方向和垂直方向上的度量值。
第四章 基于VB的AO开发(入门篇) End If End Sub 同时,在Form_Load程序中添加如下代码: Private Sub Form_Load() Form_Resize 运行程序,测试成果。
第四章 基于VB的AO开发(入门篇) 17、基于比例尺显示图层 添加一个新的图层到MapControl,通过代码确定某个图层是否可见。在某个比例尺下,不必显示太多的细节。 (1)利用属性页将counties.shp添加到MapControl中。 (2)将counties图层移动到states图层之下。
第四章 基于VB的AO开发(入门篇) (3) (3)点击属性按钮,显示counties图层的属性,点击Symbology选项卡,点击Categories,然后点击Unique Values。 (4)选择STATE_NAME字段,然后点击Add All Values按钮,然后点击“确定”。
第四章 基于VB的AO开发(入门篇) (5)然后在Form Load程序中添加如下代码: Dim pLayer As ILayer Dim i As Integer 'Loop through the MapControl layers For i = 0 To MapControl1.LayerCount - 1 Set pLayer = MapControl1.Layer(i) 'Set scale thresholds If UCase(pLayer.Name) = "COUNTIES " Then 'Layer.MaximumScale = 0# 'pLayer.MinimumScale = 15000000#
第四章 基于VB的AO开发(入门篇) pLayer.MinimumScale = 0# pLayer.MaximumScale = 15000000# ElseIf UCase(pLayer.Name) = "STATES" Then pLayer.MaximumScale = 14999999# End If Next I 运行程序,放大图形,直到counties图层可见为止。 当点击Full Extent按钮后,counties图层不再可见。
第四章 基于VB的AO开发(入门篇) 18、通过代码添加图层 解释: AddShapefile方法:添加一个新的图层到MapControl的顶部图层。 AddLayer方法:在确定的顺序添加一个图层。图层可以是不同的格式的,如TIN, Raster, coverage, 或者是ArcSDE的。 LoadMxFile和AddLayerFromFile方法也可以用来添加数据到MapControl。 (1)在属性页中删除MapControl中的所有图层。 (2)在代码区添加如下代码:
第四章 基于VB的AO开发(入门篇) Private Sub LoadMapData() 'Change this path to reflect your ArcGIS installation Dim sPath As String sPath = "d:\arcgis\arcexe83\ArcObjects Developer Kit\Samples\Data\usa" 'Create a new shapefileWorkspaceFactory object Dim pWorkspaceFactory As IWorkspaceFactory Set pWorkspaceFactory = New ShapefileWorkspaceFactory 'Create a feature workspace Dim pFeatureWorkspace As IFeatureWorkspace Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(sPath, 0)
第四章 基于VB的AO开发(入门篇) 'Create a new feature layer and assign it a shapefile Dim pFeatureLayer As IFeatureLayer Set pFeatureLayer = New FeatureLayer Set pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass("states") pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName 'Add the feature layer to the map MapControl1.AddLayer pFeatureLayer MapControl1.AddShapeFile sPath, "counties" MapControl1.AddShapeFile sPath, "ushigh" End Sub
第四章 基于VB的AO开发(入门篇) 在Form Load事件中的Form_Resize后面添加如下语句。 LoadMapData 运行程序,测试成果。
End! Thanks!