1、距离测量
距离测量时,片段长度通过两点之间距离计算得到,全部长度通过片段长度的和计算得到。主要用到INewLineFeedback和IScreenDisplay两个接口。
1)INewLineFeedback接口
该接口的主要方法如表:
方法 | 描述 |
Start | 从指定点开始绘制追踪线的绘制 |
MoveTo | 鼠标移动到的点,并实时绘制与上一节点的连接线 |
AddPoint | 添加一个点 |
Stop | 停止追踪线的绘制,并返回用户绘制的几何体 |
2)IScreenDisplay接口
MapControl中的每一个视图都有一个ScreenDisplay对象,用于控制视图中的图形绘制。ScreenDisplay对象除了管理窗体屏幕的显示属性外,也管理缓存和视图屏幕的变化等。可以通过IActiveView接口的ScreenDisplay属性获取ScreenDisplay对象。通ScreenDisplay对象的DisplayTransformation属性进行设备单位和地图单位的转换。
3)实现的思路
-
- 鼠标点击时,首先判断INewLineFeedback接口的实例化对象pNewLineFeedback是否为空,如果为空就实例化,并设当前的鼠标点为pNewLineFeedback的起始点。反之,则把当前鼠标点添加到pNewLineFeedback中。
- 鼠标移动时。实时计算鼠标移动点与上一鼠标点击点的距离,以及所画线的长度。
- 鼠标双击时,停止绘制,并清空pNewLineFeedback对象
- btnMeasureLine的单击事件打结果窗体,并设置bMeasurelength为true,以便从数据视图的鼠标事件中判断量算功能是否开启。
2、面积量测
面积量测通过INewPolygonFeedback接口绘制多边形来实现。使用NewPolygonFeedback和使用NewLineFeedback的方法类似,但其显示和返回的几何特征是一个封闭多边形,这意味着画多边形停止时,起点将成为终点,从而结束形状的绘制,该方法至少需要三个点被添加到几何对象中。
实现的思路如下
1)、点击鼠标时首先判断INewPolygonFeedback接口的实例化对象pNewPolygonFeedback是否为空,则实例化,并设当前鼠标点为pNewPolygonFeedback的起始点;反之则把当前的鼠标点添加到pNewPolygonFeedback中。
2)、鼠标移动时,判断绘制多边形时点的个数pPointCol是否超过3个点,如果超过三个,则由点击构建IPolygon接口,IArea接口,进而计算出面的总长度和面积。
3)、鼠标双击时,停止绘制,并清空pNewPloygonFeedback对象。
3、面积测量和距离测量的具体代码分布:
1.前提:新建一个用来显示测量结果的公共窗体
2.二者的button_click事件:
1 #region 距离的测量按钮单击事件 2 private void barButtonItem10_ItemClick(object sender, ItemClickEventArgs e) 3 { 4 mainMapControl.CurrentTool = null; 5 pMouseOperate = "MeasureLength"; 6 mainMapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair; 7 if (frmMeasureResult == null || frmMeasureResult.IsDisposed) 8 { 9 frmMeasureResult = new FormMeasureResult(); 10 frmMeasureResult.frmClosed += new FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed); 11 frmMeasureResult.labToltal.Text = ""; 12 frmMeasureResult.Text = "距离量测"; 13 frmMeasureResult.Show(); 14 } 15 else 16 { 17 frmMeasureResult.Activate(); 18 } 19 } 20 #endregion
1 #region 面积测量按钮单击事件 2 private void btnPolyMeasure_ItemClick(object sender, ItemClickEventArgs e) 3 { 4 mainMapControl.CurrentTool = null; 5 pMouseOperate = "MeasureArea"; 6 mainMapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;//光标样式为十字丝 7 if (frmMeasureResult == null || frmMeasureResult.IsDisposed) 8 { 9 frmMeasureResult =