ArcGIS - Engine二次开发 - 提高篇 - 图文

2019-03-29 09:06

ArcGIS Engine高级功能开发

ArcGIS Engine二次开发

——提高篇

ArcGIS Engine高级功能开发

1 缩略图(鹰眼)

鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。在本小节中我们将学习如何制作这种鹰眼。

1.1 添加控件

新建一个C#.Net项目,项目名称为OverView,将Form1的名字设置为MainForm,并添加ToolbarControl 、两个MapControl和LicenceControl等四个控件。布局如下图所示。左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。

图 1 界面布局

在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将ToolbarControl的伙伴控件设为axMapControl1。

图 2添加按钮

1.2 代码添加及解释

鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。 下面开始实现鹰眼功能,添加using ESRI.ArcGIS.Carto、using ESRI.ArcGIS.Geometry、 using ESRI.ArcGIS.Display三个引用。首先在axMapControl1中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUpdated事件中添加代码如下:

private void axMapControl1_OnExtentUpdated(object sender,

ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) {

//创建鹰眼中线框

IEnvelope pEnv = (IEnvelope)e.newEnvelope;

IRectangleElement pRectangleEle = new RectangleElementClass(); IElement pEle = pRectangleEle as IElement; pEle.Geometry = pEnv;

//设置线框的边线对象,包括颜色和线宽 IRgbColor pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0;

pColor.Transparency = 255; // 产生一个线符号对象

ILineSymbol pOutline = new SimpleLineSymbolClass(); pOutline.Width = 2; pOutline.Color = pColor;

// 设置颜色属性 pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0;

pColor.Transparency = 0;

// 设置线框填充符号的属性

IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline;

IFillShapeElement pFillShapeEle = pEle as IFillShapeElement; pFillShapeEle.Symbol = pFillSymbol;

// 得到鹰眼视图中的图形元素容器

IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer; IActiveView pAv = pGra as IActiveView;

// 在绘制前,清除 axMapControl2 中的任何图形元素 pGra.DeleteAllElements(); // 鹰眼视图中添加线框

pGra.AddElement((IElement)pFillShapeEle, 0); // 刷新鹰眼

pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }

当鼠标点击鹰眼窗体时,主窗体Extent随之改变。在axMapControl2的OnMouseDown事件中添加代码如下:

private void axMapControl2_OnMouseDown(object sender,

ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) {

if (this.axMapControl2.Map.LayerCount != 0) {

// 按下鼠标左键移动矩形框 if (e.button == 1) {

IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY);

IEnvelope pEnvelope = this.axMapControl1.Extent; pEnvelope.CenterAt(pPoint);

this.axMapControl1.Extent = pEnvelope;

this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); }

// 按下鼠标右键绘制矩形框 else if (e.button == 2) {

IEnvelope pEnvelop = this.axMapControl2.TrackRectangle(); this.axMapControl1.Extent = pEnvelop;

this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } } }

当鼠标在鹰眼窗体移动时,主窗体Extent随之改变。在axMapControl2的OnMouseMove事件中添加代码如下:

private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) {

// 如果不是左键按下就直接返回 if (e.button != 1) return;

IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); this.axMapControl1.CenterAt(pPoint);

this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); }

下面代码用于实现axMapControl2与axMapControl1的数据的同步更新,获取主视图中视图范围最大的图层作为鹰眼中的视图。这个更新由两部分组成,一个是对axMapControl1添加地图文档(mxd文件)的响应,通过axMapControl1的OnMapReplace事件实现,一个是对axMapControl1添加单个图层的响应,通过axMapControl1的OnFullExtentUpdated事件实现。我们获取主视图中的视图范围最大的图层写成一个独立的函数,方便调用。

private ILayer GetOverviewLayer(IMap map) {

//获取主视图的第一个图层 ILayer pLayer = map.get_Layer(0);

//遍历其他图层,并比较视图范围的宽度,返回宽度最大的图层 ILayer pTempLayer = null;

for (int i = 1; i < map.LayerCount;i++ ) {

pTempLayer = map.get_Layer(i);

if (pLayer.AreaOfInterest.Width < pTempLayer.AreaOfInterest.Width) pLayer = pTempLayer; }

return pLayer; }

然后在axMapControl1的OnMapReplaced事件中调用。

private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) {

//获取鹰眼图层

this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map)); // 设置 MapControl 显示范围至数据的全局范围

this.axMapControl2.Extent = this.axMapControl1.FullExtent; // 刷新鹰眼控件地图

this.axMapControl2.Refresh(); }

在axMapControl1的OnFullExtentUpdated添加代码,用于实现在主视图添加图层时,实


ArcGIS - Engine二次开发 - 提高篇 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:朱寨镇邢庄初级中学管理制度汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: