ArcGis 拓扑检查——狭长角锐角代码C#
中学的时候醉心于研究怎么“逃课”,大学的时候豁然开悟——最牛逼的逃课是准时准地儿去上每一课,却不知到老师讲的啥,“大隐隐于市”大概就是这境界吧。
用到才听说有“余弦定理”这么一个东西,遂感叹“白上了大学”。
又百度了一下,高中数学……

检查角度先要根据已知的3点计算出其所组成的夹角的角度,这就需要“余弦定理”了。

其代码实现应该是下面的样子:
private static double GetAngle(IPoint first, IPoint cen, IPoint last)
{
double ma_x = first.X - cen.X;
double ma_y = first.Y - cen.Y;
double mb_x = last.X - cen.X;
double mb_y = last.Y - cen.Y;
double ab_x = first.X - last.X;
double ab_y = first.Y - last.Y;
double ab_val2 = ab_x * ab_x + ab_y * ab_y;
double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
double cosM = (ma_val * ma_val + mb_val * mb_val - ab_val2) / ( * ma_val * mb_val);
double angleAMB = Math.Acos(cosM) / System.Math.PI * ;
return angleAMB;
}
在检查方法CheckAcuteAngle中调用GetAngle方法获取角度值,CheckAcuteAngle方法传入IFeatureClass类型的要素类(应该是一个面层的)与给定的double型角度上限值。返回值是有错的要素List与其对应的角度值List。
public static List<int> CheckAcuteAngle(IFeatureClass pFeatureClass, double acuteAngle, out List<double> listAngle)
{
IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)m_hookHelper.FocusMap.ActiveGraphicsLayer;
pGraphicsContainer.DeleteAllElements();
IColor color = DisplayUtils.RGBColor(, , );
List<int> listError = new List<int>();
List<double> listOutAngle = new List<double>();
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true);
IFeature pFeature = pFeatureCursor.NextFeature();
try
{
if (pFeature != null)
{
IPointCollection Temp_Vertices;
IPoint First_Point = new Point();
IPoint Center_Point = new Point();
IPoint Last_Point = new Point();
while (pFeature != null)
{
IGeometryCollection pGeometryCollection=pFeature.Shape as IGeometryCollection;
int count = pGeometryCollection.GeometryCount;
for (int j = ; j < count; j++)
{
IGeometry pGeometry = pGeometryCollection.get_Geometry(j);
Temp_Vertices = pGeometry as IPointCollection;
Temp_Vertices.AddPoint(Temp_Vertices.get_Point());
for (int i = ; i < Temp_Vertices.PointCount - ; i++)
{
Temp_Vertices.QueryPoint(i, First_Point);
Temp_Vertices.QueryPoint(i + , Center_Point);
Temp_Vertices.QueryPoint(i + , Last_Point);
double angle = GetAngle(First_Point, Center_Point, Last_Point);
if (angle <= acuteAngle || angle >= - acuteAngle)
{
listError.Add(pFeature.OID);
listOutAngle.Add(angle); IPointArray pointArray = new PointArrayClass();
pointArray.Add(First_Point);
pointArray.Add(Center_Point);
pointArray.Add(Last_Point); IElement pElement = MarkElementUtils.PointArray2LineMarkElement(pointArray, 1.0, color);
pGraphicsContainer.AddElement(pElement, );
}
}
}
pFeature = pFeatureCursor.NextFeature();
}
}
}
catch (Exception)
{
throw new Exception("执行角度计算时发生错误,错误FeatureID为:"+pFeature.OID);
}
finally
{
Marshal.FinalReleaseComObject(pFeatureCursor);
}
listAngle = listOutAngle;
return listError;
}
ArcGis 拓扑检查——狭长角锐角代码C#的更多相关文章
- ArcGIS拓扑检查
对于拓扑检查中的等级参数一直不理解,经过参考资料才明白过来: 注:如果有两个要素参与到拓扑,在修复拓扑错误时会优先移动拓扑级别低的要素来满足匹配拓扑规则要求. 参考资料: https://wenku. ...
- 解析ArcGis拓扑——检查的流程,以面重叠检查为例
最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...
- ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#
看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢. 不会折腾底层直接怼COM的悲伤…… 实现思路是这样的: 1.把面层的点都塞进List,去重,取坐标4位,后边的检查使用容差0.001 ...
- 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格
在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...
- ArcGIS案例学习笔记-CAD数据自动拓扑检查
ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...
- 使用ArcPy拓扑检查的基本步骤
拓扑检查是GIS的特性,在ArcGIS可使用多种方法进行检查,包括: 1.在数据集上右键按向导建立: 2.使用拓扑工具箱的一系列工具分步建立: 3.创建模型工具,制作专门的拓扑工具: 4.利用ArcP ...
- ArcGis拓扑——规则、概念与要点
在地理数据库中,拓扑是定义点要素.线要素以及面要素共享重叠几何的方式的排列布置.例如,街道中心线与人口普查区块共享公共几何,相邻的土壤面共享公共边界. 处理拓扑不仅仅是提供一个数据存储机制.在 Arc ...
- asp.net ajax检查用户名是否存在代码
原文 asp.net ajax检查用户名是否存在代码 用户注册时,我们经常需要检查用户名是否存在,本文就是实现无刷新验证用户名 打开开发环境VS 2005,新建项目(或打开现有项目),新建一个Web ...
- python 牛客网 你的输出为:空。请检查一下你的代码,有没有循环输入处理多个case。问题解决
你的输出为:空.请检查一下你的代码,有没有循环输入处理多个case.点击查看如何处理多个case 核心:他这个程序测试正确与否的流程是 连续输入多组测试数据进行测试,只有每组数据都对才行 所以必须使用 ...
随机推荐
- Fiddler中显示IP方法
如何在fiddler查看到请求的IP地址?就像下面这样 打开fiddler, 快捷键Ctrl+R 或者 菜单->Rules->Customize Rules…,然后在CustomRul ...
- docker 创建私有仓库
由于国内访问国际网络缓慢,从DockerHub下载镜像的速度感人,所以我们有必要在本地或者自己的云服务器上搭建一套镜像仓库,提高容器下载速度使用私有仓库需修改地址:Centos 7 Docker配置: ...
- CF1142C U2(计算几何,凸包)
题目大意:平面上有 $n$ 个点,第 $i$ 个点是 $(x_i,y_i)$.问有多少条抛物线(二次项系数为 $1$),经过这些点中不同的两个点,并且内部(不含边界)没有任何这些点.重合的抛物线只算一 ...
- mysql5.6做单向主从复制Replication
原理场景:MySQL从3.23版本开始提供复制功能.指的是将主数据库的DDL和DML操作通过二进制日志传到从服务器(也叫从库),然后在从库上对这些日志重新执行, 从而使得从库和主库的数据保持同步. 优 ...
- (一)flask-sqlalchemy的安装和配置
在使用flask-sqlalchemy之前要先了解ORM模型,什么叫做ORM模型 一.什么是ORM ORM 全拼Object-Relation Mapping. 称为对象-关系映射 主要实现模型对象到 ...
- BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...
- [学习笔记]FWT——快速沃尔什变换
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...
- http://bsideup.blogspot.com/2015/04/spring-boot-thrift-part3.html
Building Microservices with Spring Boot and Apache Thrift. Part 3. Asynchronous services Posted on 4 ...
- 被addPropertyChangeListener("...",this)差点搞崩溃
以前常用的是addPropertyChangeListener(this)方法 记得有一天我发现还有另一种写法: addPropertyChangeListener(String propertyNa ...
- mfc 中的error RC2104 : undefined keyword or key name
http://bbs.csdn.net/topics/340253236 需要在此文件中添加该按钮 声明一下. 但是在resource.h中已经定义了:#define IDC_ETHCONF_CHKP ...