测绘人接触的最多的就是坐标,除了坐标系统不同之外,同一个坐标的经纬度有时也会表现出不同的坐标形式。
如度分秒(用ddd.mmss表示,ss可以有很多位)或者度(用ddd.d表示,小数可以有很多位)或者弧度(用rad表示)
比如Arcgis图形数据与外部坐标数据互转方法中,要直接导入到arcgis中的坐标就必须是度。
我们要坐标转换,那些投影公式输入的坐标要求的都是弧度。这里只需要加一个转换就可以了。
一、弧度与度的转换
rad = ddd.d / 180 * Math.PI;
ddd.d = rad * 180 / Math.PI;
二、度分秒与弧度的转换
度分秒的格式为ddd.mmssss
所以将度分秒分别从dd.mmssss中提出来,然后
ddd.d=ddd+mm/60+ssss/3600(ssss这里指的是ss.ss)
输入的是度分秒,转换成度之后,可以再转出弧度
//度分秒转换弧度制dd.mmssss
public static double DMS2RAD(double dms)
{
double deg = Math.Truncate(dms);
double min = Math.Truncate((dms - deg) * 100);
double sec = (((dms - deg) * 100 - min) * 100);
double rad = (deg + min / 60 + sec / 3600) / 180 * Math.PI;
return rad;
}
三、弧度与度分秒的转换
度的整数部分就是度分秒的整数部分
(度的小数部分×60)的整数部分就是度分秒的分,要取2位,不足要补0
(度的小数部分×60)-度分秒的分,然后再乘以60,就是度分秒的秒
输入弧度,先转换为度的形式,再将度转换为度分秒。
public static double RAD2DMS(double rad)
{
double degree = rad * 180 / Math.PI;
double deg = Math.Truncate(degree);
double min = Math.Truncate((degree - deg) * 60);
double sec = Math.Round(((degree - deg) * 60 - min) * 60, 4);
double dms = deg + min / 100 + sec / 10000;
return dms;
}
四、度分秒显示
比赛时经常需要将dd.mmssss以度分秒的形式输出,需要我们再次进行处理
其中为了避免精度损失加了1e-7
输出时就可以以° ′ ″的形式输出了。
public static string DMS2String(double dms)
{
string str = "";
double dd = (int)dms;
double mm = (int)((dms - dd) * 100 + 0.0000001);
double ss = (dms - dd - mm / 100) * 10000;
str = dd.ToString() + "°" + mm.ToString() + "′" + ss.ToString("0.0") + "″";
return str;
}