ArcGIS_Engine开发实例教程 长江三峡大学

更新时间:2023-04-30 01:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ArcGIS Engine 开发实例教程三峡大学土木水电学院 肖泽云
二〇〇九年 三月

ArcGIS Engine开发实例教程土木水电学院3S实验室

很高兴和大家分享我的心得!ArcGIS Engine是专门用于开发GIS系统的开发包,目前最新版本是9.3。基于ArcGIS Engine,结合程序开发语言可以开发具有很强专业性的GIS系统。而且所开发的系统不需要客户端安装ArcGIS软件,只需要安装ArcGIS Engine Runtime及相应的许可就可以使用开发的GIS系统。本教程是本人原创作品,其主要目的是能让读者在学习完本教程后,对ArcGIS Engine开发有基础的认识,对ArcGIS Engine主要的库有一定了解,熟悉GIS开发的基本流程,以期得到抛砖引玉的效果。本教程中所有的程序代码都是作者一句一句编写的,希望广大读者、特别是初学者一定要仔细阅读、认真思考、反复斟酌,才会达到事半功倍的效果。限于作者水平及时间关系,其中的错误在所难免,望广大读者提出宝贵的意见和建议!相互交流,共同提高!

——肖泽云

作者联系方式:

地址:湖北省宜昌市三峡大学土木水电学院

邮编:443002

Email:xwebsite@296e8059bcd126fff6050b59

QQ:289700062

软件建议配置要求:

由于在本教程中主要以Visual 296e8059bcd126fff6050b59语言开发为主,所以要求读者在使用本教程之前先安装Visual Studio2005。然后安装ArcGIS Engine for .Net,安装完ArcGIS Engine后安装Engine的许可文件,在启动Visual Studio时会出现如下所示界面:

其中MapControl Application是一个典型的二维地图模版。

ArcGIS Engine开发实例教程土木水电学院3S实验室目录

第一篇Map地图开发 (1)

1、新建一个GIS项目 (1)

2、导入Map文档 (5)

3、设置TOCControl和ToolbarControl控件的链接 (7)

4、添加Shapefile数据文件 (7)

5、添加图层 (8)

6、其他常用属性及方法 (9)

7、地图放大缩小等 (10)

8、创建数据属性表格 (12)

9、缓冲分析 (15)

10、CAD与Shapfile格式之间的相互转换 (20)

11、将CAD导出成Shp格式 (23)

12、创建符号选择窗体SymbologyControl (23)

13、指定对象的符号 (27)

14、三维分析 (31)

15、获取TIN图层 (40)

16、选择对象 (42)

17、获取选择数据 (45)

18、获取剖面图 (49)

19、闪烁动画并缩放至数据 (62)

20、更改点的显示符号 (67)

21、更改线的显示符号 (69)

22、自定义点的符号 (71)

23、打开个人数据库 (72)

24、打开CAD数据 (74)

25、计算Raster的绝对值 (77)

26、Raster的复杂计算 (79)

27、生成表面Raster (82)

ArcGIS Engine开发实例教程土木水电学院3S实验室

28、生成坡度Raster (83)

29、生成等高线 (84)

30、生成曲率Raster (85)

第二篇Scene三维开发 (87)

1、创建一个简单的三维场景 (87)

2、在SceneControl控件中添加Scene文件 (88)

3、旋转/移动摄像机动画 (88)

4、常用浏览功能 (88)

5、更改摄像机位置 (90)

6、输出A VI动画 (91)

7、创建动画关键帧 (92)

8、在三维控件SceneControl中添加Shapfile、jpg、tif等格式文件 (95)

9、保存场景图片 (96)

10、添加Raster数据 (96)

11、生成TIN (97)

12、设置图层基准高程 (107)

13、点击查询 (115)

14、转换TIN成MultiPatches (120)

15、获取TIN中对象 (121)

16、输出TIN节点坐标 (124)

17、设置点的模型 (127)

ArcGIS Engine 开发实例教程 土木水电学院3S 实验室

第 1 页 共 119 页 第一篇 Map 地图开发

1、新建一个GIS 项目

1)启动Visual Studio ,在Visual Basic 下面的Windows 模版下选择Windows 应用程序,并命名项目名称为“GIS 开发”,如下图所示。

2)点击确定按钮,创建一个Windows 应用程序项目。在工具栏中的ArcGIS Windows Forms 选项下有一些常用的GIS 控件,如下图所示:

其中,MapControl 就是Map 地图控件,PageLayoutCOntrol 是布局地图控件,TOCControl 是目录控件,ToolbarControl 是GIS 工具栏控件,SceneControl 是Scene 三维场景控件,GlobeControl 是Globe 控件,LicenseControl 是许可控件,SymbologyControl 是符号选择器控件,ArcReaderControl 是ArcReader 控件,ArcReaderGlobeControl 是ArcReaderGlobe 控件。常用的有MapControl 、SceneControl 、ToolbarControl 、TOCControl 和LicenseControl 。LicenseControl 是许可控件,一般GIS 系统中都必须添加,否则无法使用。

3)下面我们添加MapControl 、ToolbarControl 、TOCControl 和LicenseControl

ArcGIS Engine开发实例教程土木水电学院3S实验室这四个控件,如下图所示:

4)这些控件也有一些属性性质,可以直接在控件上点击右键打开控件的属性窗体,如下图所示:

5)打开MapControl控件的属性,在Map Document后可以浏览Map文件的地址,在启动程序后将会打开该地图。如下图所示:

第 2 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

6)点击确定按钮。然后打开TOCControl控件的属性窗体,在Buddy下设置其链接到AxMapControl控件,如下图所示,表示该目录对应的是AxMapControl1中地图的数据文件列表。

7)点击确定按钮。然后打开ToolbarControl控件的属性窗体,同样在Buddy 下设置其链接到AxMapControl控件,如下图所示:

第 3 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

8)点击Items标签,在此可以添加工具,如下图所示,点击Add按钮开始添加工具。

9)如下图所示,在添加工具窗体上可以选择需要添加的工具,若需要添加某个工具,在双击该工具。

第 4 页共119 页

ArcGIS Engine 开发实例教程 土木水电学院3S 实验室

第 5 页 共 119 页

10)添加完工具后关闭选择工具窗体,在ToolbarControl 控件的属性窗体上点击确定按钮。按F5开始运行程序,其现实结果如下图所示:

至此,一个简单的GIS 系统就形成了。该系统没有编写任何代码就实现了,可见ArcGIS Engine 开发还是比较人性化的。接下来,我们基于这个项目继续开发。

2、导入Map 文档

ArcGIS Engine 开发实例教程 土木水电学院3S 实验室

第 6 页 共 119 页 1)在Form1窗体上添加一个按钮控件,并设置其Text 为“打开文件”,如下图所示:

2)双击该按钮,为该按钮添加事件,其代码如下:

Dim openFileDialog1 As OpenFileDialog = New OpenFileDialog()

openFileDialog1.Title = "打开Map 地图"

openFileDialog1.Filter = "Map Documents (*.mxd, *.mxt, *.pmf)|*.mxd;*.mxt;*.pmf"

openFileDialog1.ShowDialog()

Dim sFilePath As String

sFilePath = openFileDialog1.FileName

If sFilePath = "" Then Exit Sub

On Error GoTo ErrorHandler_LoadMxFile

AxMapControl1.LoadMxFile(sFilePath)

Exit Sub

ErrorHandler_LoadMxFile:

MsgBox(sFilePath & "不能导入!" + vbCrLf + "错误:" + Err.Description)

其中该代码中最主要的是AxMapControl1.LoadMxFile(sFilePath),MapControl 的LoadMxFile 方法可以将指定路径sFilePath 的Map 文件导入到

ArcGIS Engine开发实例教程土木水电学院3S实验室

MapControl控件中去。

3) 运行程序,点击按钮,其运行结果如下图所示:

3、设置TOCControl和ToolbarControl控件的链接

TOCControl和ToolbarControl控件分别是用于链接Map或Scene控件的目录控件和工具栏控件,它们与Map或Scene控件链接的方法除了前面的设置其属性外,还可以通过在程序中设置它们的SetBuddyControl属性。一般都是在程序启动或窗体初始化时就设置,如下代码:

AxTOCControl1.SetBuddyControl(AxMapControl1)

AxToolbarControl1.SetBuddyControl(AxMapControl1)

这就是设置TOCControl和ToolbarControl控件链接到Map控件上的代码。

4、添加Shapefile数据文件

1)添加一个按钮控件,并设置其Text属性为“添加Shp文件”。

2)双击该按钮,为其添加事件,其代码如下:

Dim addDataDialog1 As OpenFileDialog = New OpenFileDialog() addDataDialog1.Title = "添加Shapefile数据文件"

addDataDialog1.Filter = "Shapfiles (*.shp)|*.shp"

addDataDialog1.ShowDialog()

Dim sFilePath As String

sFilePath = addDataDialog1.FileName

第7 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

If sFilePath = ""Then Exit Sub

On Error GoTo ErroHandle_AddData

Dim i As Integer

i = 296e8059bcd126fff6050b59stIndexOf("\")

AxMapControl1.AddShapeFile(Microsoft.VisualBasic.Left(sFilePath, i), Microsoft.VisualBasic.Right(sFilePath, sFilePath.Length - i - 1)) Exit Sub

ErroHandle_AddData:

MsgBox(sFilePath & "不能导入!"+ vbCrLf + "错误:"+ Err.Description)

其中AxMapControl1.AddShapeFile是添加shapefile的方法,后面的是获取该文件的路径和名称。

3)运行程序,其结果如下图所示:

5、添加图层

1)添加一个按钮控件,并设置其Text属性为“添加图层”。

2)双击该按钮,为其添加事件,其代码如下:

Dim addDataDialog1 As OpenFileDialog = New OpenFileDialog() addDataDialog1.Title = "添加图层文件"

addDataDialog1.Filter = "图层文件(*.lyr)|*.lyr"

addDataDialog1.ShowDialog()

第8 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

Dim sFilePath As String

sFilePath = addDataDialog1.FileName

If sFilePath = ""Then Exit Sub

On Error GoTo ErroHandle_AddData

AxMapControl1.AddLayerFromFile(sFilePath)

Exit Sub

ErroHandle_AddData:

MsgBox(sFilePath & "不能导入!"+ vbCrLf + "错误:"+ Err.Description)

其中AxMapControl1.AddLayerFromFile为添加图层代码。

3)运行程序,其最终结果如下图所示:

6、其他常用属性及方法

1)获取图层数目

MsgBox("共有:" + 296e8059bcd126fff6050b59yerCount.ToString() + "个图层")其中296e8059bcd126fff6050b59yerCount是获取Map中图层的个数。

2)控制鼠标滚轮缩放

If AxMapControl1.AutoMouseWheel Then

AxMapControl1.AutoMouseWheel = False

Else

AxMapControl1.AutoMouseWheel = True

第9 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

End If

3)删除图层

AxMapControl1.DeleteLayer(1)

4)移动图层顺序

AxMapControl1.MoveLayerTo(1, 2)

5)平移地图

AxMapControl1.Pan()

6)获取到地图中的图层

Dim player As ESRI.ArcGIS.Carto.ILayer

player = AxMapControl1.get_Layer(0)

7)获取鼠标当前坐标

在Map控件的OnMouseMove事件中可以获取,如AxMapControl1_OnMouseMove 事件中添加如下代码:

Label1.Text = "X:" + e.mapX.ToString() + ",Y:" + e.mapY.ToString() 值得注意的是:mapX及mapY代表地图坐标,x和y代表窗口坐标。

8)拖选视图范围

在Map控件的OnMouseDown事件中可以获取,如AxMapControl1_OnMouseDown 事件中添加如下代码:

Dim pEn As ESRI.ArcGIS.Geometry.IEnvelope = New

ESRI.ArcGIS.Geometry.Envelope()

pEn = AxMapControl1.TrackRectangle()

AxMapControl1.Extent = pEn

则可以设置视图的范围为拖选的矩阵范围。

9)设置视图中心

Dim i As ESRI.ArcGIS.Geometry.IPoint = New

ESRI.ArcGIS.Geometry.Point()

i.PutCoords(100, 100)

AxMapControl1.CenterAt(i)

AxMapControl1.Refresh()

其中i.PutCoords(100, 100)是设置中心在(100,100),若该点为某个数据的中心,则该功能就是以该数据为中心。

7、地图放大缩小等

放大、缩小、打开文件、保存文件等ArcMap中长用的命令在ArcGIS Engine 中也可以找到对应的命令,这些命令都在controls库中。所以首先必须引用ESRI.ArcGIS.Controls。下面以放大为例:

在项目中添加ESRI.ArcGIS.Controls的引用,然后在全局定义前引用,如下:

Imports ESRI.ArcGIS.Controls

在放大按钮上添加如下代码:

Private Sub ZoomIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZoomIn.Click

Dim zoomin As ControlsMapZoomInTool = New

第10 页共119 页

ArcGIS Engine 开发实例教程 土木水电学院3S 实验室 第 11 页 共 119 页 ControlsMapZoomInTool()

zoomin.OnCreate(AxMapControl1.Object)

AxMapControl1.CurrentTool = zoomin

End Sub

其中Dim zoomin As ControlsMapZoomInTool 是定义地图放大命令,zoomin.OnCreate 是创建放大命令,AxMapControl1.CurrentTool = zoomin 是使Map 控件的当前命令按钮是zoomin 。

同理,还可以创建缩小、打开文件、保存文件等等。值得注意的是,有的时候是需要点击命令,有时候是使Map 控件的当前命令为该命令。下面是各主要命令所对应的类:

功能 类 事件

放大 ControlsMapZoomInTool 设置

CurrentTool

缩小 ControlsMapZoomOutTool 设置

CurrentTool

打开文件 ControlsOpenDocCommand OnClick() 添加数据 ControlsAddDataCommand OnClick() 全图 ControlsMapFullExtentCommand OnClick() 查找 ControlsMapFindCommand OnClick()

属性工具 ControlsMapIdentifyTool 设置

CurrentTool

选择Feature ControlsSelectFeaturesTool 设置

CurrentTool

清除选择 ControlsClearSelectionCommand OnClick() 开始编辑 ControlsEditingStartCommand OnClick() 保存编辑 ControlsEditingSaveCommand OnClick() 停止编辑 ControlsEditingStopCommand OnClick()

编辑工具 ControlsEditingEditTool 设置

CurrentTool

属性编辑命令

ControlsEditingAttributeCommand OnClick() 测量工具 ControlsMapMeasureTool 设置

CurrentTool

创建路径(网络分析)

ControlsNetworkAnalystRouteCommand OnClick() 创建路径点 ControlsNetworkAnalystCreateLocationTool 设置

CurrentTool

最短路径查询

ControlsNetworkAnalystSolveCommand OnClick() Scene 缩小 ControlsSceneExpandFOVCommand OnClick()

当然,还有很多很多其他的命令。从上面的列表比较我们也可以看出,一般来说,如果类的后缀是Command ,则用OnClick 方法;如果是Tool ,则设置Map 的CurrentTool 属性为该工具。

ArcGIS Engine开发实例教程土木水电学院3S实验室8、创建数据属性表格

首先定义一个属性数据表格显示函数ShowAttirbuteGrid(),其代码如下:Private Sub ShowAttirbuteGrid(ByVal pFeatureLayer As

ESRI.ArcGIS.Carto.IFeatureLayer, ByVal myDataGridView As DataGridView) Dim pFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass

pFeatureClass = pFeatureLayer.FeatureClass

Dim i As Integer

Dim pQuery As ESRI.ArcGIS.Geodatabase.IQueryFilter = New ESRI.ArcGIS.Geodatabase.QueryFilter()

For i = 1 To pFeatureLayer.FeatureClass.Fields.FieldCount Dim s As String= pFeatureLayer.FeatureClass.Fields.Field(i - 1).Name.ToString()

myDataGridView.Columns.Add(s, s)

Next

myDataGridView.Rows.Add(pFeatureLayer.FeatureClass.FeatureCount(pQuer y) - 1)

Dim pFeature As ESRI.ArcGIS.Geodatabase.IFeature

Dim j As Integer

For i = 0 To myDataGridView.Rows.Count - 1

pFeature = pFeatureClass.GetFeature(i)

For j = 0 To myDataGridView.Columns.Count - 1

myDataGridView.Rows(i).Cells(j).Value =

pFeature.Value(j)

Next

Next

End Sub

其中,需要说明的是:要获取某个数据文件中的某个数据的某个字段,首先获取到该数据层Layer或FeatureLayer;然后定义FeatureClass 数据集;通过FeatureLayer的FeatureClass属性获得FeatureClass 数据集;在FeatureClass中包含了每个Feature,通过FeatureClass的GetFeature属性就可以获得某个ID的Feature;Feature的属性中就包括有Fields属性,通过Fields可以找到每个Field,Field的name属性就是属性字段的名称;通过Feature的Value属性就可以获得某个字段值。

在按钮的Click事件中调用前面的函数,并添加一个DataGridView控件,代码如下:

Dim player As ESRI.ArcGIS.Carto.ILayer

player = 296e8059bcd126fff6050b59yer(0)

Dim pFeatureLayer As ESRI.ArcGIS.Carto.IFeatureLayer

pFeatureLayer = player

ShowAttirbuteGrid(pFeatureLayer, DataGridView1)

第12 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室运行,最终显示结果如下图所示:

此外,还可以改进一下,添加一个ComboBox控件,在控件上添加图层的名称,直接点击显示属性按钮就可以显示ComboBox控件中相应的图层属性表格。首先需要更改一下ShowAttirbuteGrid()函数,如下:

Private Sub ShowAttirbuteGrid(ByVal pFeatureLayer As

ESRI.ArcGIS.Carto.IFeatureLayer, ByVal myDataGridView As DataGridView) myDataGridView.Rows.Clear()

myDataGridView.Columns.Clear()

Dim pFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass

pFeatureClass = pFeatureLayer.FeatureClass

Dim i As Integer

Dim pQuery As ESRI.ArcGIS.Geodatabase.IQueryFilter = New ESRI.ArcGIS.Geodatabase.QueryFilter()

For i = 1 To pFeatureLayer.FeatureClass.Fields.FieldCount Dim s As String= pFeatureLayer.FeatureClass.Fields.Field(i - 1).Name.ToString()

myDataGridView.Columns.Add(s, s)

Next

myDataGridView.Rows.Add(pFeatureLayer.FeatureClass.FeatureCount(pQuer y) - 1)

Dim pFeature As ESRI.ArcGIS.Geodatabase.IFeature

Dim j As Integer

For i = 0 To myDataGridView.Rows.Count - 1

pFeature = pFeatureClass.GetFeature(i)

第13 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

For j = 0 To myDataGridView.Columns.Count - 1

myDataGridView.Rows(i).Cells(j).Value =

pFeature.Value(j)

Next

Next

End Sub

然后,在Form的Load事件中先添加ComboBox的Item,如下:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer

For i = 0 To 296e8059bcd126fff6050b59yerCount - 1

ComboBox1.Items.Add(296e8059bcd126fff6050b59yer(i).Name.ToString()) Next

ComboBox1.Text = ComboBox1.Items(0)

End Sub

最后,更改显示属性按钮的Click事件,如下:

Dim player As ESRI.ArcGIS.Carto.ILayer

Dim i As Integer

For i = 0 To 296e8059bcd126fff6050b59yerCount - 1

If 296e8059bcd126fff6050b59yer(i).Name = ComboBox1.Text Then player = 296e8059bcd126fff6050b59yer(i)

Exit For

End If

Next

Dim pFeatureLayer As ESRI.ArcGIS.Carto.IFeatureLayer

pFeatureLayer = player

ShowAttirbuteGrid(pFeatureLayer, DataGridView1) 运行程序,最终显示结果如下所示:

第14 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

9、缓冲分析

本例主要用到了Geoprocessor处理工具。

1)首先,添加引用AnalysisTools、Geoprocessing和Geoprocessor库,如下图所示:

第15 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

第16 页共119 页

ArcGIS Engine开发实例教程土木水电学院3S实验室

2)添加一个按钮用于缓冲分析,两个Combox控件,分别用来列出图层和缓冲数据的单位,添加一个TextBox用于输入缓冲距离,还有一个不可写的TextBox 用于显示缓冲数据保存的路径,还有一个对应的浏览按钮用于浏览缓冲数据保存的路径,最后添加一个按钮用于关闭该缓冲的面板GroupBox。如下图所示:

3)先为ComboBox2添加图层列表,在Form的Load事件中就要先为它添加,代码如下:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer

For i = 0 To 296e8059bcd126fff6050b59yerCount - 1

ComboBox2.Items.Add(296e8059bcd126fff6050b59yer(i).Name.ToString()) Next

第17 页共119 页

本文来源:https://www.bwwdw.com/article/60ye.html

Top