ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#
看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢。
不会折腾底层直接怼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#相关推荐
- 06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇
视频与目录 项目 值 教程目录 https://blog.csdn.net/lxyoucan/article/details/120641546 视频全屏 https://www.bilibili.c ...
- oracle数据库报错代码,【案例】Oracle数据库dbv检查坏块时报错代码:6106解决办法...
[案例]Oracle数据库dbv检查坏块时报错代码:6106解决办法 时间:2016-10-24 21:02 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 Oracle研 ...
- 《转》收集最完整的arcgis拓扑处理
收集最完整的arcgis拓扑处理 (2011-10-16 20:07:00) 标签: 杂谈 分类: 3S ArcGIS中的拓扑 [第一部分] Arcgis中topolopy说明: 在arcgis中 ...
- ARCGIS 拓扑规则阐述
ARCGIS 拓扑规则阐述 [第一部分] Arcgis中topolopy说明: 在arcgis中有关topolopy操作,,有两个地方,一个是在arccatalog中,一个是在arcmap中.通常我们 ...
- 检查异常和非检查异常 有空你去学一下检查异常和非检查异常
https://blog.csdn.net/weixin_39220472/article/details/81056647 Java检查异常和非检查异常,运行时异常和非运行时异常的区别 灰太狼_cx ...
- java的未检查异常有哪些_Java:检查异常与未检查异常
一.异常的介绍 Throwable 是 Java 中所有错误和异常的超类.Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象,或者是 throw 语句也可以抛出该对象.同样,catch 子句中的 ...
- python类型检查_python【数据类型检查】
[数据类型检查] 在实际接口自动化测试过程中,我们会发现接口的很多入参参数都标记了[string.int.float.array等等 ],这就迫使我们对入参得作下检查工作,不然运行完成后,出错了,代码 ...
- JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名
JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名 安全域名列表 var DomainArray=['run ...
- slb健康检查方式_SLB健康检查也是“正常”-问答-阿里云开发者社区-阿里云
负载均衡通过健康检查来判断后端服务器(ECS实例)的业务可用性.健康检查机制提高了前端业务整体可用性,避免了后端ECS异常对总体服务的影响. 开启健康检查功能后,当后端某台ECS健康检查出现异常时,负 ...
- java assert可以检查exception吗_检查胃病一定要做胃镜吗?这五种检查也可以筛查胃病疾病...
胃肠镜检查是很多人打内心拒绝的.很多做过的人表示检查10分钟像是过一个世纪那么漫长. 确实,胃镜真的很不舒服.做之前紧张管子进去痛得掉眼泪,做完检查后痛不在肠道里变成嗓子痛了,真是太难受了. 检查胃部 ...
最新文章
- RS485通信如何设计EMC电路?
- 牛顿的另一面:夺权、严惩罪犯,以一己之力挽救英国危机
- (0086)iOS开发之iPhone 屏幕尺寸、分辨率、ppi以及@2x@3x图
- 【资源总结】“十大深度学习方向” 专栏
- php ci 参数,CI如何写一个控制器,并传递参数正常解析访问?
- 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)
- SpringCloud常见问题总结(一)
- git笔记之解决eclipse不能提交jar等文件的问题
- 7、Fiddler的HTTP统计视图
- 亚马逊靠“新闻稿”推动创新,跃居市值第一
- 安防摄像头WEB端直播,实现按需播放,节省带宽和服务器压力
- tensorflow rnn 最简单实现代码
- java判断枚举是否包含_java判断枚举是否包含
- Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性
- jQuery.bind事件 详解
- SNN系列|神经元模型篇(1) Hodgkin Huxley
- android4.2.2+手机管家,深度清理手机垃圾 腾讯手机管家V4.2评测
- php泥浆护壁,扩孔泥浆护壁式集束式潜孔锤技术
- SequoiaDB巨杉数据库-卸载
- C++用random_shuffle打乱字符串数组顺序