ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#
看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢。
不会折腾底层直接怼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#的更多相关文章
- 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格
在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...
- Java检查异常、非检查异常、运行时异常、非运行时异常的区别
Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...
- Java检查异常和非检查异常,运行时异常和非运行时异常的区别
通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...
- Java:检查异常与未检查异常
一.异常的介绍 Throwable 是 Java 中所有错误和异常的超类.Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象,或者是 throw 语句也可以抛出该对象.同样,catch 子句中的 ...
- MyEclipse 关闭拼写检查、JavaScript的检查Build、xml、JSP的Bulid检查
前言 MyEclipse 的拼写检查.JavaScript的检查Build.xml.JSP的Bulid检查很讨厌,有时不仅会一直build卡住,而且明明是对的它却报错,示例: 关闭方法 1.关闭拼写检 ...
- java 检查异常 和 非检查异常
个人见解 ,如果有问题 ,还希望大神们 指正 1. 非检查异常 又称运行时 异常 ,所有 继承自 RuntimeException 的异常都是 非检查异常 ,, 如果你不处理 会有 虚拟机 mai ...
- ArcGis 拓扑检查——狭长角锐角代码C#
中学的时候醉心于研究怎么“逃课”,大学的时候豁然开悟——最牛逼的逃课是准时准地儿去上每一课,却不知到老师讲的啥,“大隐隐于市”大概就是这境界吧. 用到才听说有“余弦定理”这么一个东西,遂感叹“白上了大 ...
- ArcGIS拓扑检查
对于拓扑检查中的等级参数一直不理解,经过参考资料才明白过来: 注:如果有两个要素参与到拓扑,在修复拓扑错误时会优先移动拓扑级别低的要素来满足匹配拓扑规则要求. 参考资料: https://wenku. ...
- 解析ArcGis拓扑——检查的流程,以面重叠检查为例
最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...
随机推荐
- HDOJ 5666//快速积,推公式
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5666 题意:给一条直线x+y=q,在(0,0)往x+y=q上面的整数点连线,x+y=q与x,y轴截成的三角 ...
- 【Gym 100947I】What a Mess
BUPT 2017 summer training (for 16) #1D 题意 找到n个数里面有多少对具有倍数关系.\(1 ≤ n ≤ 10^4,2 ≤ a_i ≤ 10^6\) 题解 枚举一个数 ...
- emwin之2D图形流位图显示的方法
@2018-10-31 [需求] 界面上绘制状态指示图标 [方法] --① 方法一 外部存储介质上的图标读写与显示 i . 将要显示的图标使用官方软件<BmpCvt.exe>转换成 &q ...
- VLAN报文和非VLAN以太网报文的区别
VLAN(Virtual Local Area Network,虚拟局域网)协议,基于802.1Q协议标准. 以太网带VLAN帧结构,是在以太网报文中,位于数据帧中“发送源MAC地址”与“类别/长度域 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 洛谷【P2257】YY的GCD
YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x ...
- Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- A1140. Look-and-say Sequence
Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...
- [luogu2296][寻找道路]
直接赋题目..... 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- Mysql 远程连接服务器
#授权外部访问 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; #清空mysql缓存 ...