经过一段时间的学习后发现度分秒与数值之间的转换是现实生活中需要必备的一项小技能,尤其是学测绘学的你大部分时间你都会接触到像全站仪等仪器那么你就会和度分秒分不开了,今天我们不说web就讲讲度分秒与数值之间的相互转换吧。
看完本篇后你将会把度分秒与数值之间的换算彻底熟练起来。
会用到的函数有:
Excel中的函数有:
- RADIANS() 表示角度化为弧度。
- TEXT() 把数值格式转换为文本格式。
- INT() 向下取整。
- LEFT() 从字符串第一个返回指定个数的字符。
- MID() 从字符串中指定位置起始位置起返回一个指定长度的字符。
- FIND() 返回一个字符串在另一个字符串中出现的起始位置(区分大小写)。
JS中的函数
- Math.abs(x) 可返回数的绝对值。
- Math.floor(x) 可对一个数进行下舍入,方法执行的是向下取整计算,它返回的是小于或等于函数参数,并且与之最接近的整数。
- Math.round(x) 可把一个数字舍入为最接近的整数,例如,3.5 将舍入为 4,而 -3.5 将舍入为 -3。
- split() 用于把一个字符串分割成字符串数组,例如,”2:3:4:5”.split(“:”) //将返回[“2”, “3”, “4”, “5”]。
一、数值转度分秒
将数值转换为度分秒根据输入方法的不同分为以下几种方法:
1. 利用Excel中自定义规则 [h]°mm′ss.00″
这种方法是根据Excel表中设置单元格格式→数字→自定义属性中设定自己需要的规则如下图所示:
这种根据日期设置的规则输入时也要遵循一定的规则如下图所示的输入方式:
其实它的真面目是这样的
所以这种方法的优缺点很明显只可以单纯的进行相加减不可以进行乘除而且精度也不怎么高,输入时也较为麻烦,而且表格不可以拖拉求值所以我不推荐这种方法。
2. 在Excel表格中编公式
- 低精度方法
=TEXT(要转化的数值/24,"[h]°m′sss.000″")
转化结果如下图
- 高精度方法
=TEXT(INT(XX),"0")&"°"&TEXT(INT((XX-INT(XX))*60),"00")&"′"&TEXT(((XX-INT(XX))*60-INT((XX-INT(XX))*60))*60,"00.0000")&""""
//XX表示要转化的数值
转化后的结果如下图
这种方法我认为是比较不错的方法转化精度高,而且表格可以拖拉求值提高了工作效率。
注:以上的 数值转度后,转化后的度分秒不可以直接用来相加减那怎么样才可以相加减呢?且看下面讲解
二、度分秒转数值
度分秒转数值是很简单的,但是我们要弄懂其中的来龙去脉,来我们先回顾一下当年学的知识点。
//我们知道:
1°=60′,1′=60″ ,1°=3600″。
//在Unicode 代码中
度的符号对应的 Unicode 代码为:00B0 (六十进制),显示为°。
分的符号对应的 Unicode 代码为:2032 (六十进制),显示为′。
秒的符号对应的 Unicode 代码为:2033 (六十进制),显示为″。
//角度与弧度的关系:
1弧度=180/π 度
1度=π/180 弧度
1弧度等于57.3度,1弧度等于60弧分,1弧分等于60弧秒,所以1弧秒就是3600分之一弧度,就是0.01592度。
因为:
角度180°=π弧度
所以:
1弧度=(180/π)°角度
1角度=π/180弧度
有了以上的知识点那么我们就可以开始了。
1. 利用公式
这种是最简单的方法,适用于
度分秒都是分开这种表格
,如下图。
//单纯的角度转数值:
=(度°+分′/60+秒″/3600)
//角度转数值再转弧度:这里要用到RADIANS()函数
=RADIANS(度°+分′/60+秒″/3600)
2. 也是利用公式
这种方法公式有点复杂但是它可以把一个度分秒直接转换为数值,非常的方便。
//单纯的角度转数值:
=LEFT(523,FIND("°",523)-1)*1+MID(523,FIND("°",523)+1,2)/60+MID(523,FIND("′",523)+1,LEN(523)-FIND("′",523)-1)/3600 //其中523表示你要输入的度分秒
//角度转数值再转弧度:这里要用到RADIANS()函数
=RADIANS(LEFT(523,FIND("°",523)-1)*1+MID(523,FIND("°",523)+1,2)/60+MID(523,FIND("′",523)+1,LEN(523)-FIND("′",523)-1)/3600) //其中523表示你要输入的度分秒
转换结果如下图
下图是转换后用前两者方法的结果进行对比,我们发现两者的转换结果一致只是表格的编制不同,至于要用什么方法这个取决于大家的实际情况。
三、用JS代码实现
但用JS实现会造成一定的精度损失,因为我们看到的数值是计算机用二进制转换为我们可以识别的十进制,这其中的相互转换会造成精度丢失,当然这个精度损失是可以通过代码的优化来进行实现的,以下只是一个简单实现。
<script type="text/javascript">
function degturnDs(value) {//数值度转度分秒
value = Math.abs(value);
var du = Math.floor(value);//度
var fen = Math.floor((value - du) * 60);//分
var miao = Math.round((value - du) * 3600 % 60);//秒
return du + '°' + fen + '\'' + miao + '"';
};
function dsturnDeg(value){ ////度分秒转数值度
var du = value.split("°")[0];//度
var fen = value.split("°")[1].split("'")[0];//分
var miao = value.split("°")[1].split("'")[1].split('"')[0];//秒
return Math.abs(du) + "." + (Math.abs(fen)/60 + Math.abs(miao)/3600);
}
console.log(degturnDs(24.88764))//24°53'16"
console.log(dsturnDeg(24°53'16"))//24.88764
</script>