2012/5/5
1
桌面GIS开发(三)
DESKTOP GIS DEVELOPMENT 3
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
组件式GIS开发
组件式软件技术是当前软件技术的潮流之一
组件式GIS的基本思想
把GIS的各大功能模块划分为几个控件,控件如同一堆各
式各样的积木,每个控件完成不同的功能
各个GIS控件之间,以及GIS控件与其它非GIS控件之间,
可以方便地通过可视化的软件开发工具集成起来,形成
最终的GIS应用。如同根据需要把实现各种功能的“积木”
搭建起来,构成GIS应用系统
ArcGIS Engine
ArcGIS Engine(简称AE)是ESRI公司开发的用于组
件式GIS开发的工具包。
非终端用户软件
包括一系列用于开发的GIS控件
ESRI公司对于ArcGIS Engine的定位:ArcGIS Engine
is a complete library of embeddable geographic
information system (GIS) components for developers to
build custom applications,可以方便的将GIS功能嵌入
自己的应用中
ArcGIS Engine基于AO
ArcGIS Engine
ArcGIS Engine由开发工具包和运行时环境组成
开发工具包:用于GIS开发的主体,利用基于AO的
组件构建自定义的应用软件,主要包括
基本功能
数据存取
地图表达
开发组件
运行时环境(ArcGIS Engine Runtime):已开发的
GIS程序在其它机器上安装运行时,必须有Engine的
运行时环境。
AO库
ArcGIS Engine的特点
的GIS框架
基于ArcObjects,与ESRI系列软件拥有相同的开发基础
在原有强大的GIS功能基础上进行功能扩展
成本适宜的配置
开发者:一套开发工具
使用者:多个Runtime授权
支持跨平台、跨开发语言开发
Windows、Linux、Unix
.Net、C++、Java
2012/5/5
2
ArcGIS Engine的安装
根据不同的开发平台安装不同的ArcGIS Engine
Developer Kit
若使用.NET开发,需要先安装Microsoft Visual Studio
2008,再安装ArcGIS Engine SDK for the Microsoft
.NET Framework
ArcGIS Engine的安装
ArcGIS Engine的安装
软件授权(ESRI公司的授权文件后缀名为ecp)
ArcGIS Engine控件
ArcGIS Engine控件是嵌入式控件,可以添加到编译
环境的窗口和对话框中,并且开发者可以方便地设置
控件的属性。
主要控件包括:
MapControl
PageLayoutControl
TOCControl
ToolbarControl
SceneControl
GlobeControl
LicenseControl
SymbologyControl
……
ArcGIS Engine控件
MapControl控件用于地图数据的可视化显示,提供类
似于ArcMap中的Data View地图显示窗口
主要功能有:
显示地图
放大、缩小、漫游
生成图形元素
显示Lable
识别地图上被选中
的元素
空间、属性查询
ArcGIS Engine控件
PageLayoutControl控件
用于地图数据的可视化显示,提供类似于ArcMap中的
Layout View地图显示窗口
主要功能:
添加设置地图
要素(图例、比
例尺、指北针等)
地图的打印与输出
2012/5/5
3
ArcGIS Engine控件
TOCControl控件
提供类似于ArcMap中的Table of Contents的功能,需要和
一个MapControl配合工作
主要功能有:
图层管理
符号显示与设置
ArcGIS Engine控件
ToolbarControl控件
提供类似于ArcMap中的工具条、命令、菜单、状态栏等
功能,需要和一个MapControl配合工作
主要功能有:
菜单设置
工具条设置
工具条中命令的
设置
ArcGIS Engine控件
SceneControl控件和GlobeControl控件
使用SceneControl控件和GlobeControl控件必须具有
ArcGIS Engine的3D分析选项授权
SceneControl控件和GlobeContro控件分别与ArcScene和
ArcGlobe相对应
主要功能:三维场景的显示
ArcGIS Engine控件
LicenseControl控件
用于初始化应用程序的License,使得相应应用程序在其
它机器上可以正常使用
SymbologyControl控件
提供类似于ArcMap中
地图符号选择的对话框
使用AE开发第一个独立的GIS系统
第一步:新建工程
VS 2008 >File>New>Project>Visual
Basic>ArcGIS>Engine>Windows Application
输入工程名称,选择保存位置
第二步:添加引用(Add Reference)
使用AE开发第一个独立的GIS系统
第三步:License Checking
2012/5/5
4
使用AE开发第一个独立的GIS系统
第四步:在Form1.vb中添加AE控件并设置属性
LicenseInitializer.vb包含License初始化所需要的代码
ApplicationEvents.vb包含系统启动、退出等事件
Form1.vb是一个Windows窗体,也是当前系统的默认启动
窗体,在Form1.vb中可以添加所需要的AE控件
使用AE开发第一个独立的GIS系统
第四步(续)
添加MapControl控件
并设置属性,其中
Map Document用于
设置默认打开的mxd
文档
MapControl的名称(
Name)为
AxMapControl1
使用AE开发第一个独立的GIS系统
第四步(续)
添加两个ToolbarControl控
件并设置属性,一个
ToolbarControl控件作为菜
单,另一个作为工具条。
属性设置General标签下
Buddy属性需要选择已添
加的MapControl:
AxMapControl1;Items标
签下可以利用Add增加菜
单和命令。
使用AE开发第一个独立的GIS系统
第四步(续)
添加TOCControl控件
并设置属性,其中
General标签下Buddy
属性需要选择已添加
的MapControl:
AxMapControl1
第五步:编译运行程
序
添加自定义命令
示例:自定义命令实现点击放大
在Solution Explorer中右击工程名称,选择Add>New
Item>ArcGIS>Base Command
注意:需选择MapControl or
PageLayoutControl Command
其余设置与在.Net环境中开发
ArcMap扩展模块中的自定义
命令类似
添加自定义命令
更改图标、编写代码重写构造函数、编写代码实现功
能
更改图标、重写构造函数的方法与在.Net环境中开发
ArcMap扩展模块相似
编写代码可以利用ArcGIS Snippets功能,插入函数:
ArcGIS Engine > Mapping > Zoom by Ratio;在OnClick()
中添加调用代码:
2012/5/5
5
代码对比
‘VBA放大及获取FocusMap
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
‘Engine+VB.Net放大
Dim pActiveView As IActiveView =
Form1.AxMapControl1.ActiveView
ZoomByRatio(pActiveView, 0.5)
‘Engine+VB.Net获取FocusMap
Dim pActiveView As IActiveView =
Form1.AxMapControl1.ActiveView
Dim pMap As IMap =
pActiveView.FocusMap
添加自定义命令
在Form1的Form1_Load的事件中添加代码,把自定义
的命令添加到工具条中
Dim btnZoomIn As ZoomIn = New ZoomIn()
AxToolbarControl2.AddItem(btnZoomIn)
添加自定义命令
AxToolbarControl2.AddItem(btnZoomIn, -1, -1, True,
0, esriCommandStyles.esriCommandStyleIconOnly)
使用MapControl Application
新建工程
VS 2008 > File > New > Project > Visual Basic > ArcGIS >
Engine > MapControl Application
输入工程名称,选择保存位置
工程组成
MainForm.vb——包含
MapControl和TOCControl的
主窗口
Earth.ico——系统图标
CreateNewDocument.vb——
新建地图文档的命令
使用MapControl Application模板
MainForm
MapControlTOCControl
ToolbarControl
MenuStrip(Windows控件)
StatusStrip(Windows控件)
使用MapControl Application模板
MainForm代码解读
MainForm_Load
axMapControl1_OnMapReplaced
axMapControl1_OnMouseMove
#Region "Main Menu event handlers“
2012/5/5
6
示例:改变点符号颜色
在MenuStrip控件上添加自定义菜单项,点击后将点
符号的颜色改变为红色
步骤:
在MenuStrip上添加新菜单,设置新菜单项。
新建一个颜色对象,通过R、G、B赋值定义对象的颜色。
新建一个符号对象(和原有符号对象的样式相一致,如
SimpleMarkerSymbol),把新建的颜色赋给符号对象的
Color属性。
新建一个Renderer对象(如SimpleRenderer),把新建的
符号赋给Renderer对象的符号属性。
获得需要改变颜色的图层(FeatureLayer),把新建的
SimpleRenderer赋给图层的Renderer属性。
刷新MapControl和TOCControl对象。
Dim pColor As IRgbColor = New RgbColor
pColor.Red = 255
pColor.Green = 0
pColor.Blue = 0
Dim pMarkerSym As ISimpleMarkerSymbol = New
SimpleMarkerSymbol
pMarkerSym.Color = pColor
Dim pRenderer As ISimpleRenderer = New
SimpleRenderer
pRenderer.Symbol = CType(pMarkerSym, ISymbol)
Dim pActiveView As IActiveView =
axMapControl1.ActiveView
Dim pMap As IMap = pActiveView.FocusMap
Dim pGFLayer As IGeoFeatureLayer
pGFLayer = CType(pMap.Layer(0),
IGeoFeatureLayer)
pGFLayer.Renderer = CType(pRenderer,
IFeatureRenderer)
axMapControl1.Refresh()
axTOCControl1.Update()
示例:右击TOC图层选择并更改符号
SymbologyControl控件
LoadStyleFile方法:用于加载样式库(后缀为.ServerStyle
文件)。例如:
AxSymbologyControl1.LoadStyleFile(ArcGISInstallPath +
"\Styles\ESRI.ServerStyle")
OnItemSelected事件:在当前被选中的符号发生改变时触
发此事件。
StyleClass属性:用于设置加载符号的类别,其值在
esriSymbologyStyleClass枚举类中定义。
SymbologyControl中每个符号,均对应一个
IStyleGalleryItem
示例:右击TOC图层选择并更改符号
TOCControl控件
HitTest方法:返回TOC中某个特定位置(x,y)的组成
元素。
X,Y为坐标;ItemType为esriTOCControlItem枚举类,表示
该组成元素的类型 (none, map, layer, heading或者legend
class);BasicMap为Imap;Layer为Ilayer;Unk为
ILegendGroup;Data为Variant类型,表示图层序号.
示例:右击TOC图层选择并更改符号
IStyleGalleryItem接口
Name属性:该符号显示在SymbologyControl中的名称
Item属性:该符号对应的Symbol对象
2012/5/5
7
示例:右击TOC图层选择并更改符号
具体步骤
新建frmSymbol窗体,并设置对应的控件(
SymbologyControl、Button等)。
在TOCControl的OnMouseDown事件中,编写代码,获取
鼠标右击时的图层类型和符号。
在frmSymbol新建(New)或者载入(load事件)时,根
据TOCControl获取的图层类型和符号,在
SymbologyControl中根据载入对应的符号库。
根据SymbologyControl中选择的符号,设置当前图层的符
号。
刷新视图和图例。
程序代码参考帮助中的示例:Change layer rendering
using the SymbologyControl
示例:设置鹰眼图
程序中需添加两个MapControl,其中一个用作地图显
示(Name:MapDisp),另一个用作鹰眼图(Name
:MapWatch)
在MapDisp中加载用于地图显示的mxd,在MapWatch
中加载用作鹰眼图的mxd
一般而言,用于鹰眼图的mxd应相对比较简单
加载mxd代码:
AxMapControl1.LoadMxFile(路径)
设置鹰眼图
在MapDisp的OnExtentUpdated事件中添加代码,用于
在MapDisp显示地图的范围改变时,在MapWatch中
绘制出对应区域
Dim pEnvelope As IEnvelope = CType(e.newEnvelope, IEnvelope)
Dim pGra As IGraphicsContainer = MapWatch.Map
Dim pActiveView As IActiveView = pGra
pGra.DeleteAllElements()
Dim pRectangleEle As IRectangleElement = New
RectangleElementClass()
Dim pElement As IElement = pRectangleEle
pElement.Geometry = pEnvelope
Dim pLineColor As IRgbColor = New RgbColorClass()
pLineColor.Red = 255
pLineColor.Green = 0
pLineColor.Blue = 0
Dim pOutline As ILineSymbol = New SimpleLineSymbolClass()
pOutline.Color = pLineColor
pOutline.Width = 2
Dim pFillColor As IRgbColor = New RgbColorClass()
pFillColor.Transparency = 0
Dim pFillSymbol As IFillSymbol = New SimpleFillSymbolClass()
pFillSymbol.Color = pFillColor
pFillSymbol.Outline = pOutline
Dim pFillShapeEle As IFillShapeElement = pElement
pFillShapeEle.Symbol = pFillSymbol
pGra.AddElement(pFillShapeEle, 0)
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, Nothing,
Nothing)
设置鹰眼图
设置MapWatch属性,将AutoMouseWheel设置为False
在MapWatch的MouseDown事件中添加代码,实现在
MapWatch上点击和拉框的操作可以改变MapDisp的
视图范围
Dim pEnvelope As IEnvelope
Dim pFeedEnvelope As IEnvelope = MapWatch.TrackRectangle()
Dim eWidth As Double = 0
Dim eHeight As Double = 0
Dim pGraphicsContainer As IGraphicsContainer = MapDisp.Map
If Not pFeedEnvelope Is Nothing Then
pGraphicsContainer.DeleteAllElements()
If Not pFeedEnvelope.IsEmpty Then
eWidth = pFeedEnvelope.Width
eHeight = pFeedEnvelope.Height
End If
If eWidth = 0 Or eHeight = 0 Then
Dim
As IPoint = New PointClass()
pPt.PutCoords(e.mapX, e.mapY)
MapDisp.CenterAt(pPt)
Else
pEnvelope = pFeedEnvelope
MapDisp.Extent = pEnvelope
End If
End If
2012/5/5
8
示例:IDW插值
综合使用所讲的编程知识,进行自定义窗体的设计,
实现IDW插值。
要点:
License项目的修改
自定义窗体的设计
参数传递
获取相关的图层及字段
加载新图层