77范文网 - 专业文章范例文档资料分享平台

ArcGIS Engine控件编程(4)

来源:网络收集 时间:2019-04-02 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

// 在绘制前,清除axMapControl2 中的任何图形元素 pGraphicsContainer.DeleteAllElements();

IRectangleElement pRecElement = new RectangleElementClass(); IElement pEle = pRecElement as IElement; IEnvelope pEnv;

pEnv = e.newEnvelope as IEnvelope; pEle.Geometry = pEnv; //设置颜色

IRgbColor pColor = new RgbColorClass(); pColor.Red = 200; pColor.Green = 0; pColor.Blue = 0;

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

ILineSymbol pLineSymbol = new SimpleLineSymbolClass(); pLineSymbol.Width = 2; pLineSymbol.Color = pColor; //设置填充符号的属性

IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); //设置透明颜色

pColor.Transparency = 0; pFillSymbol.Color = pColor; pFillSymbol.Outline = pLineSymbol;

IFillShapeElement pFillShapeElement = pRecElement as IFillShapeElement; pFillShapeElement.Symbol = pFillSymbol; pGraphicsContainer.AddElement(pEle, 0);

axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

2.2 PageLayoutControl控件

PageLayoutControl控件主要用于制图,利用该控件可以方便地操作各种元素对象,以便产生制作精美的地图对象。在PageLayoutControl中封装了一个名为PageLayout的组件类,它提供了在布局视图中控制元素的属性和方法。

除PageLayout对象外,PageLayoutControl控件还拥有许多附加的事件、属性和方法。例如,Printer属性用于处理地图打印时的一系列设定、Page属性用于处理控件的页面效果、Element属性则用于管理控件中的地图元素。因地图总是包含在Map对象中,而Map对象是由一个MapFrame对象所持有,因此PageLayout对象至少拥有一个MapFrame对象。

PageLayoutControl控件实现了多个接口,如IPageLayoutControlDefault、

IPageLayoutControl、IPageLayoutControl2和IPageLayoutControlEvents等。这些接口定义了该控件对象可以使用的属性、方法和事件。

利用PageLayoutControl控件,可以检查和加载MXD文档文件、实现元素的添加和移动板式页面等在ArcMap程序中布局视图可以实现的功能。

2.2.1 用PageLayoutControl操作MXD文件

使用该控件操作Mxd文档,需要使用Carto库中的IMapDocument接口定义的属性和方法,

这些属性和方法可以读取地图文档文件(.Mxd、.Mxt、.Pmf)和保存Mxd文件。IMapDocument接口提供了多种属性和方法,可以方便用户获取一个Mxd文件的内容。如Map属性使用一个索引号返回文档中的一个Map对象;MapCount则用于返回文档中包含的Map对象的数目;Pagelayout属性则可以返回一个页面视图Pagelayout,这个对象包含了Map和MapSurround集合。DocumentType用于返回当前载入地图文档的类型,如果是Mxd文档,返回值为0;若为Pmf文档,返回值为1;图层文件,返回值为2;未知类型则返回3。

利用下面这段代码,可以选择Mxd文档,并将选择的文件在PageLayout控件上打开。

OpenFileDialog openFileDlg = new OpenFileDialog(); openFileDlg.Title = \选择需要打开的地图文档\; openFileDlg.Filter = \地图文档(*.mxd)|*.mxd\; openFileDlg.ShowDialog(); string strFileN = string.Empty; strFileN = openFileDlg.FileName; if (strFileN == string.Empty) return;

IMapDocument pMapDocument;

pMapDocument = new MapDocumentClass(); //将数据载入到pMapDocument并与Map控件联系起来 pMapDocument.Open(strFileN, \); //将IMapDocument的数据传给控件

axPagelayoutControl1.PageLayout = pMapDocument.PageLayout; axPagelayoutControl1.Refresh();

2.2.2 PageLayout与MapControl联动

对操作过ArcMap的使用者应该知道,数据视图和布局视图中的数据是实时联动的,因为它们本来是在处理同一份数据。在ArcGIS Engine开发中,因MapControl控件和

PageLayoutControl控件并不能共享一个文档文件,要实现联动,一般需通过数据拷贝的方法传递两个控件中的数据内容。基本思路如下:

(1)编写数据拷贝方法,将axMapControl1控件中的地理数据复制到

axPageLayoutControl1控件中。在该方法中需要利用IObjectCopy接口,以便将axMapControl1中的Map对象拷贝到axPageLayoutControl1控件的ActiveView对象的FocusMap中。具体代码如下:

public static void CopyAndOverwriteMap(AxMapControl axMapControl1, AxPageLayoutControl axPageLayoutControl1) {

//获取对象拷贝接口

IObjectCopy objectCopy = new ObjectCopyClass(); object toCopyMap = axMapControl1.Map;

object copiedMap = objectCopy.Copy(toCopyMap);//复制地图到copiedMap中

object toOverwiteMap = axPageLayoutControl1.ActiveView.FocusMap;//获取视图控件的焦点地图

objectCopy.Overwrite(copiedMap, ref toOverwiteMap);//复制地图

}

在下面的示例代码中,该方法被封装在GeoMapLoad类中。

(2)当axMapControl1控件中加载的地理数据的发生重绘时,与其联动的

axPageLayoutControl1控件中的地理数据也要发生相应变化,因此在axMapControl1控件的OnAfterScreenDraw事件中应该添加获取axMapControl1控件中当前所显示地理数据范围的代码,并将当前显示范围传到axPageLayoutControl1控件的ActiveView对象的FocusMap中,同时要调用数据拷贝方法。

IActiveView pActiveView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap; IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;

displayTransformation.VisibleBounds = axMapControl1.Extent;//设置焦点地图的可视范围 axPageLayoutControl1.ActiveView.Refresh();

GeoMapLoad.CopyAndOverwriteMap(axMapControl1, axPageLayoutControl1);

(3)当axMapControl1控件中加载的地理数据发生变化时,axPageLayoutCOntrol1控件中的地理数据也要发生相应变化。因此在axMapControl1控件的OnMapReplaced事件中应调用数据拷贝的方法。

GeoMapLoad.CopyAndOverwriteMap(axMapControl1, axPageLayoutControl1);

(4)当MapControl控件中的地理数据显示状况发生变化时,与其联动的PageLayoutControl中的地理数据也要发生变化。因此在OnViewRefreshed事件中应该添加调用数据拷贝的代码和使图层控件刷新的代码。

axTOCControl1.Update();

GeoMapLoad.CopyAndOverwriteMap(axMapControl1, axPageLayoutControl1);

2.2.3 在Pagelayout里面绘制元素

本节主要讨论使用样式对话框的方式来设置PageLayoutControl控件的各种属性。包括控件的边框(border)、阴影(shadow)、背景(background)和设置MapFrame的Mapgrid属性的方法等。

2.3 TOCControl控件

2.3.1 TOCControl控件概述

TOCControl要与一个伙伴控件或实现了IActiveView接口的对象协同工作。伙伴控件可以是MapControl、PageLayoutControl、ReaderControl、SceneControl或GlobeControl。伙伴控件可以利用TOCControl控件的属性页设置,也可以通过编程设置。该控件的伙伴控件都实现了ITOCBuddy接口。TOCControl控件用来显示其伙伴控件里的地图、图层和符号体系等内容,并保持其内容与伙伴控件同步。例如,若TOCControl控件的伙伴控件是MapControl,若从MapControl中删除一个图层,则该图层也会从TOCControl中删除。若用户与TOCControl交互,取消了某个图层的可见(Visibility)复选框,则该图层在MapControl中不再可见。

TOCControl以树形结构显示其“伙伴控件”的地图、图层和符号体系,该空间通过ITOCBuddy接口来访问其伙伴控件。TOCControl管理图层的可见性和标签的编辑。该控件的主要接口包括:

?ITOCControl:IDispatch

?ITOCControlEvents:IDispatch

(1)ITOCControl

ITOCControl接口是任何与TOCControl有关任务的出发点,如设置控件的外观、设置伙

伴控件、管理图层的可见和标签的编辑等。可通过如下方式定义该接口的变量,并进行实例化:

ITOCControl pTOCControl;

pTOCControl = axTOCControl1.Object as ITOCControl; 或pTOCControl = axTOCControl1.GetOcx() as ITOCControl;

(2)ITOCControlEvents接口

ITOCControlEvents接口是一个事件接口,它定义了TOCControl能够处理的全部事件,如OnMouseDown、OnMouseMove、OnMouseUp、OnBeginLabelEdit、OnEndLabelEdit等。在实际GIS软件系统开发中,会经常用到这些事件。如OnBeginLabelEdit和OnEndLabelEdit分别为当TOCCOntrol中的标签(地图、图层或图例)开始编辑和结束编辑时触发的事件。这两个事件的参数e都有一个名为canEdit的成员参数,可将这个参数设置为true或false,以便控制标签是否可编辑。

2.3.2 TOCCOntrol控件应用开发实例

(1)调整TOCControl控件中图层的显示顺序

在ArcMap中,用户只需通过鼠标拖动,就能调整“Table of Contents”中图层显示的顺序。但TOCControl控件本身并没有实现此功能,需要开发人员编程实现。利用鼠标拖放调整图层的显示顺序的基本思路如下:

1)利用鼠标将需要调整显示顺序的图层拖放到目标位置,需要利用TOCControl控件的OnMouseDown和OnMouseUp两个事件,以及HitTest()和Update()方法。

2)利用OnMouseDown事件获取需要调整显示顺序的图层,利用OnMouseUp事件,获得目标图层及其索引号,利用IMap提供的MoveLayer(源图层,目标图层索引)方法,将需要调整显示顺序的图层移到目标图层的下方。使用TOCControl控件提供的Update()方法更新TOCControl控件中显示的内容。

3)需要声明的全局变量包括:

ITOCControl mTOCControl;//需要在窗体层对其进行实例化 ILayer pMovelayer;//需要调整显示顺序的图层 int toIndex;//存放目标图层索引

并在窗体的Form_Load事件中对mTOCControl进行实例化 mTOCControl = axTOCControl1.Object as ITOCControl;

4)在TOCControl的OnMouseDown事件中添加下列代码

private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) {

esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; if (e.button == 1) {

IBasicMap map = null; ILayer layer = null; object other = null; object index = null;

mTOCControl.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);

if (item == esriTOCControlItem.esriTOCControlItemLayer)

{

if (layer is IAnnotationSublayer) return; else {

pMoveLayer = layer; } } } }

6)在TOCControl的OnMouseUp事件中添加代码

private void axTOCControl1_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e) {

if (e.button == 1) {

esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone; IBasicMap map = null; ILayer layer = null; object other = null; object index = null;

mTOCControl.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);

IMap pMap = axMapControl1.ActiveView.FocusMap;

if (item == esriTOCControlItem.esriTOCControlItemLayer || layer != null) {

if (pMoveLayer != layer) {

ILayer pTempLayer;

for (int i = 0; i < pMap.LayerCount; i++) {

pTempLayer = pMap.get_Layer(i); if (pTempLayer == layer) {

toIndex = i; } }

pMap.MoveLayer(pMoveLayer, toIndex); axMapControl1.ActiveView.Refresh(); mTOCControl.Update(); } } }

}

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ArcGIS Engine控件编程(4)在线全文阅读。

ArcGIS Engine控件编程(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/568075.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: