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

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

实现思路是这样的:

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

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

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

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

下面贴代码

取点集,去个重:

 1   class UserPoints
 2     {
 3         public static  List<IPoint> FeatureLayer2PointList(IFeatureLayer pFeatureLayer)
 4         {
 5             List<IPoint> pointList = new List<IPoint>();
 6             IFeatureCursor pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, true);
 7             try
 8             {
 9                 IFeature pFeatuare = pFeatureCursor.NextFeature();
10                 while (pFeatuare != null)
11                 {
12                     IPointCollection pcol = pFeatuare.Shape as IPointCollection;
13                     for (int i = 0; i < pcol.PointCount - 1; i++)
14                     {
15                         pointList.Add(pcol.Point[i]);
16                     }
17                     pFeatuare = pFeatureCursor.NextFeature();
18                 }
19                 pointList = pointList.Distinct(new Compare()).ToList<IPoint>();
20             }
21             catch (Exception exp)
22             {
23                 ErrorF err = new ErrorF(exp.Message + "\r\n" + exp.StackTrace);
24                 err.Show();
25             }
26             finally
27             {
28                 System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
29             }
30             return pointList;
31         }
32     }
33
34     class Compare : IEqualityComparer<IPoint>
35     {
36
37         bool IEqualityComparer<IPoint>.Equals(IPoint a, IPoint b)
38         {
39             if (a == null && b == null)
40                 return false;
41             else
42                 return Math.Round(a.X, 4) == Math.Round(b.X, 4) && Math.Round(a.Y, 4) == Math.Round(b.Y, 4);
43         }
44
45         int IEqualityComparer<IPoint>.GetHashCode(IPoint obj)
46         {
47             return obj.ToString().GetHashCode();
48         }
49     }

View Code

拓扑一下:

 1      public static List<IPoint> CheckLackJunctionPointOrSuspendedPoint(IFeatureLayer pFeatureLayer, double distance)
 2         {
 3             IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)m_hookHelper.FocusMap.ActiveGraphicsLayer;
 4             pGraphicsContainer.DeleteAllElements();
 5             IColor innerColor = new RgbColorClass();
 6             innerColor.NullColor = true;
 7             IColor outLineColor = DisplayUtils.RGBColor(255, 0, 0);
 8             IElement pElement;
 9             List<IPoint> listError = new List<IPoint>();
10             IFeatureCursor pFeatureCursor=null;
11             IFeature pFeature;
12             try
13             {
14                 IGeometry pGeometry;
15                 foreach (IPoint point in UserPoints.FeatureLayer2PointList(pFeatureLayer))
16                 {
17                     ITopologicalOperator pTopologicalOperator = point as ITopologicalOperator;
18                     ISpatialFilter pSpatialFilter = FilterUtil.SpatialFilter(point as IGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
19                     int count = pFeatureLayer.FeatureClass.FeatureCount(pSpatialFilter);
20                     if (count == 1)
21                     {
22                         IGeometry pGeometryPointBuffer =pTopologicalOperator.Buffer(distance);
23                         pGeometry = pTopologicalOperator.Buffer(distance) ;
24                         pSpatialFilter = FilterUtil.SpatialFilter(pGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
25                         if (pFeatureLayer.FeatureClass.FeatureCount(pSpatialFilter) > 1)
26                         {
27                             pElement = DisplayUtils.CircleMarkElement(point, innerColor, outLineColor, 8.0);
28                             pGraphicsContainer.AddElement(pElement, 0);
29                             listError.Add(point);
30                         }
31                     }
32                     else if (count > 1)
33                     {
34                         pFeatureCursor = pFeatureLayer.FeatureClass.Search(pSpatialFilter, true);
35                         pFeature = pFeatureCursor.NextFeature();
36                         int count2 = 0;
37                         while (pFeature != null)
38                         {
39                             IPointCollection pPointCollection = pFeature.Shape as IPointCollection;
40                             IPoint pPointtemp = new PointClass();
41                             for (int k = 0; k < pPointCollection.PointCount - 1; k++)
42                             {
43                                 pPointCollection.QueryPoint(k, pPointtemp);
44                                 if (Math.Abs(pPointtemp.X - point.X) < 0.001 && Math.Abs(pPointtemp.Y - point.Y) < 0.001)
45                                 {
46                                     count2++;
47                                     break;
48                                 }
49                             }
50                             pFeature = pFeatureCursor.NextFeature();
51                         }
52                         if (count2 < count)
53                         {
54                             pElement = DisplayUtils.CircleMarkElement(point, innerColor, outLineColor, 8.0);
55                             pGraphicsContainer.AddElement(pElement, 0);
56                             listError.Add(point);
57                         }
58                     }
59                 }
60             }
61             catch (Exception exp)
62             {
63                 ErrorF err = new ErrorF(exp.Message + "\r\n" + exp.StackTrace);
64                 err.Show();
65             }
66             finally
67             {
68                 Marshal.FinalReleaseComObject(pFeatureCursor);
69             }
70             return listError;
71         }

View Code

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

转载于:https://www.cnblogs.com/yzhyingcool/p/10026859.html

ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#相关推荐

  1. 06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇

    视频与目录 项目 值 教程目录 https://blog.csdn.net/lxyoucan/article/details/120641546 视频全屏 https://www.bilibili.c ...

  2. oracle数据库报错代码,【案例】Oracle数据库dbv检查坏块时报错代码:6106解决办法...

    [案例]Oracle数据库dbv检查坏块时报错代码:6106解决办法 时间:2016-10-24 21:02   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Oracle研 ...

  3. 《转》收集最完整的arcgis拓扑处理

    收集最完整的arcgis拓扑处理 (2011-10-16 20:07:00) 标签: 杂谈 分类: 3S   ArcGIS中的拓扑 [第一部分] Arcgis中topolopy说明: 在arcgis中 ...

  4. ARCGIS 拓扑规则阐述

    ARCGIS 拓扑规则阐述 [第一部分] Arcgis中topolopy说明: 在arcgis中有关topolopy操作,,有两个地方,一个是在arccatalog中,一个是在arcmap中.通常我们 ...

  5. 检查异常和非检查异常 有空你去学一下检查异常和非检查异常

    https://blog.csdn.net/weixin_39220472/article/details/81056647 Java检查异常和非检查异常,运行时异常和非运行时异常的区别 灰太狼_cx ...

  6. java的未检查异常有哪些_Java:检查异常与未检查异常

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

  7. python类型检查_python【数据类型检查】

    [数据类型检查] 在实际接口自动化测试过程中,我们会发现接口的很多入参参数都标记了[string.int.float.array等等 ],这就迫使我们对入参得作下检查工作,不然运行完成后,出错了,代码 ...

  8. JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名

    JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名 安全域名列表 var DomainArray=['run ...

  9. slb健康检查方式_SLB健康检查也是“正常”-问答-阿里云开发者社区-阿里云

    负载均衡通过健康检查来判断后端服务器(ECS实例)的业务可用性.健康检查机制提高了前端业务整体可用性,避免了后端ECS异常对总体服务的影响. 开启健康检查功能后,当后端某台ECS健康检查出现异常时,负 ...

  10. java assert可以检查exception吗_检查胃病一定要做胃镜吗?这五种检查也可以筛查胃病疾病...

    胃肠镜检查是很多人打内心拒绝的.很多做过的人表示检查10分钟像是过一个世纪那么漫长. 确实,胃镜真的很不舒服.做之前紧张管子进去痛得掉眼泪,做完检查后痛不在肠道里变成嗓子痛了,真是太难受了. 检查胃部 ...

最新文章

  1. RS485通信如何设计EMC电路?
  2. 牛顿的另一面:夺权、严惩罪犯,以一己之力挽救英国危机
  3. (0086)iOS开发之iPhone 屏幕尺寸、分辨率、ppi以及@2x@3x图
  4. 【资源总结】“十大深度学习方向” 专栏
  5. php ci 参数,CI如何写一个控制器,并传递参数正常解析访问?
  6. 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)
  7. SpringCloud常见问题总结(一)
  8. git笔记之解决eclipse不能提交jar等文件的问题
  9. 7、Fiddler的HTTP统计视图
  10. 亚马逊靠“新闻稿”推动创新,跃居市值第一
  11. 安防摄像头WEB端直播,实现按需播放,节省带宽和服务器压力
  12. tensorflow rnn 最简单实现代码
  13. java判断枚举是否包含_java判断枚举是否包含
  14. Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性
  15. jQuery.bind事件 详解
  16. SNN系列|神经元模型篇(1) Hodgkin Huxley
  17. android4.2.2+手机管家,深度清理手机垃圾 腾讯手机管家V4.2评测
  18. php泥浆护壁,扩孔泥浆护壁式集束式潜孔锤技术
  19. SequoiaDB巨杉数据库-卸载
  20. C++用random_shuffle打乱字符串数组顺序

热门文章

  1. 【STM32】使用ST-LINK V2下载程序
  2. 关于Mac安装破解软件,未知来源消失的问题
  3. 微信支付一面(C++后台)
  4. 易语言组合框基本属性方法事件
  5. 2022最新手机号码正则
  6. 基于激光雷达的3D实时车辆跟踪
  7. 拼音模糊查询+java,jquery拼音模糊查询
  8. python怎么装到其他盘_python下载安装到哪个磁盘?
  9. 十进制与二进制、八进制、十六进制对照表
  10. 【浏览器】解决QQ浏览器背景页面变成全黑(类似底片反色)