javscript根据经纬度计算两地距离
//经纬度转换成三角函数中度分表形式。
function rad(d) {
return d * Math.PI / 180.0;
}
function getDistance(lat1, lng1, lat2, lng2) {
let radLat1 = rad(lat1);
let radLat2 = rad(lat2);
let a = radLat1 - radLat2;
let b = rad(lng1) - rad(lng2);
let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * 6378.137;// EARTH_RADIUS;
s = Math.round(s * 10000) / 10000; //输出为公里
return s;
}
//调用
getDistance(lat1, lng1, lat2, lng2).toFixed(2); //保留小数点后两位
项目应用
在已知一个经纬度的情况下,通过微信定位接口获取当前位置,计算两地距离
$.ajax({
type: "post",
dataType: 'json',
data: data,
url: "xxxx",
success: function (res) {
if (res.status == 1){
//通过接口获取微信权限配置
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.data.appId, // 必填,公众号的唯一标识
timestamp: res.data.timestamp, // 必填,生成签名的时间戳
nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
signature: res.data.signature,// 必填,签名
jsApiList: res.data.jsApiList // 必填,需要使用的JS接口列表
});
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
//获取当前定位,需授权
wx.getLocation({
type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var distance = geoDistance(latitude, longitude, lat2, lng2).toFixed(2);
$('.distance').text(distance+'km'); //输出至页面
}
});
});
}
}
});