看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢。

不会折腾底层直接怼COM的悲伤……

实现思路是这样的:

1、把面层的点都塞进List,去重,取坐标4位,后边的检查使用容差0.001

2、遍历点,通过点在面层寻相交的面

3、如果结果是1,那么这个面在这个点处没有毗邻面,把点缓冲区一下给定距离,如果能找到面了,那么悬挂悬挂。

如果结果>1,那么遍历所有相交面,如果面的PointCollection里有这个点,那么计数+1;如果存在PointCollection里不包含这个点的面 ,那么缺顶点缺顶点

下面贴代码

取点集,去个重:

   class UserPoints
     {
         public static  List<IPoint> FeatureLayer2PointList(IFeatureLayer pFeatureLayer)
         {
             List<IPoint> pointList = new List<IPoint>();
             IFeatureCursor pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, true);
             try
             {
                 IFeature pFeatuare = pFeatureCursor.NextFeature();
                 while (pFeatuare != null)
                 {
                     IPointCollection pcol = pFeatuare.Shape as IPointCollection;
                     ; i < pcol.PointCount - ; i++)
                     {
                         pointList.Add(pcol.Point[i]);
                     }
                     pFeatuare = pFeatureCursor.NextFeature();
                 }
                 pointList = pointList.Distinct(new Compare()).ToList<IPoint>();
             }
             catch (Exception exp)
             {
                 ErrorF err = new ErrorF(exp.Message + "\r\n" + exp.StackTrace);
                 err.Show();
             }
             finally
             {
                 System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
             }
             return pointList;
         }
     }

     class Compare : IEqualityComparer<IPoint>
     {

         bool IEqualityComparer<IPoint>.Equals(IPoint a, IPoint b)
         {
             if (a == null && b == null)
                 return false;
             else
                 ) == Math.Round(b.X, ) && Math.Round(a.Y, ) == Math.Round(b.Y, );
         }

         int IEqualityComparer<IPoint>.GetHashCode(IPoint obj)
         {
             return obj.ToString().GetHashCode();
         }
     }

拓扑一下:

      public static List<IPoint> CheckLackJunctionPointOrSuspendedPoint(IFeatureLayer pFeatureLayer, double distance)
         {
             IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)m_hookHelper.FocusMap.ActiveGraphicsLayer;
             pGraphicsContainer.DeleteAllElements();
             IColor innerColor = new RgbColorClass();
             innerColor.NullColor = true;
             IColor outLineColor = DisplayUtils.RGBColor(, , );
             IElement pElement;
             List<IPoint> listError = new List<IPoint>();
             IFeatureCursor pFeatureCursor=null;
             IFeature pFeature;
             try
             {
                 IGeometry pGeometry;
                 foreach (IPoint point in UserPoints.FeatureLayer2PointList(pFeatureLayer))
                 {
                     ITopologicalOperator pTopologicalOperator = point as ITopologicalOperator;
                     ISpatialFilter pSpatialFilter = FilterUtil.SpatialFilter(point as IGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
                     int count = pFeatureLayer.FeatureClass.FeatureCount(pSpatialFilter);
                     )
                     {
                         IGeometry pGeometryPointBuffer =pTopologicalOperator.Buffer(distance);
                         pGeometry = pTopologicalOperator.Buffer(distance) ;
                         pSpatialFilter = FilterUtil.SpatialFilter(pGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
                         )
                         {
                             pElement = DisplayUtils.CircleMarkElement(point, innerColor, outLineColor, 8.0);
                             pGraphicsContainer.AddElement(pElement, );
                             listError.Add(point);
                         }
                     }
                     )
                     {
                         pFeatureCursor = pFeatureLayer.FeatureClass.Search(pSpatialFilter, true);
                         pFeature = pFeatureCursor.NextFeature();
                         ;
                         while (pFeature != null)
                         {
                             IPointCollection pPointCollection = pFeature.Shape as IPointCollection;
                             IPoint pPointtemp = new PointClass();
                             ; k < pPointCollection.PointCount - ; k++)
                             {
                                 pPointCollection.QueryPoint(k, pPointtemp);
                                 if (Math.Abs(pPointtemp.X - point.X) < 0.001 && Math.Abs(pPointtemp.Y - point.Y) < 0.001)
                                 {
                                     count2++;
                                     break;
                                 }
                             }
                             pFeature = pFeatureCursor.NextFeature();
                         }
                         if (count2 < count)
                         {
                             pElement = DisplayUtils.CircleMarkElement(point, innerColor, outLineColor, 8.0);
                             pGraphicsContainer.AddElement(pElement, );
                             listError.Add(point);
                         }
                     }
                 }
             }
             catch (Exception exp)
             {
                 ErrorF err = new ErrorF(exp.Message + "\r\n" + exp.StackTrace);
                 err.Show();
             }
             finally
             {
                 Marshal.FinalReleaseComObject(pFeatureCursor);
             }
             return listError;
         }

哪位有高效率的代码,求侮辱!

ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#的更多相关文章

  1. 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格

    在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...

  2. Java检查异常、非检查异常、运行时异常、非运行时异常的区别

    Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...

  3. Java检查异常和非检查异常,运行时异常和非运行时异常的区别

    通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...

  4. Java:检查异常与未检查异常

    一.异常的介绍 Throwable 是 Java 中所有错误和异常的超类.Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象,或者是 throw 语句也可以抛出该对象.同样,catch 子句中的 ...

  5. MyEclipse 关闭拼写检查、JavaScript的检查Build、xml、JSP的Bulid检查

    前言 MyEclipse 的拼写检查.JavaScript的检查Build.xml.JSP的Bulid检查很讨厌,有时不仅会一直build卡住,而且明明是对的它却报错,示例: 关闭方法 1.关闭拼写检 ...

  6. java 检查异常 和 非检查异常

    个人见解 ,如果有问题 ,还希望大神们 指正 1. 非检查异常 又称运行时 异常 ,所有 继承自 RuntimeException 的异常都是 非检查异常  ,, 如果你不处理  会有 虚拟机 mai ...

  7. ArcGis 拓扑检查——狭长角锐角代码C#

    中学的时候醉心于研究怎么“逃课”,大学的时候豁然开悟——最牛逼的逃课是准时准地儿去上每一课,却不知到老师讲的啥,“大隐隐于市”大概就是这境界吧. 用到才听说有“余弦定理”这么一个东西,遂感叹“白上了大 ...

  8. ArcGIS拓扑检查

    对于拓扑检查中的等级参数一直不理解,经过参考资料才明白过来: 注:如果有两个要素参与到拓扑,在修复拓扑错误时会优先移动拓扑级别低的要素来满足匹配拓扑规则要求. 参考资料: https://wenku. ...

  9. 解析ArcGis拓扑——检查的流程,以面重叠检查为例

    最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...

随机推荐

  1. 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)

    洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...

  2. 【Nowcoder71E】组一组(差分约束,最短路)

    [Nowcoder71E]组一组(差分约束,最短路) 题面 Nowcoder 题解 看到二进制显然就直接拆位,那么区间的按位或和按位与转成前缀和之后,可以写成两个前缀和的值的差的大小关系,那么直接差分 ...

  3. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  4. SAM练习记录

    SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时 ...

  5. 洛谷 P5020 【货币系统】

    谁说这一定要排序的,这就是个装满背包嘛 \({f[i]}\) 表示 \(i\) 面值最多能被几张钱表示 则若其不能被表示 \(f[i]=-inf\) 能表示且只有它自己则 \(f[i]=1\) 初始化 ...

  6. [SCOI2014]方伯伯的OJ(线段树)

    方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...

  7. 【redis】redis常用命令及操作记录

    redis-cli是Redis命令行界面,可以向Redis发送命令,并直接从终端读取服务器发送的回复. 它有两种主要模式:一种交互模式,其中有一个REPL(read eval print loop), ...

  8. Python基础之文件和目录操作

    1 .文件操作 1.1 文件打开和关闭 在python, 使用 open 函数, 可以打开一个已经存在的文件, 或者创建一个新文件. # 打开文件 f = open('test.txt', 'w') ...

  9. Codeforces Round #508 (Div. 2) C D

    C: C - Gambling 给你两个数列  每一回合A可以选择从第一个序列里面选一个数或者清除第二个序列里面选一个数 同理B能从第二序列里面选数或者清除第一个序列里面一个数 然后 求A所选的数之和 ...

  10. java静态变量和final关键字

    静态变量其实就是全局变量 静态方法不需要实例化对象,直接可以调用. public class StaticVariable { public static int num1=20; public vo ...