本帖最后由 tianshuihu 于 2015-1-7 16:38 编辑
知道两地经纬度坐标之后,关于两地之间距离的测算有很多种方法,网上也有很多介绍
有一个讨论帖,
求根据经纬度精确计算距离的公式
http://club.excelhome.net/thread-666403-1-1.html
还有一个比较专业的国外网站,大家有兴趣的可以看看
http://www.movable-type.co.uk/scripts/latlong.html
我最终选用的是,下面这个公式
d = acos( sin φ1 * sin φ2 + cos φ1 * cos φ2 * cos Δλ ) * R
或者表示为
d = ACOS( SIN(lat1)*SIN(lat2) + COS(lat1)*COS(lat2)*COS(lon2-lon1) ) * 6371
有了理论指导之后,就开始行动了
但是,只能说理论很美好,现实很残酷,真的是一波三折。。。
好不容易把,公式写好,经纬度均换算为弧度表示,但是结果总是不对,
很多时候算出来的距离是0(实际距离为600米左右)
断点调试的时候甚至发现在求反余弦时,有时候余弦值居然大于1
这时候我突然想起了,数据精度的问题!
虽然计算过程中关键数据均选用了double型,但是IAR中默认的double型与float型精度一致,在内存中均占用4个字节
从网上找到了解决方法,在工程文件上右键,option选项,点选 ‘64bits’即可
如果你以为一切到这里就结束了,那可真的是想得太简单了。。。
修改完之后,编译的时候有一条提示,忘了截图,不过浏览器有记录
解决方法有多种,我选择的是破解,下面是从论坛上找到的和谐文件
破解之后,终于编译没错了,数据精度大为提高,于是两点之间的距离也出来了,一切迎刃而解
下面两图为 double型 distance 与 float型 temperature的对比
浮点显示
hex显示
下图为实测距离:以当前位置作为起点,再次测量得到的坐标作为终点,计算距离
左下角为距离,右下角为实时温度,右上角为更新次数的尾数
最后附上距离计算的关键代码