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之间的距离间隔.

//===================================================================

using System;

using System.Drawing;

using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase;

using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using System.Windows.Forms;

namespace MhGis.GisTool.Pb_Toolbar {

class TrackLine : BaseTool {

private IHookHelper m_hookHelper = null;

private INewLineFeedback m_NewLineFeedback = null; private IPointCollection m_ptColl; //记录节点

private MeasureMsgInfo _MsgInfo = null;

private IPolyline m_TraceLine = null; //完整的轨迹线 //

private IGroupElement m_Elements = null; //用于保存包含此功能产生的所有Element

private IGroupElement m_TraceElement = null; //测距轨迹线 private IGroupElement m_VertexElement = null; //结点 private IGroupElement m_LabelElement = null; // 距离标记

public TrackLine() { //

// TODO: Define values for the public properties //

base.m_category = \; //localizable text base.m_caption = \; //localizable text

base.m_message = \ageLayoutControl\; //localizable text

base.m_toolTip = \; //localizable text

base.m_name = \; //unique id, non-localizable (e.g. \

yCategory_MyTool\ try { //

// TODO: change resource name if necessary //

string bitmapResourceName = GetType().Name + \; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);

base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + \); }

catch (Exception ex) {

System.Diagnostics.Trace.WriteLine(ex.Message, \id Bitmap\); } }

public MeasureMsgInfo MsgInfo { set {

_MsgInfo = value;

_MsgInfo.FormClosing += new FormClosingEventHandler(msgInfo_FromClosing); } }

#region Overriden Class Methods

///