已知地球上某两个点的坐标(即经纬度),求两点的实际距离。uniapp实现(实现语法js)

文章目录


前言

最近遇到了一个需求,已知两点之间的地理坐标(经纬度),求两点之间的实际距离。虽然白天我在网上看到一个计算公式,把所求的值套用公式,已经得到了想要的答案!但晚上出于好奇,还是想知道具体公示的原理。


下面是我实现的代码,以及逻辑

一、如何用纯数学公式求出两点坐标?

我查询了相关的公式,以及实现的原理,以下的一个链接,大家如果想了解实现原理可以仔细的研究一下。
数学公式求两点坐标之间的实际距离
数学公式的推导

二、在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文件…………

上一篇:五十、java版商城之分销分佣设置 Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务


下一篇:企业群集的部署原理一LVS负载均衡(NAT调度)