C# AE距离测量

封装好的一个距离测量类,只需要调用就行(传入参数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;
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_38370387/article/details/88536817
今日推荐