封装好的一个距离测量类,只需要调用就行(传入参数AxMapControl myMapControl)
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AxESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using System.Drawing;
namespace PartOfJRSpace
{
public class Distance
{
//结点集合
List<IPoint> pPoint = new List<IPoint>();
//记录线的起始点
IPoint starPoint = new PointClass();
//线集合
List<ILine> pLine = new List<ILine>();
//地图面板
AxMapControl myMapControl;
IGraphicsContainer g ;
NewLineFeedbackClass m_NewLineFeedback = new NewLineFeedbackClass();
double sumLength=0;
//总长度标签
IElement sumLabelelement=null;
public Distance(AxMapControl pMapControl)
{
myMapControl = pMapControl;
g = myMapControl.Map as IGraphicsContainer;
myMapControl.OnMouseDown += new IMapControlEvents2_OnMouseDownEventHandler(myMapControl_OnMouseDown);
}
/// <summary>
/// 鼠标点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void myMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
IPoint pt = new PointClass();
#region 绘制结点
try
{
pt.X = e.mapX;
pt.Y = e.mapY;
IElement vertexElement = CreateElement(pt);
//
g.AddElement(vertexElement, 0);
pPoint.Add(pt);
//刷新
myMapControl.ActiveView.Refresh();
}
catch
{
throw;
}
#endregion
if (pPoint.Count > 1)
{
if (sumLabelelement != null)
{
g.DeleteElement(sumLabelelement);
myMapControl.ActiveView.Refresh();
}
ILine line = new LineClass();
line.PutCoords(starPoint,pt);
#region 绘制轨迹线
try
{
object missing = Type.Missing;
ISegmentCollection segColl = new PolylineClass();
segColl.AddSegment(line as ISegment, ref missing, ref missing);
IElement traceElement = CreateElement(segColl as IPolyline);
g.AddElement(traceElement, 0);
pLine.Add(line);
myMapControl.ActiveView.Refresh();
}
catch
{
throw;
}
#endregion
#region 计算单线的长度,并将结果显示在单线中点偏上上面
try
{
double angle = line.Angle;
if ((angle > (Math.PI / 2) && angle < (Math.PI)) || (angle > -Math.PI && angle < -(Math.PI / 2))) // 大于90度小于等于180
angle += Math.PI;
//标注点Y值偏移量
double d_OffsetY = myMapControl.ActiveView.ScreenDisplay.DisplayTransformation.FromPoints(9);
//标注点
double d_CenterX = (starPoint.X + pt.X) / 2;
double d_CenterY = (starPoint.Y + pt.Y) / 2 + d_OffsetY; //向上偏移
IPoint labelPt = new PointClass();
labelPt.PutCoords(d_CenterX, d_CenterY);
ITextElement txtElement = CreateTextElement(line.Length.ToString("0.00"));
IElement labelelement = txtElement as IElement;
labelelement.Geometry = labelPt;
object oElement = (object)labelelement;
//根据角度旋转
TransformByRotate(ref oElement, labelPt, angle);
////添加到GraphicsContainer
g.AddElement(labelelement, 0);
//刷新
myMapControl.ActiveView.Refresh();
}
catch
{
throw;
}
#endregion
sumLength += line.Length;
ITextElement sumTxtElement = CreateTextElement(sumLength.ToString("0.00"));
sumLabelelement = sumTxtElement as IElement;
sumLabelelement.Geometry = pt;
////添加到GraphicsContainer
g.AddElement(sumLabelelement, 0);
//刷新
myMapControl.ActiveView.Refresh();
}
}
//刷新
myMapControl.ActiveView.Refresh();
starPoint = pPoint[pPoint.Count - 1];
}
/// <summary>
/// 按指定的角度旋转
/// </summary>
/// <param name="obj"></param>
/// <param name="originPt"></param>
/// <param name="rotate"></param>
void TransformByRotate(ref object obj, IPoint originPt, double rotate)
{
if (obj == null && originPt == null)
return;
try
{
ITransform2D transform2D = obj as ITransform2D;
if (transform2D == null)
return;
transform2D.Rotate(originPt, rotate);
}
catch
{ }
}
/// <summary>
/// 创建一个TextElement
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private ITextElement CreateTextElement(string text)
{
//创建一个TextSymbol
ITextSymbol txtSymbol = new TextSymbolClass();
//设置字体
Font dispFont = new Font("Arial", 10, FontStyle.Regular);
txtSymbol.Font = (stdole.IFontDisp)ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont(dispFont);
//设置属性
txtSymbol.Color = TransColorToAEColor(Color.Red); //颜色
//创建一个TextElement
ITextElement txtElement = new TextElementClass();
txtElement.Symbol = txtSymbol;
txtElement.Text = text;
return txtElement;
}
/// <summary>
/// 将系统颜色转换为IColor
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
ESRI.ArcGIS.Display.IColor TransColorToAEColor(Color color)
{
IRgbColor rgb = new RgbColorClass();
rgb.RGB = color.R + color.G * 256 + color.B * 65536;
return rgb as IColor;
}
/// <summary>
/// 绘制几何图形
/// </summary>
/// <param name="geoType"></param>
/// <param name="geometry"></param>
/// <returns></returns>
private ESRI.ArcGIS.Carto.IElement CreateElement(ESRI.ArcGIS.Geometry.IGeometry geometry)
{
IElement element = null;
try
{
switch (geometry.GeometryType)
{
case esriGeometryType.esriGeometryPolyline://Polyline线
ISimpleLineSymbol simpleLineSymbol = m_NewLineFeedback.Symbol as ISimpleLineSymbol;
ILineElement lineElement = new LineElementClass();
lineElement.Symbol = simpleLineSymbol as ILineSymbol;
element = lineElement as IElement;
element.Geometry = geometry;
break;
case esriGeometryType.esriGeometryPoint://设置结点符号
IRgbColor pRGB = new RgbColorClass();
pRGB.Red = 255;
pRGB.Green = 0;
pRGB.Blue = 0;
ISimpleMarkerSymbol pSimpleMarkSymbol = new SimpleMarkerSymbolClass();
pSimpleMarkSymbol.Color = pRGB as IColor;
pSimpleMarkSymbol.Size = 2;
pSimpleMarkSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;
IMarkerElement pMarkerElement = new MarkerElementClass();
pMarkerElement.Symbol = pSimpleMarkSymbol as IMarkerSymbol;
element = pMarkerElement as IElement;
element.Geometry = geometry as IGeometry;
break;
}
}
catch
{
throw;
}
return element;
}
/// <summary>
/// 关闭测量工具,并清除所绘制的内容
/// </summary>
public void Close()
{
//删除g中的所有要素
g.DeleteAllElements();
g = null;
//刷新
myMapControl.ActiveView.Refresh();
//去除地图绑定的事件
myMapControl.OnMouseDown -=new IMapControlEvents2_OnMouseDownEventHandler(myMapControl_OnMouseDown);
}
}
}
这里是我按钮调用的方法:
private void Distance_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (Distance.ImageIndexDisabled == -1)//Distance.ImageIndexDisabled监听按钮被点击第一次
{
a = new Distance(mapControl);
Distance.ImageIndexDisabled = 1;
return;
}
if (Distance.ImageIndexDisabled == 1)//Distance.ImageIndexDisabled监听按钮被点击第二次
{
a.Close();
Distance.ImageIndexDisabled = -1;
return;
}
}