提取面狭长角

本文介绍了一种检测GIS要素中狭长角度的方法。通过遍历要素的所有顶点,并计算连续三点构成的角度,来识别狭长角度。狭长角度定义为小于30度或大于330度的角。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

  private void PRV_CheckSliver(IFeatureClass IN_Featureclass)
        {
            List<string> Temp_AllError = new List<string>();//记录所有错误OID
            //提取所有要素
            IFeatureCursor Temp_GetEachFeature = IN_Featureclass.Search(null, true);
            IFeature Temp_EachFeature = Temp_GetEachFeature.NextFeature();
            if (Temp_EachFeature != null)
            {
                //尽量不在循环中创建变量
                IPointCollection Temp_Vertices;
                IPoint First_Point = new Point();
                IPoint Center_Point = new Point();
                IPoint Last_Point = new Point();
                int i;
                //将错误的OID提到List里
                while (Temp_EachFeature != null)
                {
                    //获取要素的点集
                    Temp_Vertices = Temp_EachFeature.Shape as IPointCollection;
                    Temp_Vertices.AddPoint(Temp_Vertices.get_Point(1));

                    for (i = 0; i < Temp_Vertices.PointCount - 3; i++)
                    {
                        Temp_Vertices.QueryPoint(i, First_Point);
                        Temp_Vertices.QueryPoint(i + 1, Center_Point);
                        Temp_Vertices.QueryPoint(i + 2, Last_Point);
                        double angle = PRV_GetAngle(Center_Point, First_Point, Last_Point);
                        if (angle < 30|| angle > 360 - 30)//这里设狭长角为30度
                            Temp_AllError.Add(Temp_EachFeature.OID.ToString());

                    }
                    Temp_EachFeature = Temp_GetEachFeature.NextFeature();
                }
            }
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Temp_GetEachFeature);//释放
        }


计算角度的函数

  //三个点计算角度
        private double PRV_GetAngle(IPoint cen, IPoint first, IPoint second)
        {
            double ma_x = first.X - cen.X;
            double ma_y = first.Y - cen.Y;
            double mb_x = second.X - cen.X;
            double mb_y = second.Y - cen.Y;
            double v1 = (ma_x * mb_x) + (ma_y * mb_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 = v1 / (ma_val * mb_val);
            double angleAMB = Math.Acos(cosM) * 180 / System.Math.PI;
            return angleAMB;
        }



AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值