截图
简介
这是一个关于地理信息系统基本功能开发技术介绍PPT,这节课主要是了解ArcGIS开发平台介绍 ArcGIS Engine的组件 GIS基本功能开发 信息检索功能的设计与实现等介绍。地理信息系统有时又称为“地学信息系统”或“资源与环境信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。地理信息系统是一门综合性学科,结合地理学与地图学,已经广泛的应用在不同的领域,是用于输入、存储、查询、分析和显示地理数据的计算机系统,也有称GIS为“地理信息科学”,欢迎点击下载地理信息系统基本功能开发技术介绍PPT哦。
地理信息系统基本功能开发技术介绍PPT是由红软PPT免费下载网推荐的一款地理课件PPT类型的PowerPoint.
GIS设计与开发
第二章GIS基本功能开发技术
主要内容
ArcGIS开发平台介绍
ArcGIS Engine的组件
GIS基本功能开发
信息检索功能的设计与实现
1,ArcGIS 产品组成
四个关键部分:
1,ArcGIS 9产品组成
2,ArcObjects与ArcGIS产品
2,ArcObjects与ArcGIS产品
3,ArcObjects组件库
ArcObjects组件库有3000多个对象可供开发人员调用,其中有细粒度的小对象,例如:Geometry对象,也有粗粒度的大对象,例如:Map对象
可以通过ArcObjects来扩展ArcGIS Desktop,定制ArcGIS Engine应用,使用ArcGIS Server实现企业级GIS应用
采用ArcObjects可以在多种编程环境中开发,包括C++、支持COM的编程语言、.NET、Java等
3,ArcObjects组件库
可以应用ArcGIS Desktop SDK来扩展ArcGIS Desktop的功能,如添加新的工具、定制用户界面、增加新的扩展模块等,甚至对ArcGIS Desktop应用程序进行完全扩展以提高专业GIS生产能力
ArcGIS Server实现了一套标准的Web GIS服务,支持企业级应用,可以建立集中式的GIS服务器来实现GIS功能,发布基于Web的GIS应用,执行分布式GIS运算等
2.1.2 ArcGIS的开发方式
1)VBA开发
VBA自动包含了ESRI对象库参考,用户可以编写并调试在ArcMap或ArcCatalog中使用的VB宏以及ESRI的对象库,宏命令可以将VB的功能和GIS的功能集成起来。
可以使用ArcObjects的所有组;
其运行离不开ArcGIS系统框架;
2.1.2 ArcGIS的开发方式
2)插件开发
采用COM技术开发基于AE的标准DLL
3)基于COM的可执行应用程序开发
2.1.3 ArcGIS Engine简介
ArcGIS Engine是一个简单的、独立于应用程序的ArcObjects编程环境。其SDK提供了一系列嵌入式、应用于ArcGIS Desktop应用程序框架之外的ArcGIS组件。
ArcGIS Engine是开发人员用于建立自定义应用程序的嵌入式GIS组件的一个完整类库
一,ArcGIS Engine的功能
分图层显示专题图,如:道路,河流,行政边界等
浏览、缩放地图
查看地图上特征要素的信息
在地图上显示文本注记
在地图上叠加卫星影像或航摄影像
在地图上绘制点、线、面几何体
通过矩形、圆形或多边形选中地图上的要素
通过SQL语句查找要素
用各种渲染方式绘制图层,如分级渲染、柱状图渲染、点密度渲染、按比例尺渲染等
动态绘制实时数据
转换空间数据的坐标系
编辑空间数据
空间建模与分析
二,ArcGIS Engine的组成
基本服务-几乎所有GIS应用程序都需要的GIS核心模块ArcObjects构成,如几何要素和显示
数据存取-可以对栅格和矢量格式,包括Geodatabase进行数据的存取操作
地图表达-创建和显示带有符号、注记的地图和专题图
开发组件-快速开发应用程序的界面控件
扩展模块-ArcGIS Engine运行时,可以与标准功能或其他高级功能一起部署
二,ArcGIS Engine的组成
ArcGIS Engine Developer Kit
是一个基于组件的开发产品,主要面向开发人员,能与开发环境集成,提供了开发帮助、类库对象模型以及代码示例等
ArcGIS Engine的另一个组件就是其运行时。在部署应用程序时,必须安装相应版本的ArcGIS Engine运行时
二,ArcGIS Engine的组成
ArcGIS Engine的授权文件
*.ecp文件
授权文件控制用户可以使用哪些功能
例如:编辑空间数据
ArcGIS Engine开发包使得用户可以创建、修改或者删除在Geodatabase或者shapefile中的矢量要素。
标准ArcGIS Engine Runtime可以编辑shapefile和简单的Personal Geodatabase要素,若需要编辑Enterprise Geodatabase数据,则应使用Geodatabase Update扩展
第二节,ArcGIS Engine的组件
一,ArcGIS Engine包含的主要控件:
MapControl
PageLayoutControl
SceneControl
GlobeControl
ToolbarControl
TOCControl
SymbologyControl
LicenseControl
ToolbarControl
二,组件的加载
示例:
如何使用MapControl, ToolbarControl, TOCControl
如何向工具栏添加ArcGIS Engine内置的工具和命令
三,MapControl控件
MapControl的功能
管理控件的外观、显示属性和地图属性
添加并管理控件中的数据层
装载Map文档(mxd)到控件中
从其他应用程序拖放数据到控件中
显示绘制图形
实现的主要接口
IMapControlDefault
IMapControl2
IMapControl3
IMapControlEvents2(事件接口)
三,MapControl控件
IMapControlDefault接口
该接口是地图控件的缺省接口,多数开发环境自动使用这个接口定义的属性、方法,这个接口也代表了控件最新版本的接口
如果需要使用这个接口,则用如下代码:
IMapControlDefault pMapControl;
pMapControl = axMapControl1.Object as IMapControlDefault;
三,MapControl控件
IMapControl2接口
这个接口是任何一个与MapControl相关的任务的出发点,如设置控件外观,设置Map对象或控件的显示属性,添加或者管理数据图层、地图文档,在控件上绘制图形和返回Geometry等
控制控件外观界面的属性:
Appearance、BorderStyle、BackColor
方法:
获取Geometry对象:TrackLine, TrackPolygon, TrackRectangle, TrackCircle
在控件上绘制图形:DrawShape,DrawText
三,MapControl控件
IMapControl3接口
该接口继承于IMapControl2,增加了8个属性和1个方法
CustomProperty:设置自定义控件属性
DocumentFilename:返回MapControl装入的地图文档的文件名
DocumentMap:返回MapControl最后装入的地图名称
KeyIntercept:返回或设置MapControl截取键盘按键的信息
Object:返回潜在的MapControl控件
三,MapControl控件
当使用IMapControl2接口时:
IMapControl2 pMapControl;
pMapControl = axMapControl1.Object as IMapControl2;
或
pMapControl = axMapControl1.GetOcx() as IMapControl2;
三,MapControl控件
ShowMapTips:确定是否显示地图的Map Tips
TipDelay:设置Map Tips的延迟时间
TipStyle:设置Map Tips的显示样式
SuppressResizeDrawing():当控件尺寸发生变化时组织数据实时重绘
三,MapControl控件
IMapControlEvents2接口
事件接口,定义了MapControl能够处理的全部事件,如OnMouseDown, OnAfterDraw, OnMouseMove等,其他如OnAfterscreenDraw是绘屏结束后触发的事件,OnExtentUpdated是地图的Extent属性发生变化时触发的事件
四,PageLayoutControl控件
1)Page对象
---管理PageLayout对象中页面
2)SnapGrid对象
---用于摆放元素而设置的辅助点,便于使用者对齐元素
3)RulerSettings对象
---辅助尺
4)MapSurround对象
五,ToolbarControl控件
主要用于提供操作地图对象的工具条,是一个集成多种控制地图操作的控件。
ToolbarControl上添加工具
1)通过向导添加;
2)通过代码添加;
五,ToolbarControl控件
主要接口:IToolbarControl,
IToolbarControlDefault
IToolbarControlEvents
ToolbarControl上可以驻留三类命令:
1)实现了Icommand的单击命令;
2)实现了ICommand和ITool的命令工具;
3)实现了ICommand和IToolControl接口的工具控件,用户界面组件;
六,TOCControl控件
是一个集成图层控制操作的控件,一般是通过与其他几个地图显示控件相互关联一起工作。
SetBuddyControl(object obj)
TOCControl通过上述函数来关联其他控件。
string strToolID = "";
strToolID = "esriControlTools.ControlsMapZoomInTool";
this.axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomOutTool";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomInFixedCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomOutFixedCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapPanTool";
this.axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapFullExtentCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomToLastExtentBackCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomToLastExtentForwardCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
第二节,ArcGIS Engine的组件
2.2.7控件之间的关联
1)通过向导关联
2)通过代码关联
七,控件之间的关联
示例1:
1)通过向导关联
七,控件之间的关联
示例2:
2)通过代码关联
SetBuddyControl(Object 被关联控件);
第三节 GIS基本功能的设计开发
2.3.1图层的加载
在ArcEngine中需要使用MapControl来显示地理数据,用TOCControl进行图层操作。
MapControl控件中可以添加各种常用数据格式,如:SHP、mdb、CAD数据、Coverage数据、TIN数据等。
Shapefile数据是一种比较常用的,而且是容易获得(从其他格式的数据转换而来)的文件数据格式。
Shapefile采用早期的dBase数据的管理模式,即以文件夹作为数据库,文件夹下的文件组成了数据库中的表,对于Shapefile文件来说就是图层。
一个Shapefile图层至少需要三个文件:*.SHP,*.SHX,*.DBF,它们分别用于存储空间数据、空间索引信息和属性数据。
使用属性向MapControl中添加图层
在窗体上添加MapControl控件成功后,在控件上点击右击查看其属性框。打开属性对话框的”Map”选项卡,点击 按钮可以任意加载几个图层。
使用程序动态地添加图层
图层的常规加载方法
首先向工程里添加如下引用:
ESRI.ArcGIS.DataSourcesFile;
ESRI.ArcGIS.GeoDataBase;
ESRI.ArcGIS.Carto;
打开图层的常用步骤:
1.创建一个类工厂
2.使用类工厂创建一个要使用的工作区
3.使用工作区打开并得到图层的dataset
4.把dataset装入到新建的图层实例
5.把图层加载到MapControl控件
涉及的类和接口
相关类说明
WorkSpace类
WorkSpace类是一个包含空间数据集和非空间数据集的数据容器。根据数据集的物理存储形式可以分为三种类型:
1) 基于文件形式的FileSystemWorkspace
2) 基于本地数据库文件形式的LocalDatabaseWorkspace
3) 基于远程数据库管理系统(RDBMS)并通过ArcSDE访问的RemoteDatabaseWorkspace
WorkSpaceFactory类
WorkSpaceFactory是工作空间分配者,用户进行相应的属性设置并通过它来连接各种工作空间。从该类中派生出了很多其他的类,如用于连接本地shp格式数据的ShapeFileWorkspaceFactory,以及用于连接远程SDE数据的SdeWorkspaceFactory还有:
RasterWorkspaceFactory
AccessWorkspaceFactory
CadWorkspaceFactory
ArcinfoWorkspaceFactory
TinWorkspaceFactory等。
IWorkspaceFactory接口
该接口主要用于打开和创建工作空间,并提供Workspace的相关信息。该接口共提供了1种属性和11种方法。下面介绍其中两种方法。
Open方法
该方法通过连接属性打开工作空间,其形式为:
IWorkspace Open(IPropertySet propSet, int hWnd );
参数:
propSet—连接属性,IPropertySet对象。
hWnd—整型变量,一般为0。
OpenFromFile方法
通过文件路径和名称打开指定的本地工作空间,其形式为:
IWorkspace OpenFromFile (string fileName,int hWnd );
参数:
fileName—表示所要打开工作空间的路径文件名称。
hWnd—整型变量,一般为0。
IPropertySet接口
该接口提供了1种属性和7种方法来管理连接属性。常见属性和方法有:
SetProperty方法
该方法用于设置指定的连接属性值。
GetProperty方法
返回指定连接属性值。
IFeatureWorkspace:
提供创建和打开各种数据集等有关的功能。
OpenFeatureClass:打开一个要素类,就是存在于FeatureWorkspace里面的一个FeatureClass
AddLayer:地图空间上添加指定图层。
用法:AddLayer (pLayer )
pLayer:是一个图层对象
AddLayerFromFile:将图层文件加载到地图控件上指定的位置。这里的位置是各图层在Mapcontrol上的Index。
用法:
MapControl1.AddLayerFromFile ("C:\Temp\myLayer.lyr“,2 );
“C:\Temp\myLayer.lyr“:图层文件路径名称;
2:是在MapControl上的图层的显示指数;
IWorkspaceFactory wsf = new ShapefileWorkspaceFactory();
IWorkspace ws= wsf.OpenFromFile(@"E:\博湖县表三移动", 2);
IFeatureWorkspace fws = ws as IFeatureWorkspace;
IFeatureClass fc= fws.OpenFeatureClass("博湖县调查点.shp");
IFeatureLayer fl = new FeatureLayerClass();
fl.FeatureClass = fc;
ILayer lyr = fl as ILayer;
lyr.Name = fc.AliasName;
this.axMapControl1.Map.AddLayer(lyr);
上面演示的是图层的常规加载方法,但是Shapefile作为一种应用非常广泛的地理数据格式,MapControl控件提供了更方便的加载方法,省去了建工作区、找数据集等步骤。可以用下面代码完成:
object.AddShapeFile (Path, fileName )
Map Control1.AddShapeFile (“F:\\Shapefile”,“县界.shp");
参数:
F:\\Shapefile:是包含要打开的shp文件的路径;
县界.shp:是在上面的路径下shape文件的文件名。
向MapControl中加载栅格数据
ArcEngine支持的栅格数据格式有:IMG,TIF,JPG,SID,BMP等
ArcEngine的功能既强大也很灵活,直接从文件创建Raster图层也是被支持的:
using ESRI.ArcGIS.DataSourcesRaster;
//创建栅格图层类
IRasterLayer rasterLayer = new RasterLayerClass();
//从路径创建栅格图层rasterLayer.CreateFromFilePath(“E:\\test\\县界.tif”);
//图层添加到地图控件this.axMapControl1.AddLayer(rasterLayer);
向MapControl中加载CAD数据
DWG数据是GIS的一个重要数据源,ArcEngine对CAD数据支持得非常好。
下面示例程序加载文件”F:\test\dl.dwg”
向MapControl中加载Coverage数据
Coverage数据的格式为”*.adf”
示例给出加载Coverage数据的一个方法:
向MapControl中加载TIN数据
示例代码如下:
IWorkspaceFactory pTinWSFactory;
ITinWokspace pTinWS;
ITinLayer pTinLyr;
pTinWSFactory=new TinWorkspaceFactoryClass();
pTinWS=pTinWSFactory.OpenFromFile(“F:\TIN”,0);
pTinLyr=new TinLayerClass();
pTinLyr.Dataset=pTinWS.OpenTin(“地形”);
pTinLyr.Name=“地形”;
axMapControl1.AddLayer(pTinLyr);
图层的选择
MapControl通过对图层进行索引来定位图层,如果想得到索引为2的图层(首先保证其存在),方法如下:
layer=axMapControl1.get_layer(2) ;
但在程序开发中,我们不容易知道具体的图层索引号,因此用名称来获取图层比较合适,下面定义的函数可用名称来获得图层,代码如下:
调用以上函数可以获得相应的图层。
private ILayer GetLayerByName(AxMapControl mapCtrl,string lyrName)
{
ILayer lyr=null;
for (int i = 0; i < mapCtrl.LayerCount;i++ )
{
if (mapCtrl.get_Layer(i).Name == lyrName)
lyr = mapCtrl.get_Layer(i);
else
lyr = null;
}
return lyr;
}
ILayer lyer=GetLayerByName(axMapControl1,”分市州”);
Lyer.Visible=false; //隐藏分市州图层
axMapControl1.Refresh();
图层的卸载
卸载指定图层:axMapControl1.DeleteLayer(3);
卸载所有图层:
axMapControl1.ClearLayers();
axMapControl1.Refresh();
控制图层显示的范围
当MapControl中加载了很多图层之后,在缩放过程中,用户并不希望所有图层都显示,比如在浏览中国轮廓的时候,县级的行政区划就不必要再显示了,这样可以减小地图负载,使地图更清晰。
实现这个功能,具体的做法就是设置图层的可见比例尺范围,代码如下:
axMapControl1.get_Layer(3).MaximumScale=500000;
axMapControl1.get_Layer(3).MinimumScale=1000000;
axMapControl1.Refresh();
第三节 GIS基本功能的设计开发
2.3.2鹰眼功能的实现
ArcEngine实现鹰眼功能
下面给出一个简单鹰眼模块示例。
关于鹰眼的实现方式,最常用的是用一个 MapControl 控件显示地图全图,并在上面画一个红色矩形框表示当前地图的显示范围,并实现鹰眼 MapControl 与主窗体的 MapControl 互动。
1 、添加鹰眼控件
2、鹰眼的实现
当地图载入到主 Map 控件时,同时也载入到鹰眼控件,代码如下:
ArcEngine实现鹰眼功能
1 、添加鹰眼控件
数据的同步加载OnMapReplaced
private void axMapControl2_OnMapReplaced (object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
IMap pMap = this.axMapControl2.Map;
for (int i = 0; i <= pMap.LayerCount - 1; i++)
{
this.axMapControl1.Map.AddLayer(pMap.get_Layer(i));
}
this.axMapControl1.Extent = this.axMapControl2.FullExtent;
this.axMapControl1.Refresh();
}
绘制鹰眼矩形框
private void axMapControl2_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
IEnvelope pEnvelope = e.newEnvelope as IEnvelope;
IGraphicsContainer pGraphicsContainer = this.axMapControl1.Map as IGraphicsContainer;
IActiveView pActiveView = pGraphicsContainer as IActiveView;
pGraphicsContainer.DeleteAllElements();
IRectangleElement pRectangleElement = new RectangleElementClass();
IElement pElement = pRectangleElement as IElement;
pElement.Geometry = pEnvelope;
IRgbColor pColor = new RgbColorClass();
pColor.RGB = 255;
pColor.Transparency = 30;
ILineSymbol pLineSymbol = new SimpleLineSymbolClass();
pLineSymbol.Width = 1;
pLineSymbol.Color = pColor;
pColor = new RgbColorClass();
pColor.RGB = 255; pColor.Transparency = 0;
IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
pFillSymbol.Color = pColor;
pFillSymbol.Outline = pLineSymbol;
IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
pFillShapeElement.Symbol = pFillSymbol;
pElement = pFillShapeElement as IElement;
pGraphicsContainer.AddElement(pElement, 0);
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
鹰眼与主Map 控件互动
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (this.axMapControl1.Map.LayerCount != 0)
{
// 按下鼠标左键移动矩形框
if (e.button == 1)
{
IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY);
IEnvelope pEnvelope = this.axMapControl2.Extent; pEnvelope.CenterAt(pPoint);
this.axMapControl2.Extent = pEnvelope;
this.axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
// 按下鼠标右键绘制矩形框
else if (e.button == 2)
{
IEnvelope pEnvelop = this.axMapControl1.TrackRectangle();
this.axMapControl2.Extent = pEnvelop;
this.axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
}
}
第三节 GIS基本功能的设计开发
2.3.3地图浏览功能的实现
地图浏览功能的实现
地图的浏览功能包括漫游、放大、缩小和全屏等操作,这也是GIS最基本的功能。
利用ArcEngine开发的GIS中实现这些功能有多种方法。
最简单的方法是利用ArcEngine的内置Command控件来与地图显示控件进行交互,
也可以通过ArcEngine类库的相应接口和方法来实现。
漫游
漫游操作直接使用MapControl的Pan方法。
MapControl1.Pan();
拉框放大
拉框放大就是把用鼠标拖出来的方块区域放大到全屏。
axMapControl1.Extent=MapControl1.TrackRectangle();
IEnvelope接口
除此之外,还可以利用IEnvelope接口的PutCoords方法
IEnvelope:是指地物的外接矩形,用来表示地物图形的大体位置和形状,一般可用于检索地物,判断地物间的拓扑关系,可以使得检索、判断的速度加快,因为有了IEnvelope,可以首先判断该外接矩形是否在检索范围内,而判断一个外接矩形是比较简单的。
IEnvelope接口
Envelope也称包络线,是一个矩形区域,是每个几何形体的最小外接矩形。每个Geometry都拥有一个Envelope,包括Envelope自身。
IEnv是包络线对象的主要接口,定义了XMax、XMin、YMax、YMin、Height和Width等属性,用于获取或设置一个存在的包络线对象的空间坐标。
方法:Expand、offset、CenterAt、PutCoords等。Expand方法用于按比例缩放包络线的范围,产生一个新的包络线对象;offset是一个偏移方法,通过一个给定的(x,y)移动包络线;CenterAt方法则通过改变包络线的中心点来移动包络线;PutCoords方法为按指定的坐标点来构造包络线。
IEnvelope接口的PutCoords方法(XMin, YMin,XMax,YMax) (将新建的一个边框的4个极坐标设置为输入的参数)
IEnvelope接口的Expand方法(dx, dy, asRatio) (按照输入的dx与dy参数来放大或者缩小当前的边框,用与对ArcMap窗体的中心放大或缩小,或者点击屏幕获得点击点的坐标,并将中心点设置成点击点,并进行一定比例的放大或者缩小)
拉框缩小
拉框缩小和拉框放大是对应的操作,它是把全屏区域缩小到鼠标拖出的方块区域中。
这个操作要计算缩小后的地图的显示范围,因此稍微有一点复杂.
中心放大
中心放大,就是以当前视图的中心点为缩放中心把地图进行放大的操作。示例代码如下:
env.Expand(0.5,0.5,true); //改Envelope的大小
axMapControl1.Extent=env;
中心缩小
中心缩小是中心放大的对应操作,它的目的是把地图以当前视图中心点为缩放中心进行缩小,示例代码如下:
IEnvelope env1 = this.axMapControl1.Extent;
env1.Expand(2, 2, true);
this.axMapControl1.Extent = env1;
历史视图切换
实现原理:把用户每次操作后的地图的Extent对象存储起来,但用户要进行切换时,把对应的Extent对象恢复回去。
第三节 GIS基本功能的设计开发
2.3.4工具条的功能实现
string strToolID = "";
strToolID = "esriControlTools.ControlsMapZoomInTool";
this.axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomOutTool";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomInFixedCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomOutFixedCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapPanTool";
this.axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapFullExtentCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomToLastExtentBackCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
strToolID = "esriControlTools.ControlsMapZoomToLastExtentForwardCommand";
axToolbarControl1.AddItem(strToolID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
第三节 GIS基本功能的设计开发
2.3.5弹出式菜单的设计
ToolbarMenu
ToolbarMenu.AddItem();
ToolbarMenu.PopupMenu();
2.3.5弹出式菜单的设计
菜单弹出之前添加菜单项
(AddItem)
菜单弹出位置的设定---地图显示控件上点击鼠标时弹出菜单(PopupMenu)
2.3.5弹出式菜单的设计
利用Windows的菜单
菜单弹出位置的设定---地图显示控件上点击鼠标时弹出菜单(PopupMenu)
各菜单的Clikc事件上实现对应的功能
第四节 信息检索功能的实现
2.4.1检索方式及实现方法
二,图层属性表显示
步骤1:设计图层控制的菜单。响应ContextMenuStrip菜单控件,为图层控件添加菜单项(显示属性表菜单和删除图层菜单)。该菜单是在鼠标右键点击图层时弹出的快捷菜单。
二,图层属性表显示
TOCContrl上点击鼠标获取对应图层
TOCControl1.HitTest(e.x, e.y(坐标;光标的位置), ref item, ref map, ref layer, ref other, ref index);
方法的使用。
(ref,out,param关键字的用法)
步骤2:实现图层与图层控制菜单间的关联。响应TOCControl控件的OnMouseDown事件,添加相关代码,实现菜单的弹出。
using ESRI.ArcGIS.Carto; //因为程序中用到ILayer和 //IBasicMap 接口,所以需要添加命名空间
ILayer layer = new FeatureLayerClass();
private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e)
{
this.axTOCControl1.ContextMenuStrip = null;
IBasicMap map = new MapClass();
System.Object other = null;
System.Object index = null;
ESRI.ArcGIS.Controls.esriTOCControlItem item = ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemNone;
this.axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
if (item == ESRI.ArcGIS.Controls.esriTOCControlItem.esriTOCControlItemLayer && e.button == 2)
{
System.Drawing.Point pt = new System.Drawing.Point(); //先创建点
pt.X = e.x;
pt.Y = e.y; //加坐标
pt = this.axTOCControl1.PointToScreen(pt);//先2创建点
this.图层控制菜单.Show(pt);
}
}
运行程序显示结果如下:
二,图层属性表显示
步骤3:设计一个属性表窗体。
1>添加一个属性表窗体。
2> 为属性表窗体添加DataGridView控件,并修改控件Anchor属性为(Top, Bottom, Left, Right)。
3> 为属性表窗体编写相关代码,实现图层属性信息往属性表中的添加。
(构造函数和析构函数)
public partial class TableForm: Form
{
private ILayer layer;
public TableForm(ILayer lyr) //对属性表窗口进行初始化
{
InitializeComponent();
layer = lyr;
this.Text = "\"" + layer.Name + "\" 属性表";
}
ITable 接口
提供操作属性表有关的方法和属性。
获取方法:
ILayer as Itable
(ITable)ILayer
IField 接口
提供操作属性表字段有关的方法和属性。
获取方法:
table.Fields.get_Field(index);
IFeature.Fields.get_Field(index)
过滤IFeatureCursor.FindField(name);
过滤IFeatureCursor.Fields.get_Field(index)
private void TableForm_Load(object sender, EventArgs e)
{
try
{
ITable lyrtable = (ITable)layer;
DataTable table = new DataTable();
IField field;
for (int i = 0; i < lyrtable.Fields.FieldCount; i++)
{
field = lyrtable.Fields.get_Field(i);
table.Columns.Add(field.Name);
}
object[] values = new object[lyrtable.Fields.FieldCount];
IQueryFilter queryFilter = new QueryFilterClass();
ICursor cursor = lyrtable.Search(queryFilter, true);
IRow row;
while ((row = cursor.NextRow()) != null)
{
for (int j = 0; j < lyrtable.Fields.FieldCount; j++)
{
object ob = row.get_Value(j);
values[j] = ob;
}
table.Rows.Add(values);
}
this.dataGridView1.DataSource = table;
}
catch (Exception e1)
{
MessageBox.Show("无法显示属性表!");
this.Close();
}
}
}
步骤4:建立图层控制菜单与属性表的连接,实现属性表界面的显示。双击图层控制菜单上的“显示属性表”菜单项,在响应的Click事件中添加如下代码:
private void menuItemShowTb_Click(object sender, EventArgs e)
{
TableForm tbfrm = new TableForm (layer);
tbfrm.Show();
}
步骤5:运行程序,查看图层属性。
展开