ArcGIS Engine二次开发 - 基础篇 联系客服

发布时间 : 星期五 文章ArcGIS Engine二次开发 - 基础篇更新完毕开始阅读c1826921192e45361066f5ac

ArcGIS Engine二次开发——基础篇

为MapControl控件添加OnMouseDown事件,填入以下代码

private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) {

//记录查询到的要素名称

string strNames = \查询到的要素为:\; //查询的字段名称

string strFieldName=\; //点查询

if (mMouseFlag == 1) {

IActiveView pActiveView; IPoint pPoint; double length; //获取视图范围

pActiveView = this.axMapControl1.ActiveView; //获取鼠标点击屏幕坐标

pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y); //屏幕距离转换为地图距离

length = ConvertPixelToMapUnits(pActiveView, 2);

ITopologicalOperator pTopoOperator; IGeometry pGeoBuffer; //根据缓冲半径生成空间过滤器

pTopoOperator = pPoint as ITopologicalOperator; pGeoBuffer = pTopoOperator.Buffer(length);

strNames = strNames + QuerySpatial(this.axMapControl1, pGeoBuffer, strFieldName);

}

else if (mMouseFlag==2)//线查询 {

strNames = strNames+QuerySpatial(this.axMapControl1, this.axMapControl1.TrackLine(), strFieldName); }

else if (mMouseFlag==3)//矩形查询 {

strNames = strNames + QuerySpatial(this.axMapControl1, this.axMapControl1.TrackRectangle(), strFieldName); }

else if (mMouseFlag==4)//圆查询 {

strNames = strNames + QuerySpatial(this.axMapControl1, this.axMapControl1.TrackCircle(), strFieldName); }

ArcGIS Engine二次开发——基础篇

else {

strNames = \未得到空间要素!\; }

//提示框显示提示

this.txtTips.Text =strNames; }

注释:

距离转换函数请参看程序注释。

Button的Click事件中是将nMouseFlag设置为1,并将鼠标在MapControl上的形状改变为十字丝状。

//获取视图范围

pActiveView = this.axMapControl1.ActiveView; //获取鼠标点击屏幕坐标

pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y); //屏幕距离转换为地图距离

length = ConvertPixelToMapUnits(pActiveView, 2);

上述代码是在MapControl的OnMouseDown事件中,当您单击鼠标左键的时候,获取点击位置的屏幕坐标,并将屏幕上的两个像素大小的距离转换成地图上的距离,作为查询的缓存半径。

//根据缓冲半径生成空间过滤器

pTopoOperator = pPoint as ITopologicalOperator; pGeoBuffer = pTopoOperator.Buffer(length); pSpatialFilter = new SpatialFilterClass(); pSpatialFilter.Geometry = pGeoBuffer;

上述代码是以鼠标的点击位置,以缓冲距离length为半径,生成一个缓冲区。

pSpatialFilter = new SpatialFilterClass(); pSpatialFilter.Geometry = pGeoBuffer; //根据图层类型选择缓冲方式 switch (pFeatureClass.ShapeType) {

case esriGeometryType.esriGeometryPoint:

pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; break;

case esriGeometryType.esriGeometryPolyline:

pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses; break;

ArcGIS Engine二次开发——基础篇

case esriGeometryType.esriGeometryPolygon:

pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; break; }

//定义空间过滤器的空间字段

pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;

上述代码是设置pSpatialFilter的各项参数,供后续查询,包括空间查询的几何形状(之前生成的缓冲区),空间查询的方式(相交,包含等)以及Shape字段。

fieldIndex = pFeature.Fields.FindField(\);

MessageBox.Show(\查找到“\ + pFeature.get_Value(fieldIndex) + \, \提示\);

这两句代码是找出“NAME”所在的列数,并将其显示出来。

点击运行,运行效果如下图所示:

图 10 线查询运行效果

仔细研读代码,您会发现,在这部分中我们并没有用到什么新的知识,只是在结构上做了调整,应为空间查询都是需要使用一个IGeometry对象进行空间求交进行查询的。所以我们将公共的代码放在公共的模块中进行调用。有心的同学可能发现,我们为了判断用户在MapControl上的操作,我们引入了一个全局变量nMouseFlag,程序中多一个全局变量,对程序的结构的封闭性就有所破坏,能不能去掉这个全局变量而是Mapcontrol自主判断是哪个功能进行操作呢?答案是肯定的,我们可以使用BaseCommand和BaseTool来完成这个工作,详细的用法在3.4和3.5小节将会介绍。

ArcGIS Engine二次开发——基础篇

1.3.3 小结

在这一小节中,我们学习了如何进行简单的空间查询。空间查询不仅包括点查询,还包括线查询,矩形查询,多边形查询等(为了实现这些功能,可以参考MapControl中的TrackRectangle等方法)。对于这一小节的代码,强烈建议您参看帮助系统中对相关接口的解释和定义,以进一步熟悉接口的使用,这对后面的学习以及掌握ArcGIS Engine二次开发是极有好处的。如果您对这一部分比较熟悉了,可以进入下一小节。在第四章中,我们介绍了控件命令(Control Commands),并提到ArcGIS Engine允许用户自定义开发一些控件命令,在下两小节中,我们将具体学习如何开发。

1.4 BaseCommand开发实例

在这一小节和下一小节中中,我们将学习ArcEngine中基于BaseCommand和BaseTool的功能开发步骤。基于BaseCommand的功能实现与Button的功能类似,是当鼠标点击按钮的时候,MapControl控件会对其中的命令做出相应响应而无需额外的操作,如ArcMap中的居中放大FixedZoomIn,全图FullExtent等。

在这一小节中,我们将基于BaseCommand制作一个“固定比例尺放大”的按钮,当鼠标单击按钮时,地图将居中放大一倍。

1.4.1 添加控件

如果上一小节的程序已经关闭,则重新打开,同时保证MapControl控件中加载了至少一个图层。在主窗体(MapViewForm)中添加一个Button,将其Name属性改为btnFixedZoomIn,Text属性更改为“居中放大”。

1.4.2 添加BaseCommand

点击菜单栏上的“项目”—>“添加类”,弹出以下对话框。

图 11添加新项对话框

如上图所示,在类别中选择ArcGIS项,在右侧的模板中选择“BaseCommand”项,并在名称中将其更改为“FixedZoomIn”,点击添加,出现如下对话框。