zoukankan      html  css  js  c++  java
  • 一些常ArcGIS常用简单算法 C#

    最近开始重构不顺眼的辣鸡代码,顺带将某个模块的一个算法辅助类贴到这里。

      /// <summary>
        /// 算法逻辑辅助类
        /// </summary>
        internal  static class AlgorithmHelper
        {
            /// <summary>
            /// “两点距离公式”求已知两点的距离
            /// </summary>
            /// <param name="point_start"></param>
            /// <param name="point_end"></param>
            /// <returns></returns>
            internal static double GetDistance(IPoint point_start, IPoint point_end)
            {
                double x = point_end.X - point_start.X;
                double y = point_end.Y - point_start.Y;
                double distance = Math.Sqrt(x * x + y * y);
                return distance;
            }
            /// <summary>
            /// “余弦定理”求已知三点组成的夹角的角度。
            /// </summary>
            /// <param name="first"></param>
            /// <param name="cen"></param>
            /// <param name="last"></param>
            /// <returns></returns>
            internal static double GetAngle(IPoint first, IPoint cen, IPoint last)
            {
                double ma_x = first.X - cen.X;
                double ma_y = first.Y - cen.Y;
                double mb_x = last.X - cen.X;
                double mb_y = last.Y - cen.Y;
                double ab_x = first.X - last.X;
                double ab_y = first.Y - last.Y;
                double ab_val2 = ab_x * ab_x + ab_y * ab_y;
                double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
                double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
                double cosM = (ma_val * ma_val + mb_val * mb_val - ab_val2) / (2 * ma_val * mb_val);
                double angleAMB = Math.Acos(cosM) / System.Math.PI * 180;
                return angleAMB;
            }
            /// <summary>
            /// 延长线段
            /// </summary>
            /// <param name="passLine">传入去的线</param>
            /// <param name="mode">模式,1为从FromPoint处延长,2为从ToPint处延长,3为两端延长</param>
            /// <param name="dis">延长的距离</param>
            /// <returns></returns>
            internal static IPolyline GetExtendLine(IPolyline passLine, int mode, double dis)
            {
                IPointCollection pPointCol = passLine as IPointCollection;
                switch (mode)
                {
                    case 1:
                        IPoint fromPoint = new PointClass();
                        passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, -1 * dis, false, fromPoint);
                        pPointCol.InsertPoints(0, 1, ref fromPoint);
                        break;
                    case 2:
                        IPoint endPoint = new PointClass();
                        object missing = Type.Missing;
                        passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, endPoint);
                        pPointCol.AddPoint(endPoint, ref missing, ref missing);
                        break;
                    case 3:
                        IPoint fPoint = new PointClass();
                        IPoint ePoint = new PointClass();
                        object missing2 = Type.Missing;
                        passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, -1 * dis, false, fPoint);
                        pPointCol.InsertPoints(0, 1, ref fPoint);
                        passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, ePoint);
                        pPointCol.AddPoint(ePoint, ref missing2, ref missing2);
                        break;
                    default:
                        return pPointCol as IPolyline;
                }
                return pPointCol as IPolyline;
            }
            /// <summary>
            /// xy坐标转地理坐标
            /// </summary>
            /// <param name="pActiveView"></param>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            internal static IPoint XYToGeo(IActiveView pActiveView, double x, double y)
            {
                try
                {
                    IMap pMap = pActiveView.FocusMap;
                    IPoint pt = new PointClass();
                    ISpatialReferenceFactory pfactory = new SpatialReferenceEnvironmentClass();
                    ISpatialReference flatref = pMap.SpatialReference;
                    ISpatialReference earthref = pfactory.CreateGeographicCoordinateSystem(4490);
                    pt.PutCoords(x, y);
    
                    IGeometry geo = (IGeometry)pt;
                    geo.SpatialReference = flatref;
                    geo.Project(earthref);
                    return pt;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message + "
    " + ex.StackTrace);
                }
            }
    
            /// <summary>
            /// 数字经纬度和度分秒经纬度转换
            /// </summary>
            /// <param name="digitalDegree">十进制度</param>
            /// <return>度分秒经纬度</return>
            internal static string DigitalToDegrees(double digitalDegree)
            {
                const double num = 60;
                int degree = (int)digitalDegree;
                double tmp = (digitalDegree - degree) * num;
                int minute = (int)tmp;
                double second = (tmp - minute) * num;
                string degrees = "" + degree + "°" + minute + "" + Math.Floor(second) + "";
                return degrees;
            }
        }
  • 相关阅读:
    ASP记录(一)
    ASP HTML JS CSS JQ之间恩怨
    ASP记录(二)之Input
    网页范例
    初识GoAhead
    TCP、IP、Http、Socket、telnet
    自定义博客的背景图片
    工具管理操作类介绍
    STL string的构造函数
    cout 格式化输出
  • 原文地址:https://www.cnblogs.com/yzhyingcool/p/11997743.html
Copyright © 2011-2022 走看看