最近遇到了一个需求,已知两点之间的地理坐标(经纬度),求两点之间的实际距离。虽然白天我在网上看到一个计算公式,把所求的值套用公式,已经得到了想要的答案!但晚上出于好奇,还是想知道具体公示的原理。
下面是我实现的代码,以及逻辑
我查询了相关的公式,以及实现的原理,以下的一个链接,大家如果想了解实现原理可以仔细的研究一下。
数学公式求两点坐标之间的实际距离
数学公式的推导
代码如下:
//这里我才用的异步的方法获取当前坐标 async GetLocationInfo() { let that = this; //获取当前本人位置信息 await uni.getLocation({ //这里使用的是高德坐标系,大家想使用别的,请移步到uniapp上自己看 type: 'gcj02', geocode: 'true', success: function(res) { console.log('当前位置的经度:' + res.longitude); console.log('当前位置的纬度:' + res.latitude); //这里的c、d是我解释代码所定义的值,毕竟不能完全把我写的代码复制过来,大家见谅 that.c= res.latitude; that.d= res.longitude; },
另外一点的坐标我这里用(a,b)来代替,大家根据实际需求带入自己的从后端访问获取的值,或者实际的值进行计算
//纬度差 let Lat1Radom = (a* Math.PI) / 180.0; let Lat2Radom = (c * Math.PI) / 180.0; let lat = Lat1Radom - Lat2Radom; //经度差 let Long1Radom = (b * Math.PI) / 180.0; let Long2Radom = (d * Math.PI) / 180.0; let long = Long1Radom - Long2Radom; //计算两点之间的实际距离(经过我的查询这个公式叫做:Haversine公式) s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(lat / 2), 2) + Math.cos(Lat1Radom) * Math.cos(Lat2Radom) * Math.pow(Math.sin(long / 2), 2))); s = s * 6378.137; s = Math.round(s * 10000) / 10000; //保留最后两位小数 s = s.toString(); s = s.substring(0, s.indexOf('.') + 2); //提醒一下,这里的获取的距离,也就是s的单位是Km不得不提醒一下大家, 比如这个(c,d)的坐标是从访问后端接口所获得的,首先:1、我建议用异步的方法请求到这个值,也就是用async和await实现。 2、将异步请求定义成一个方法例如async a(){await uni.request....},在调用的时候将这个方法在uni.getlocation 中调用: 例如
uni.getLocation({ //这里使用的是高德坐标系,大家想使用别的,请移步到uniapp上自己看 type: 'gcj02', geocode: 'true', success: function(res) { console.log('当前位置的经度:' + res.longitude); console.log('当前位置的纬度:' + res.latitude); //这里的c、d是我解释代码所定义的值,毕竟不能完全把我写的代码复制过来,大家见谅 that.c= res.latitude; that.d= res.longitude; //增加了此代码 this.a(); },
3、至于为什么要这么做,在我的不断测试下uni.getLocation()请求到的当前坐标值比较慢,具体原因我不清楚,至少我在用的时候就是这样,所以即使我在执行后端的接口的方法用异步的方法请求,写在uni.getLocation()之后,但依然会先执行请求后端的方法,时间大概差在0.50秒左右。
在实现的过程中,我想过用调用第三方接口,比如高德的接口来实现,但是由于这样写起来感觉代码逻辑不强,反而会使代码不易理解,也不易后期的维护。不知道第三方sdk,比如高德地图或者腾讯地图,又或是百度地图的接口中的计算两点之间的方法是什么,但我觉得代码逻辑应该和 Haversine公式实现的原理差不多。
在网上搜索计算两点坐标之间的代码一搜一大堆,不管是哪种语言的实现,基本上用的都是Haversine公式,亦或是调用封装好的Haversine公式的第三方库或者是dll文件…………