一些常ArcGIS常用简单算法 C#
最近开始重构不顺眼的辣鸡代码,顺带将某个模块的一个算法辅助类贴到这里。
/// <summary>
/// 算法逻辑辅助类
/// </summary>
internal static class AlgorithmHelper
{
/// <summary>
/// “两点距离公式”求已知两点的距离
/// </summary>
/// <param name="point_start"></param>
/// <param name="point_end"></param>
/// <returns></returns>
internal static double GetDistance(IPoint point_start, IPoint point_end)
{
double x = point_end.X - point_start.X;
double y = point_end.Y - point_start.Y;
double distance = Math.Sqrt(x * x + y * y);
return distance;
}
/// <summary>
/// “余弦定理”求已知三点组成的夹角的角度。
/// </summary>
/// <param name="first"></param>
/// <param name="cen"></param>
/// <param name="last"></param>
/// <returns></returns>
internal 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;
}
/// <summary>
/// 延长线段
/// </summary>
/// <param name="passLine">传入去的线</param>
/// <param name="mode">模式,1为从FromPoint处延长,2为从ToPint处延长,3为两端延长</param>
/// <param name="dis">延长的距离</param>
/// <returns></returns>
internal static IPolyline GetExtendLine(IPolyline passLine, int mode, double dis)
{
IPointCollection pPointCol = passLine as IPointCollection;
switch (mode)
{
case :
IPoint fromPoint = new PointClass();
passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, - * dis, false, fromPoint);
pPointCol.InsertPoints(, , ref fromPoint);
break;
case :
IPoint endPoint = new PointClass();
object missing = Type.Missing;
passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, endPoint);
pPointCol.AddPoint(endPoint, ref missing, ref missing);
break;
case :
IPoint fPoint = new PointClass();
IPoint ePoint = new PointClass();
object missing2 = Type.Missing;
passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, - * dis, false, fPoint);
pPointCol.InsertPoints(, , ref fPoint);
passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, ePoint);
pPointCol.AddPoint(ePoint, ref missing2, ref missing2);
break;
default:
return pPointCol as IPolyline;
}
return pPointCol as IPolyline;
}
/// <summary>
/// xy坐标转地理坐标
/// </summary>
/// <param name="pActiveView"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
internal static IPoint XYToGeo(IActiveView pActiveView, double x, double y)
{
try
{
IMap pMap = pActiveView.FocusMap;
IPoint pt = new PointClass();
ISpatialReferenceFactory pfactory = new SpatialReferenceEnvironmentClass();
ISpatialReference flatref = pMap.SpatialReference;
ISpatialReference earthref = pfactory.CreateGeographicCoordinateSystem();
pt.PutCoords(x, y); IGeometry geo = (IGeometry)pt;
geo.SpatialReference = flatref;
geo.Project(earthref);
return pt;
}
catch (Exception ex)
{
throw new Exception(ex.Message + "\r\n" + ex.StackTrace);
}
} /// <summary>
/// 数字经纬度和度分秒经纬度转换
/// </summary>
/// <param name="digitalDegree">十进制度</param>
/// <return>度分秒经纬度</return>
internal static string DigitalToDegrees(double digitalDegree)
{
const double num = ;
int degree = (int)digitalDegree;
double tmp = (digitalDegree - degree) * num;
int minute = (int)tmp;
double second = (tmp - minute) * num;
string degrees = "" + degree + "°" + minute + "′" + Math.Floor(second) + "″";
return degrees;
}
}
一些常ArcGIS常用简单算法 C#的更多相关文章
- java(数组及常用简单算法 )
数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[] 变量名 = new 数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
- Spark中常用的算法
Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...
- DotNet常用排序算法总结
数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法, ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
- 【学】常用hash算法的介绍
基本知识 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏
ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...
随机推荐
- ajax_封装函数_升级_传递多个参数和传递一个参数
HTML: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...
- 屏蔽命令任何输出的:>/dev/null 2>&1
- Vue 左右翻页,点赞动画
因做小活动比较多,使用了一些动画,做些笔记,供大家参考 翻页动画 router -> index.js import Vue from 'vue'; import Router from 'vu ...
- Autoit3域用户的登陆统计
#include <ACN_NET.au3> If @OSArch="X86" Then $fileURL=@CommonFilesDir & "\S ...
- js 属性getset
属性访问器 一.像C#写实体类一样的写法 var attr={ $x:10,//必须$开头 get x() { return this.$x+1; }, set x(val) { this.$x=va ...
- LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积
题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...
- python魔法方法__reduce__()的妙用
一.__reduce__()介绍 当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们. __reduce__ 被定 ...
- NOIP 历年试题大致考点总结
总的来说,水平还不够-- 要努力了! NOIP2012 D1T1 模拟, 字符串 D1T2 贪心, 数学 (推导贪心策略), 高精度 D1T3 unsolved 开车旅行 倍增 D2T1 解线性模方程 ...
- 【转】C#反编译工具
源地址:https://blog.csdn.net/kongwei521/article/details/54927689 源地址:https://www.cnblogs.com/JamesLi201 ...
- html标签<td><tr><th>全称及缩写说明
<td> 是table data cell 的缩写,单元格 <tr> 是table row 的缩写,表格中的一行 <th> 是table header cell 的 ...