基于C#的ArcEngine二次开发24:检查数据是否超出图廓范围

简介: 基于C#的ArcEngine二次开发24:检查数据是否超出图廓范围

1 需求说明与实现思路

1.1 需求说明

要素超出图廓错误是不允许的,作业过程需要将这些要素提示出来,供人工检查改正

注:本文设计方法思路,仅适用于矩形图廓的检查,对于不规则图廓,则不适用

1.2 需求实现思路

对于点要素,直接根据图廓坐标确定的矩形范围的角点坐标,判断其是否在图廓范围内

对于线要素,我们将线要素拆解为一组有序的点集,判断点集中的每一个点是否在图廓范围内

对于面要素,获取构成面的所有节点集合,判断点集中的每一个点是否在图廓范围内

基于上述分析,我们判断的关键就是点是否在图廓点确定的范围内的问题

2 源码实现

2.1 点是否在图廓范围内

图廓点集:

20200326152443229.png

源码实现:

  • 给定一个点pt,判断其是否在ranges围成的范围内
        /// <summary>
        /// 检查点是否在图廓点确定的数据范围内
        /// </summary>
        /// <param name="pt"></param>
        /// <param name="ranges"></param>
        /// <returns></returns>
        public bool checkPointIsInner(PointF pt, List<PointF> ranges)
        {
            if (pt.X < ranges[0].X || pt.X > ranges[2].X)
            {
                return false;
            }
            if (pt.Y < ranges[0].Y || pt.Y > ranges[2].Y)
            {
                return false;
            }
            return true;
        }

2.2 获取点面要素的集合

        /// <summary>
        /// 获取线面要素节点集
        /// </summary>
        /// <param name="fea">要素</param>
        /// <returns>返回要素节点集合</returns>
        public List<PointF> getFeatureVerticePts(IFeature fea)
        {
            IPointCollection feaPtsColl = fea.Shape as IPointCollection;
            List<PointF> feaPts = new List<PointF>();
            for (int i = 0; i < feaPtsColl.PointCount; i++)
            {
                feaPts.Add(new PointF((float)(feaPtsColl.Point[i].X), (float)(feaPtsColl.Point[i].Y)));
            }
            return feaPts;
        }

2.3 获取要素 - IFeatureClass

       /// <summary>
        /// mdb数据库中提取指定名称的要素
        /// </summary>
        /// <param name="wsPath">mdb数据库</param>
        /// <param name="layerName">要素层名称</param>
        /// <returns>返回的要素</returns>
        public IFeatureClass getIFeatureClass(string wsPath, string layerName)
        {
            IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactory();
            IWorkspace workspace = workspaceFactory.OpenFromFile(wsPath, 0);
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
            //2. 打开要素层
            return featureWorkspace.OpenFeatureClass(layerName);
        }

2.4 判断某个要素是否在节点范围内

此函数的思路是:判断给定IFeature对象是否在outline对象规定的范围内

        /// <summary>
        /// 检查线(面)要素是否超出图廓线范围
        /// </summary>
        /// <param name="outline">图廓线要素</param>
        /// <param name="feaLine">线(面)要素</param>
        /// <returns>false表示在图廓内部,true表示在图廓外边</returns>
        public bool lineIsBeyondOutline(IFeature outline, IFeature feaLine)
        {
           List<PointF> outlinePts = getFeatureVerticePts(outline);
           List<PointF> feaLinePts = getFeatureVerticePts(feaLine);
           for (int i = 0; i < feaLinePts.Count; i++)
           {
               if (!checkPointIsInner(feaLinePts[i], outlinePts))
               {
                   return true;
               }
           }
           return false;
        }

2.5 对图层进行检查

        /// <summary>
        /// 检查点图层
        /// </summary>
        /// <param name="wsPath">数据库名称</param>
        /// <param name="layerName">图层名称</param>
        public void checkPointsLayer(string wsPath, string layerName)
        {
            IFeatureClass pFeaterClass = getIFeatureClass(wsPath, layerName)
            IFeature outline = getOutlineFromCPTL(wsPath);
            //3. 获取投影信息
            IGeoDataset geoDatabase = pFeaterClass as IGeoDataset;
            //4. 查询所有要素
            string where = "";
            IQueryFilter filter = new QueryFilterClass();
            filter.WhereClause = where;
            //5.定义查询游标并循环迭代
            IFeatureCursor pFeatcursor = pFeaterClass.Search(filter, false);
            IFeature pFeature = pFeatcursor.NextFeature();
            //6. 运算结果存储
            List<IFeature> errLists = new List<IFeature>();
            while (pFeature != null)
            {
                if (lineIsBeyondOutline(outline, pFeature))
                {
                    errLists.Add(pFeature);
                }
                pFeature = pFeatcursor.NextFeature();
            }
            ExportPtsToShapefile(wsPath, errLists, layerName, esriGeometryType.esriGeometryPoint);
        }
相关文章
|
22天前
|
C# 数据库
c# dev Form1 gridview1使用Form2 gridview1的数据
c# dev Form1 gridview1使用Form2 gridview1的数据
|
2月前
|
开发框架 .NET C#
C#数据去重的这几种方式,你知道几种?
C#数据去重的这几种方式,你知道几种?
|
3月前
|
SQL 开发框架 .NET
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
23 0
|
4月前
|
编译器 数据处理 C#
C#中的异步流:使用IAsyncEnumerable<T>和await foreach实现异步数据迭代
【1月更文挑战第10天】本文介绍了C#中异步流的概念,并通过使用IAsyncEnumerable<T>接口和await foreach语句,详细阐述了如何异步地迭代数据流。异步流为处理大量数据或需要流式处理数据的场景提供了一种高效且非阻塞性的方法,使得开发者能够更优雅地处理并发和数据流问题。
|
4月前
|
存储 数据管理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)
28 0
|
2月前
|
SQL C# 数据库
C# 读取多条数据记录导出到 Word 标签模板
C# 读取多条数据记录导出到 Word 标签模板
|
2月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
2月前
|
存储 安全 C#
C#使用集合组织相关数据
C#使用集合组织相关数据
12 0
|
2月前
|
数据采集 存储 C#
抓取Instagram数据:Fizzler库带您进入C#程序的世界
在当今数字化的世界中,数据是无价之宝。社交媒体平台如Instagram成为了用户分享照片、视频和故事的热门场所。作为开发人员,我们可以利用爬虫技术来抓取这些平台上的数据,进行分析、挖掘和应用。本文将介绍如何使用C#编写一个简单的Instagram爬虫程序,使用Fizzler库来解析HTML页面,同时利用代理IP技术提高采集效率。
抓取Instagram数据:Fizzler库带您进入C#程序的世界