ArcEngine-测量.docx

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

利用ArcEngine实现距离量测,面积量测的功能已很简单,相信众多的ArcGIS爱好者都能写.但单纯的实现功能总觉得欠什么.本人喜欢改代码,喜欢优化代码,在原有的功能基础上总喜欢润色,使之更好看.前一整子在玩skyline时看到skyline的测距功能能实时显示量测的距离,于是联想到之前自己用C#+ArcEngine写的测距功能.何不也优化一下自己代码?想到就做到.最近手有点痒,算练练手.废话少说,先附上效果图:说明:1.本功能的特点在于在量测的过称当中实时显示量测距离,并将结果实时显示在测距上方.在显示窗体上也显示量测的总距离.要点:1.INewLineFeedback负责画线;2.在OnMouseDown事件中计算量测距离,并向GraphicsContainer添加线和节点的Element;3.在OnMouseUp事件中实时计算距离随鼠标移动后产生的新距离.4.将节点,量测值,线的element都分别存入到节点组和轨迹线组(IGroupElement),即用IGroupElement同一管理这些element;最后将这些groupelement又添加到一个总的groupelement.这样做的目的在于好控制这些element,特别是启动新的量测或取消量测功能时可以控制这些element,而不必去用IGraphicsContainer.DeleteAllElements来清除这些element,使用IGraphicsContainer.DeleteAllElements会将所有的element删除.5.量测值element为ITextElement,由于他停靠在轨迹线的上方,因此需要对量测值element进行一定角度的旋转,旋转角度由轨迹线的方向角决定.6.绘制element之后的刷新问题也是比较重要的.刷新范围一定要控制好,太小了,添加的element显示不出来,太大了,浪费.(实在不好控制就刷新整个extent吧,呵呵)核心代码如下:1.TrackLine类//=================================功能测距==========================//描述:实时显示测量距离,节点位置,总长度//编程:Jin开发时间:2009.8.10-2009.8.11//特点:实时计算量测距离.//缺点:由于采用element做为显示内容,地图进行放大缩小操作后并不能很好//控制量测值element和轨迹线element之间的距离间隔.//===================================================================usingSystem;usingSystem.Drawing;usingSystem.Runtime.InteropServices;usingESRI.ArcGIS.ADF.BaseClasses;usingESRI.ArcGIS.ADF.CATIDs;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.Geometry;usingSystem.Windows.Forms;namespaceMhGis.GisTool.Pb_Toolbar{classTrackLine:BaseTool{privateIHookHelperm_hookHelper=null;privateINewLineFeedbackm_NewLineFeedback=null;privateIPointCollectionm_ptColl;//记录节点privateMeasureMsgInfo_MsgInfo=null;privateIPolylinem_TraceLine=null;//完整的轨迹线//privateIGroupElementm_Elements=null;//用于保存包含此功能产生的所有ElementprivateIGroupElementm_TraceElement=null;//测距轨迹线privateIGroupElementm_VertexElement=null;//结点privateIGroupElementm_LabelElement=null;//距离标记publicTrackLine(){////TODO:Definevaluesforthepublicproperties//base.m_category=;//localizabletextbase.m_caption=;//localizabletextbase.m_message=ThisshouldworkinArcMap/MapControl/PageLayoutControl;//localizabletextbase.m_toolTip=;//localizabletextbase.m_name=;//uniqueid,non-localizable(e.g.MyCategory_MyTool)try{////TODO:changeresourcenameifnecessary//stringbitmapResourceName=GetType().Name+.bmp;base.m_bitmap=newBitmap(GetType(),bitmapResourceName);base.m_cursor=newSystem.Windows.Forms.Cursor(GetType(),GetType().Name+.cur);}catch(Exceptionex){System.Diagnostics.Trace.WriteLine(ex.Message,InvalidBitmap);}}publicMeasureMsgInfoMsgInfo{set{_MsgInfo=value;_MsgInfo.FormClosing+=newFormClosingEventHandler(msgInfo_FromClosing);}}#regionOverridenClassMethods///summary///Occurswhenthistooliscreated////summary///paramname=hookInstanceoftheapplication/parampublicoverridevoidOnCreate(objecthook){try{m_hookHelper=newHookHelperClass();m_hookHelper.Hook=hook;if(m_hookHelper.ActiveView==null){m_hookHelper=null;}}catch{m_hookHelper=null;}if(m_hookHelper==null)base.m_enabled=false;elsebase.m_enabled=true;//TODO:Addotherinitializationcode}voidInit(){//初始化m_Elements=newGroupElementClass();m_TraceElement=newGroupElementClass();m_VertexElement=newGroupElementClass();m_LabelElement=newGroupElementClass();//初始化,并添加到GraphicsContainerIGraphicsContainerg=m_hookHelper.ActiveViewasIGraphicsContainer;g.AddElement(m_ElementsasIElement,0);g.AddElement(m_TraceElementasIElement,0);g.AddElement(m_VertexElementasIElement,0);g.AddElement(m_LabelElementasIElement,0);//添加到m_Elements中g.MoveElementToGroup(m_VertexElementasIElement,m_Elements);g.MoveElementToGroup(m_LabelElementasIElement,m_Elements);g.MoveElementToGroup(m_TraceElementasIElement,m_Elements);}///summary///Occurswhenthistoolisclicked////summarypublicoverridevoidOnClick(){Init();}voidmsgInfo_FromClosing(objectsender,FormClosingEventArgse){DeleteAllElements();_MsgInfo=null;//thrownewException(Themethodoroperationisnotimplemented.);}publicoverridevoidOnMouseDown(intButton,intShift,intX,intY){if(Button==2)return;IPointpt=m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);IGraphicsContainerg=m_hookHelper.ActiveView.GraphicsContainer;IEnvelopepEnvBounds=null;//获取上一次轨迹线的范围,以便确定刷新范围try{if(m_TraceLine!=null){m_TraceLine.QueryEnvelope(pEnvBounds);pEnvBounds.Expand(4,4,true);//矩形框向四周扩大4倍(大于2倍就行),目的是为了保证有充足的刷新区域}elsepEnvBounds=m_hookHelper.ActiveView.Extent;}catch{pEnvBounds=m_hookHelper.ActiveView.Extent;}#region启动画线if(m_NewLineFeedback==null){//移除elementRemoveElements();//刷新m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);Application.DoEvents();m_NewLineFeedback=newNewLineFeedbackClass();m_NewLineFeedback.Display=m_hookHelper.ActiveView.ScreenDisplay;//必须先得到symbol,后设置symbolISimpleLineSymbolsimpleLineSymbol=m_NewLineFeedback.SymbolasISimpleLineSymbol;simpleLineSymbol.Style=esriSimpleLineStyle.esriSLSDot;simpleLineSymbol.Width=1;simpleLineSymbol.Color=TransColorToAEColor(Color.Blue);m_NewLineFeedback.Start(pt);}else{m_NewLineFeedback.AddPoint(pt);}if(m_ptColl==null){m_ptColl=newPolylineClass();}//记录节点obj

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功