文章目录
前言
最近遇到了一个需求,已知两点之间的地理坐标(经纬度),求两点之间的实际距离。虽然白天我在网上看到一个计算公式,把所求的值套用公式,已经得到了想要的答案!但晚上出于好奇,还是想知道具体公示的原理。
下面是我实现的代码,以及逻辑
一、如何用纯数学公式求出两点坐标?
我查询了相关的公式,以及实现的原理,以下的一个链接,大家如果想了解实现原理可以仔细的研究一下。
数学公式求两点坐标之间的实际距离
数学公式的推导
二、在uniapp如何实现?
1.获取当前位置的坐标
代码如下:
//这里我才用的异步的方法获取当前坐标
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;
},
2.计算两点之间的坐标
另外一点的坐标我这里用(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文件…………