2012/3/5
1
桌面GIS开发(一)
DESKTOP GIS DEVELOPMENT 1
GIS开发
Email:gis.ecnu@gmail.com 桌面GIS开发
桌面GIS扩展模块开发
作用:扩展现有GIS系统功能
开发方式:
直接使用脚本语言对ArcGIS软件功能进行扩展:
ArcObjects+VBA
利用支持COM的开发语言,调用ArcObjects库,开发DLL;在
ArcGIS软件(例如ArcMap)中调用DLL,例如:
ArcObjects+Visual Basic.Net
组件式GIS开发
作用:开发独立的GIS系统
开发方式:
利用开发语言,调用ArcGIS Engine 组件和ArcObjects库,例如
:ArcGIS Engine +ArcObjects+Visual Basic.Net
不同编程语言编写代码的对比
Visual Basic
1. Dim pFLayer As
IFeatureLayer
2. Set pFLayer = New
FeatureLayer
3. Set
pFLayer.FeatureClass =
pShapefile
4. Dim pLayer As ILayer
5. Set pLayer = pFLayer
6. pLayer.Name = "Mass
Points"
C#
1. IFeatureLayer pFLayer;
2. pFLayer = new
FeatureLayerClass();
3. pFLayer.FeatureClass =
pShapefile;
4. ILayer pLayer;
5. pLayer = pFLayer as
ILayer;
6. pLayer.Name = "Mass
Points";
桌面GIS扩展模块开发(1)
内容提要
ArcGIS Desktop应用系统开发的基本方法
定制系统界面
地图与图层
数据加载
地图渲染
数据查询
数据创建与编辑
命令及工具的调用
其它组件的添加
桌面GIS扩展模块开发(1)
内容提要
ArcGIS Desktop应用系统开发的基本方法
定制系统界面
地图与图层
数据加载
地图渲染
数据查询
数据创建与编辑
命令及工具的调用
其它组件的添加
开发步骤
ArcGIS Desktop应用系统(以ArcMap为例)
启动ArcMap,进入ArcMap应用系统
根据用户需求,定制系统界面(删除和增加命令)
对新增的命令,在VBE(Visual Basic Editor)环境中通过
VBA和AO编写相应程序代码
保存系统
2012/3/5
2
进入ArcMap应用系统的方式
启动ArcMap时,有三种方式进入ArcMap应用系统:
新建一个空白文档。
选择一个模板新建文档。
打开一个已存在的地图文档。
新建一个空白文档
当选择新建一个空白文档时,系统将显示普通模板文
件(Normal.mxt)定义的界面,并加载存放在该文件
中的程序代码。
Normal.mxt是ArcMap固有的文件,存放在 Documents
and Settings\用户名\ESRI\ArcMap\Templates
(Windows XP)或者C:\Users\用户名
\AppData\Roaming\ESRI\ArcMap\Templates
(Windows 7)目录下。
新建的空白文档缺省的文件名为Untitled.mxd(无标
)。
选择一个模板新建文档
当选择一个模板新建文档时,系统首先是加载普通模
板的定制信息和程序代码,然后再加载选中模板(称
为基础模板,mxt文件)的定制信息和程序代码。
新建的文档缺省的文件名为Untitled.mxd。
打开一个已存在的地图文档
当选择打开一个已存在的地图文档时,首先是加载普
通模板的定制信息和程序代码,然后在加载基础模板
的定制信息和程序代码(如用到的话),最后是加载
项目文件本身的定制信息和程序代码。
界面定制
ArcMap提供了Customize对话框,可用于界面定制,
包括增加工具条、在工具条中增加命令、改变命令的
显示形式等。
界面定制时需要确认定制信息保存在哪个文件中。
2012/3/5
3
代码编写
在ArcMap应用系统中,
点击Alt+F11,打开VBA
编辑器
在编辑器的项目管理窗
口中,将显示普通模板
项目(Normal.mxt)和
当前的地图文档项目,
如当前地图文档应用了
基础模板,则还显示所
应用的基础模板项目
代码编写
每个项目下面都有一个ThisDocument模块,用于存放
定制命令的程序代码,此外,每个项目下面都可以新
增窗体模块、
模块和类模块,用于存放相应的程
序代码。
存放在不同项目中的代码,它们的作用范围是不一样
的。
存放在普通模板中的代码将应用到所有文档。
存放在基础模板中的代码将应用到所有利用该模板的文
档。
存放在当前地图文档中的代码只应用到该文档。
一般情况下,代码存放在当前的地图文档中。
宏的编写与运行
宏是一个子过程,可以被项目中其它代码调用,也可
以在宏对话框中直接运行。
点击Tools|Macros|Macros,将显示宏对话框,可以新
建宏并在VBE中编写代码,也可以运行已有的宏。
需要注意宏的存放位置。
宏对话框
AO编程的入口
当我们启动ArcMap,新建或打开一个地图文档(
mxd文件)时,已经有两个对象在使用,分别是:
Application对象,对应的系统已声明的变量名为
Application
MxDocument对象,对应的系统已声明的变量名为
ThisDocument
这两个对象是AO编程的入口
AO编程的入口——Application
Application指向当前应用(在ArcMap中,指向
ArcMap应用;在ArcCatolog中,指向ArcCatolog应用
),缺省的接口为IApplication接口。主要的属性与
方法:
Caption:当前应用的标题,可读写。
Name:当前应用的名称,只读。
RefreshWindow:刷新窗口。
例如:Application.Caption = "上海市环境地理信息系
统"
2012/3/5
4
AO编程的入口——ThisDocument
ThisDocument指向当前打开的地图文档,缺省的接口
为IDocument接口。主要属性与方法:
Title:标题,只读。
Type:文件类型(普通模板、基础模板、地图文档),
只读。
AddLayer:增加图层。
例如:MsgBox ThisDocument.Title
系统保存
系统可以保存为文档文件(mxd文件),也可以保存
为基础模板文件(mxt文件),此外,在界面定制和
编写代码时,可以把定制信息和程序代码保存到普通
模板文件中(Normal.mxt)。
系统保存作用范围
普通模板文件中的定制信息和程序代码是全局的,会应
用到所有的地图文档中。
基础模板文件中的定制信息和程序代码会应用到所有以
该模板为基础的地图文档中
地图文档文件的定制信息和程序代码只应用到该地图文
档
桌面GIS扩展模块开发(1)
内容提要
ArcGIS Desktop应用系统开发的基本方法
定制系统界面
地图与图层
数据加载
地图渲染
数据查询
数据创建与编辑
命令及工具的调用
其它组件的添加
系统界面的定制内容
ArcMap应用系统界面的定制包括:
菜单条( Main Menu )的定制
工具条(Toolbars)的定制
上下文菜单(Context Menu)的定制
系统界面的定制内容——菜单
ArcMap只有一个菜单条(Main Menu),是由菜单
所组成,菜单下可以包括子菜单和菜单项。菜单条的
定制包括:
新增菜单。
在已有的菜单中增加子菜单和菜单项。
更改菜单、子菜单和菜单项的属性。
2012/3/5
5
系统界面的定制内容——工具条
在ArcMap中,有许多工具条,每个工具条是相关命
令的集合。工具条的定制包括:
显示或关闭工具条
新增工具条
在工具条中增加要素(可以增加的要素包括菜单、按钮、
工具、文本框和组合框)
更改工具条组成要素的属性 组成工具条的要素
系统界面的定制内容——上下文菜单
上下文菜单(Context Menu)只有当我们右击鼠标时
才显示。
ArcMap有缺省的上下文菜单,会根据不同的情况显
示不同的上下文菜单(如在编辑状态下,选择Sketch
Tool,显示和Sketch相关的上下文菜单)。
用户可以根据不同的情况显示自定义的上下文菜单。
系统界面的定制内容
菜单条、工具条、上下文菜单和菜单实际上都是相关
命令的集合,在AO中统称为命令条(CommandBar
)。
菜单项、按钮和工具都是和应用程序相关联,统称为
命令(CommandItem)。
系统界面的定制内容
每个命令条和命令都有一个唯一标识码(Unique
Identification Number),称为GUID或UID。
UID是保存在操作系统中的一个由字母与数字组成的
32位长字符串,如New Map命令的UID{119591DB-
0255-11D2-8D20-080009EE4E51}。
在ArcGIS的开发帮助中,我们可以找到显示所有命
令条和命令的GUID
(搜索ArcMap IDs)。
GUID表
2012/3/5
6
系统界面定制的方法
通过Customize对话框
通过编程方法
通过Customize对话框
通过Customize对话框可以定义系统用户界面,包括:
新建工具条
在菜单条或工具条中加载已有的命令或新建命令
定义命令的属性
新建工具条
在Customize对话框中,点击New,然后在New
Toolbar对话框中输入工具条名称,并确定新建工具
条是保存在某个应用程序模板中,还是保存在通用模
板中(Normal.mxt)。
增加命令
新增工具条是一个空的工具条,我们可以根据需要在
工具条增加命令。
点击Customize对话框中的Commands选项卡,将显示
可以增加到工具条中的命令。其中,左边显示的是类
别,右边显示的是选中类别下的命令。
每个类别下有多个命令
增加命令
通过拖拉方式可以把选中命令增加到工具条中;同样,
通过拖拉方式可以删除工具条中命令(把工具条中的
命令拖拉到工具条之外区域)。
可以把命令拖放到工具条中
2012/3/5
7
增加命令
也可以在Customize对话框中新建命令,并增加到工
具条中。
在Categories中选择New Menu,可以新建菜单;选择
UIControls可以新建按钮、工具、文本框和组合框。
新建菜单
新建菜单方法:
在Categorie中选择New Menu,并把Commands列表中的
New Menu拖拉到工具条中作为菜单或子菜单(但不能作
为菜单项)。
只有按钮可以拖放到菜单或子菜单下作为菜单项。
新建用户界面控件
新建用户界面控件(user interface controls,简称
UIControls)方法:
在Categorie下选中UIControls,点击New UIControl,将出
现对话框用于选择UIControl类型,有四种类型UIControls:
UIButton,UITool,UIComboBox,UIEditBox。
新建用户界面控件
选择后,点击Create,一个新的UIControl将增加到
UIControls类别下的Commands列表中,但需要连接
相应程序才能实现功能。
定义命令的显示属性
选中工具条中的某个命令,右击鼠标,将出现命令显
示属性的对话框。命令可以以文本显示,也可以以
图标显示,或同时显示。可以改变显示的文本和图标。
通过编程方法
利用定制对话框定制界面方法简单,但定制的界面不能
在系统运行过程中改变。
通过编程方法定制对话框,可以动态地改变系统界面,
例如:
增加一个图层后,自动增加一个计算属性值的按钮。
点击一个要素时,显示自定义的快捷菜单。
根据用户操作情况,控制命令是否有效。
2012/3/5
8
主要的类与接口
详见Application Framework对象模型图
主要的类与接口——CommandBars类
CommandBars类
CommandBars对象是一个文档中所有有效命令条(工具
条、菜单条和快捷菜单)的集合。通过IDocument接口的
CommandBars属性可以得到当前文档的命令条集合(
CommandBars 对象)。CommandBars类只有一个接口(
ICommandBars)。
ICommandBars接口
主要的类与接口——CommandBars类
CommandBars类
ICommandBars 的Find方法可以返回当前文档中任何可用
的命令(CommandItem),它使用UID(唯一标识码)来
查找命令。由于UID不易记忆,在Normal.mxt中,有一个
ArcID模块,该模块定义了每个UID的名称,因此我们可
以通过命令的名称来得到UID,如arcid.File_AddData。
Find(identifier, [noRecurse As Boolean = False],
[noCreate As Boolean = False]) As
ICommandItem
主要的类与接口——CommandBars类
CommandBars类
ICommandBars接口的Create方法用来产生新的命令条,
有两个参数:
命令条名称
类型(工具条、菜单或快捷菜单)。
Create(Name As String, barType As
esriCmdBarType) As ICommandBar
主要的类与接口——CommandBar类
CommandBar类
CommandBar的主
要接口是
ICommandBar接口
(缺省接口)和
ICommandItem接口
。后者是把工具条
看成一个命令项,
CommandItem类也
拥有该接口。
ICommandBar接口
主要的类与接口——CommandBar类
CommandBar类
ICommandBar的Dock方法用于显示工具条。参数
dockFlags是一个枚举类,枚举类的值定义了工具条的放
置位置。
ICommandBar接口的Popup方法是以上下文菜单形式显示
命令条。
Dock(dockFlags As esriDockFlags, [referenceBar
As ICommandBar])
Popup([X As Long], [Y As Long]) As ICommandItem
2012/3/5
9
主要的类与接口——CommandBar类
CommandBar类
ICommnadBar接口的CreateMenu方法用于在命令条的指定
位置产生一个菜单。有两个参数:
Name,新建菜单名称。
Index,索引(可选)。
CreateMenu(Name As String, [Index]) As ICommandBar
主要的类与接口——CommandBar类
CommandBar类
ICommnadBar接口的CreateMacroItem方法用于把文档中
的宏加入到命令条中。参数包括:
Name:与命令一起显示的字符串。
FaceID:标准ArcGIS图标的代码(可选)。
Action :宏名(必须加宏所在的项目和模块名)。
Index:索引(可选)。
CreateMacroItem(Name As String, [FaceID], [Action As
String], [Index]) As ICommandItem
主要的类与接口——CommandItem类
CommandItem类
CommandItem的最主要
接口是ICommandItem,
通过该接口可以存取命
令的属性,如标题、按
钮图像、状态栏的消息
、工具提示、显示风格
、帮助文档的ID等。此
外,通过该接口的
Execute方法可以执行该
命令。
ICommandItem接口
查找一个工具条并显示
利用ICommandBars的Find方法和ICommandBar的
Dock方法。
Dim pToolBar As ICommandBar
Set pToolBar =
ThisDocument.CommandBars.Find(arcid.Adjustment_
AdjustmentToolBar)
pToolBar.Dock esriDockFloat
新增工具条并增加已有命令
利用CommandBars的Create方法,命令条的类型为
Toolbar。
Dim pToolBar As ICommandBar
Dim pTool As ICommandItem
Set pToolBar =
ThisDocument.CommandBars.Create("myToolBar",
esriCmdBarTypeToolbar)
Set pTool = pToolBar.Add(arcid.PanZoom_Pan)
Set pTool = pToolBar.Add(arcid.PanZoom_FullExtent)
新增工具条并增加菜单和菜单项
ICommandBar的CreateMenu和CreateMacroItem方法。
Dim pToolBar As ICommandBar
Dim pMenu As ICommandBar
Dim pTool As ICommandItem
Set pToolBar =
ThisDocument.CommandBars.Create("myToolBar2",
esriCmdBarTypeToolbar)
Set pMenu = pToolBar.CreateMenu("ShowInformation")
Set pTool = pMenu.CreateMacroItem("DocumentTitle", 1,
"Project.Module1.DocumentTitle")
2012/3/5
10
创建新的上下文菜单
利用CommandBars的Create方法,命令条的类型为
ShortcutMenu。
Dim pMenu As ICommandBar
Set pMenu =
ThisDocument.CommandBars.Create("New",
esriCmdBarTypeShortcutMenu)
pMenu.Add arcid.File_AddData
pMenu.Add arcid.File_Export
pMenu.Add arcid.File_Print
pMenu.Popup
显示不同的上下文菜单
MxDocument对象支持OnContextMenu事件(即在数
据显示区右击鼠标)。右击鼠标时,我们可以根据鼠
标位置(X、Y坐标)或其它情况显示不同上下文菜
单。
OnContextMenu事件返回一个布尔值作为结果。如果
返回的值为False,则显示标准的上下文菜单;如果
返回的值为True,则不显示标准的上下文菜单;
显示不同的上下文菜单
实例:根据用户选择的工具,显示不同的上下文菜单
。先定义一个模块级变量,在工具选择事件中,对变
量进行赋值。
Dim ContextMenu As String
Private Sub myTool_Select()
ContextMenu = "myTool"
End Sub
Private Sub myTool2_Select()
ContextMenu = "myTool2"
End Sub
Private Function MxDocument_OnContextMenu(ByVal x As
Long, ByVal y As Long) As Boolean
Dim pMenu As ICommandBar
Select Case ContextMenu
Case "myTool"
Set pMenu = ThisDocument.CommandBars.Create("myTool",
esriCmdBarTypeShortcutMenu)
pMenu.Add arcid.File_AddData
pMenu.Add arcid.File_Export
pMenu.Add arcid.File_Print
pMenu.Popup
MxDocument_OnContextMenu = True
Case "myTool2"
Set pMenu = ThisDocument.CommandBars.Create("myTool2",
esriCmdBarTypeShortcutMenu)
pMenu.Add arcid.File_Exit
pMenu.Add arcid.File_New
pMenu.Add arcid.File_LabelCache
pMenu.Popup
MxDocument_OnContextMenu = True
Case Else
MxDocument_OnContextMenu = False
End Select
End Function
获取新增工具条的UID
命令条的ID属性在ICommandItem接口,通过接口查
询方法使ICommandItem接口变量指向新增工具条。
Dim pToolBar As ICommandBar
Dim pToolBarItem As ICommandItem
Set pToolBar =
ThisDocument.CommandBars.Create("myToolBar",
esriCmdBarTypeToolbar)
Set pToolBarItem = pToolBar
MsgBox pToolBarItem.ID
2012/3/5
11
改变命令的提示信息
利用ICommandItem的Tooltip属性改变命令的提示信
息。
Dim pToolBar As ICommandBar
Dim pTool As ICommandItem
Set pToolBar =
ThisDocument.CommandBars.Create("myToolBar",
esriCmdBarTypeToolbar)
Set pTool = pToolBar.CreateMacroItem("ShowDocTitle",
1, "Project.Module1.DocumentTitle")
pTool.Tooltip ="显示文档属性"
桌面GIS扩展模块开发(1)
内容提要
ArcGIS Desktop应用系统开发的基本方法
定制系统界面
地图与图层
数据加载
地图渲染
数据查询
数据创建与编辑
命令及工具的调用
其它组件的添加
地图与图层概念
ArcMap应用是由单个MxDocument对象组成,一个
MxDocument对象可以包括多个Map对象(在ArcMap
中称为Data Frame),而每个Map可以包括多个Layer
对象。
在任何时候,只有一个Map是可见和可操作的,称为
FocusMap。可以在ArcMap中通过Activate命令使选中
Map成为FocusMap 。
地图与图层概念
ArcGIS中的图层(Layer)有多种类型,分别用于显示
不同类型数据,包括:
FeatureLayer,显示矢量数据
RasterLayer,显示栅格数据
TINLayer,显示TIN数据
CadLayer,显示CAD数据
……
最常用的Layer是FeatureLayer,即矢量图层,可以显
示Shapefile、Coverage以及Geodatabase等格式矢量数
据。
相关的类与接口
对象模型图
MxDocument类
MxDocument类的接口包
括IDocument、
IMxDocument等。预定义
变量ThisDocument的接口
是IDocument ,它提供不
同类型文档共有的属性与
方法。IMxDocument接口
提供针对地图文档的属性
与方法。
IMxDocument接口的属性与方法
2012/3/5
12
MxDocument类
IMxDocument接口的主要属性与方法:
FocusMap,返回当前地图。
SelectedLayer,返回选中的图层。
AddLayer(Layer),在当前地图中增加图层。
Map类
Map类的接口包括IMap、IActiveView等。 IMap接口
用于对Map中图层的操作及Map特性的操作。
IActiveView接口用于对Map视图的操作。
IM
ap 的属性与方法
Map类
IMap的主要属性与方法:
LayerCount,返回当前地图中的图层数。
Layer(i),返回地图中第i个图层。
Name,返回或设置地图的名称。
SpatialReference,返回或设置当前地图的空间参照。
AddLayer(Layer),增加一个图层。
DeleteLayer(Layer),删除一个图层。
ClearLayers,清除所有图层。
IActiveView接口的属性与方法
Map类
IActiveView接口的主要属性与方法:
Extent,返回或设置当前视图的范围,返回或设置的对象
是Envelope对象(矩阵)。
FullExtent,返回或设置Map中所有图层的最大范围,返
回或设置的对象是Envelope对象(矩阵)。
Refresh,刷新整个视图。
Layer类
Layer类的主要接口是ILayer接口,该接口提供了不同
类型Layer所共有的属性与方法,包括:
Name,返回或设置图层名称。
MaximumScale,返回或设置最大比例尺。
MinimumScale,返回或设置最小比例尺。
Visible,返回或设置Layer是否可见。
2012/3/5
13
ILayer接口的属性与方法
FeatureLayer类
FeatureLayer类的主要接口:
IFeatureLayer接口,是从ILayer接口继承下来的,所以
IFeatureLayer接口支持ILayer接口的所有属性和方法。另
外,它还有一些自己的属性和方法,决定它的数据源类
型、显示的字符、符号是否随比例尺变化等。
IGeoFeatureLayer接口,继承IFeatureLayer接口,用于对
FeatureLayer的地图渲染等。
FeatureLayer类
IFeatureLayer接口的主要属性与方法:
FeatureClass,返回或设置与图层关联的数据集。
Search(queryFilter, recycling ),数据查询。
其它Layer
其它Layer的接口及相应的属性与方法可查阅
“CartoObjectModel.pdf”对象模型图。
显示当前Map的空间参照名称
通过MxDocument对象的IMxDocument接口的
FocusMap属性获得当前地图对象,根据IMap接口的
SpatialReference属性空间参照对象,再根据空间参照
对象的Name属性获得当前空间参照对象的名称。
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
MsgBox pMap.SpatialReference.Name
显示当前Map的空间参照名称
改变地图的显示范围
Map对象的IActiveView接口的Extent属性返回
Envelope对象(IEnvelope接口)。
IEnvelope接口有Height、Width、Xmin、Xmax、
Ymin、Ymax等属性,有Expand、Offset、CenterAt等
方法。
通过IEnvelope接口的属性与方法可以改变Envelope对
象的大小和位置,把新的Envelope对象赋给Map对象
的Extent属性,将改变地图的显示范围。
要重新显示地图,需要对当前视图进行刷新,可通过
IActiveView接口的Refresh方法。
2012/3/5
14
Dim pMxDoc As IMxDocument
Dim pActiveView As IActiveView
Dim pExtent As IEnvelope
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Set pActiveView = pMap
Set pExtent = pActiveView.Extent
pExtent.Expand 0.5, 0.5, True
pActiveView.Extent = pExtent
pActiveView.Refresh
地图放大
显示选中图层的名称
利用IMxDocument的SelectedLayer属性获得选中图层
,利用ILayer的Name属性获得图层的名称。
执行命令时,用户可能没有选中图层,需要增加一个
判断语句(对象变量没有引用,则返回Nothing)。
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pLayer As ILayer
Set pLayer = pMxDoc.SelectedLayer
If Not pLayer Is Nothing Then
MsgBox pLayer.Name
Else
MsgBox "No selected layer"
End If
显示选中图层的名称
设置图层的最大和最小比例尺
通过设置图层的最大和最小比例尺,可以根据地图的
显示比例尺控制图层是否显示。
如定义了最大比例尺(Maximum Scale),当地图的显示
比例尺大于最大比例尺时,该图层不显示。
如定义了最小比例尺(Minimum Scale),当地图的比例
尺小于最小比例尺时,该图层不显示。
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pLayer As ILayer
Set pLayer = pMap.Layer(0)
pLayer.MinimumScale = 50000000
Dim pActiveView As IActiveView
Set pActiveView = pMap
pActiveView.Refresh
设置图层的最小比例尺
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pLayer As ILayer
Set pLayer = pMap.Layer(0)
pLayer.MaximumScale = 10000000
Dim pActiveView As IActiveView
Set pActiveView = pMap
pActiveView.Refresh
设置图层的最大比例尺
2012/3/5
15
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pLayer As ILayer
Set pLayer = pMap.Layer(0)
pLayer.MaximumScale = Empty
pLayer.MinimumScale = Empty
Dim pActiveView As IActiveView
Set pActiveView = pMap
pActiveView.Refresh
清除比例尺设置
创建新图层并增加到地图集合中
在AO中,Layer是一个抽象类,是不能创建的,但它
的子类(FeatureLayer、RasterLayer、TinLayer等)都
可以用New关键字创建。
利用ILayer接口的Name属性可以对图层进行命名。
利用Map对象的AddLayer方法可以把新创建的图层加
到地图集合中。新创建的图层是一个空的图层。
Dim pFLayer As ILayer
Set pFLayer = New FeatureLayer
pFLayer.Name = "Shanghai Map"
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap
pMap.AddLayer pFLayer
桌面GIS扩展模块开发(1)
内容提要
ArcGIS Desktop应用系统开发的基本方法
定制系统界面
地图与图层
数据加载
地图渲染
数据查询
数据创建与编辑
命令及工具的调用
其它组件的添加
数据类型与存储
GIS中的数据主要有以下几种类型:
矢量数据
栅格数据
TIN数据
表格数据
关系数据
……
数据的存储位置(路径或数据库)统称为工作空间
(Workspace)。
数据类型与存储
ArcGIS支持多种形式的数据存储方式,包括:
Shapefile文件形式,存储矢量数据。一个矢量数据有多个
文件,存放在同一路径下。
Raster文件形式,存储栅格数据,有GRID、 TIFF、JPEG
、ERDAS IMAGINE等格式,相关文件存放在同一路径下
。
TIN文件形式,存储TIN数据。一个TIN数据实际上是一
个文件夹,文件夹中包含相关文件。
Personal Geodatabase形式,存储矢量、栅格、TIN等数据
,所有数据存放在Access数据库。
SDE Geodatabase形式,存储矢量、栅格、TIN等数据,
所有数据存放在SDE数据库。
……
2012/3/5
16
相关的类与接口 Workspace类
数据的存储位置称为Workspace,可以是一个路径或
数据库。访问磁盘上数据的第一步就是要确定
Workspace对象,一旦确定了一个Workspace,就可以
访问其中的数据。
Workspace类是一个规则Class(可实例化,但不能创
建)。因此,必须要通过其它对象获取该类的对象。
为了获得一个现存的Workspace,要用
WorkspaceFactory对象实例化一个Workspace。
Workspace类
Workspace的类型:
File system Workspace
Shapefile Workspace
Raster Workspace
Tin Workspace
CAD Workspace
VPF Workspace
……
Local database Workspace
Remote database Workspace
同一个路径下可以有不同类型的数据,如Shapefile 、Raster、
Tin等,但访问不同类型的数据,必须要定义不同的工作空间。
WorkspaceFactory类
WorkspaceFactory是抽象类,它有
AccessWorkspaceFactory、
TinWorkspaceFactory、
ShapefileWorkspaceFactory等可新建的
子类,这些子类都具有
IWorkspaceFactory接口。
WorkspaceFactory的子类
WorkspaceFactory类
利用IWorkspaceFactory接口的OpenFromFile方法可以
创建一个工作空间。该方法返回的Workspace对象的
类型是和WorkspaceFactory类型相对应的,缺省的接
口均为IWorkspace接口,但同时具有相应的其它接口,
如Shapefile Workspace具有IFeatureWorkspace;Raster
Workspace具有IRasterWorkspace接口;Tin Workspace
具有ITinWorkspace。
OpenFromFile(fileName As String, hWnd As
OLE_HANDLE) As IWorkspace
IFeatureWorkspace接口
IFeatureWorkspace接口的OpenFeatureClass方法用于
打开当前工作空间下的要素类(矢量数据),该方法
返回FeatureClass对象。
OpenFeatureClass(Name As String) As IFeatureClass
2012/3/5
17
IRasterWorkspace接口
IRasterWorkspace接口的OpenRasterDataset方法用于
打开当前工作空间下的栅格数据,该方法返回
RasterDataset对象。
OpenRasterDataset(Name As String) As IRasterDataset
ITinWorkspace接口
ITinWorkspace接口的OpenTin(“文件名”)方法用于打
开当前工作空间下的TIN数据,该方法返回TIN对象。
OpenTin(Name As String) As ITin
图层与数据进行关联
矢量图层与数据关联
Set pFLayer.FeatureClass = 数据
栅格图层与数据关联
pRLayer.CreateFromDataset 数据
TIN图层与数据关联
Set pTLayer.Dataset = 数据
注意:栅格图层与数据的关联与矢量图层和TIN图层有所不同。
加载Shapefile数据
步骤:
新建ShapefileWorkspaceFactory对象。
利用OpenFromFile方法产生一个工作空间。
利用IFeatureWorkspace接口的OpenFeatureClass方法打开
要加载的Shapefile图层数据,并赋值给新建的矢量图层。
利用IMxDocument的AddLayer把新建图层加载到当前Map
中。
利用ILayer的Name属性对图层的名称进行赋值。
Dim pWFactory As IWorkspaceFactory
Set pWFactory = New ShapefileWorkspaceFactory
Dim pWorkspace As IWorkspace
Set pWorkspace =
pWFactory.OpenFromFile("D:\MGIS\mgisdata\BlackHills", 0)
Dim pFWorkspace As IFeatureWorkspace
Set pFWorkspace = pWorkspace
Dim pShapefile As IFeatureClass
Set pShapefile = pFWorkspace.OpenFeatureClass("bhrain3")
Dim pFLayer As IFeatureLayer
Set pFLayer = New FeatureLayer
Set pFLayer.FeatureClass = pShapefile
Dim pLayer As ILayer
Set pLayer = pFLayer
pLayer.Name = "bhrain3"
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
pMxDoc.AddLayer pFLayer
2012/3/5
18
加载文件夹中栅格数据
步骤:
新建RasterWorkspaceFactory对象。
利用OpenFromFile方法产生一个工作空间。
利用IRasterWorkspace接口的OpenRasterDataset方法打开
要加载的栅格数据,并赋值给新建的栅格图层。
利用IMxDocument的AddLayer把新建图层加载到当前Map
中。
利用ILayer的Name属性对图层的名称进行赋值。
Dim pWFactory As IWorkspaceFactory
Set pWFactory = New RasterWorkspaceFactory
Dim pWorkspace As IWorkspace
Set pWorkspace =
pWFactory.OpenFromFile("E:\GIS\DATA\AddData", 0)
Dim pRWorkspace As IRasterWorkspace
Set pRWorkspace = pWorkspace
Dim pRasterfile As IRasterDataset
Set pRasterfile =
pRWorkspace.OpenRasterDataset("Photo.sid")
Dim pRLayer As IRasterLayer
Set pRLayer = New RasterLayer
pRLayer.CreateFromDataset pRasterfile
Dim pLayer As ILayer
Set pLayer = pRLayer
pLayer.Name = "Photo“
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
pMxDoc.AddLayer pRLayer
加载文件夹中的TIN数据
步骤:
新建TinWorkspaceFactory对象。
利用OpenFromFile方法产生一个工作空间。
利用ITinWorkspace接口的OpenTin方法打开要加载的TIN
数据,并赋值给新建的TIN图层。
利用IMxDocument的AddLayer把新建图层加载到当前Map
中。
利用ILayer的Name属性对图层的名称进行赋值。
Dim pWFactory As IWorkspaceFactory
Set pWFactory = New TinWorkspaceFactory
Dim pWorkspace As IWorkspace
Set pWorkspace =
pWFactory.OpenFromFile("E:\GIS\DATA\AddData", 0)
Dim pTWorkspace As ITinWorkspace
Set pTWorkspace = pWorkspace
Dim pTin As ITin
Set pTin = pTWorkspace.OpenTin("dtm_tin")
Dim pTLayer As ITinLayer
Set pTLayer = New TinLayer
Set pTLayer.Dataset = pTin
Dim pLayer As ILayer
Set pLayer = pTLayer
pLayer.Name = "dtm_tin"
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
pMxDoc.AddLayer pTLayer
2012/3/5
19
加载Access数据库中的数据
步骤:
新建AccessWorkspaceFactory对象。
利用OpenFromFile方法产生一个工作空间。
如要打开矢量数据,则利用IFeatureWorkspace接口的
OpenFeatureClass方法;如要打开栅格数据,则利用
IRasterWorkspaceEx接口的OpenRasterDataset方法
利用IMxDocument的AddLayer把新建图层加载到当前Map
中。
利用ILayer的Name属性对图层的名称进行赋值。
Dim pWFactory As IWorkspaceFactory
Set pWFactory = New AccessWorkspaceFactory
Dim pWorkspace As IWorkspace
Set pWorkspace =
pWFactory.OpenFromFile("E:\GIS\DATA\myGeodatabas
e.mdb", 0)
Dim pFWorkspace As IFeatureWorkspace
Set pFWorkspace = pWorkspace
Dim pShapefile As IFeatureClass
Set pShapefile =
pFWorkspace.OpenFeatureClass("Parcels")
Dim pFLayer As IFeatureLayer
Set pFLayer = New FeatureLayer
Set pFLayer.FeatureClass = pShapefile
Dim pRWorkspace As IRasterWorkspaceEx
Set pRWorkspace = pWorkspace
Dim pRasterfile As IRasterDataset
Set pRasterfile =
pRWorkspace.OpenRasterDataset("manhattan1890")
Dim pRLayer As IRasterLayer
Set pRLayer = New RasterLayer
pRLayer.CreateFromDataset pRasterfile
Dim pMxDoc