美文网首页
js 根据经纬度计算两地距离

js 根据经纬度计算两地距离

作者: 如果俞天阳会飞 | 来源:发表于2021-03-18 09:53 被阅读0次
const R = 6370996.81; // 地球半径(米)
 const  p = null;
const j = 0;
const Ib = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

/**
 * @return {string}
 */
function Jb(a) {
  let b = '';
  let c;
  let d;
  let e = '';
  let f;
  let g = '';
  let i = 0;
  f = /[^A-Za-z0-9\+\/\=]/g;
  if (!a || f.exec(a)) return a;
  a = a.replace(/[^A-Za-z0-9\+\/\=]/g, '');
  do {
    c = Ib.indexOf(a.charAt(i++)),
    d = Ib.indexOf(a.charAt(i++)),
    f = Ib.indexOf(a.charAt(i++)),
    g = Ib.indexOf(a.charAt(i++)),
    c = c << 2 | d >> 4,
    d = (d & 15) << 4 | f >> 2,
    e = (f & 3) << 6 | g,
    b += String.fromCharCode(c), f != 64 && (b += String.fromCharCode(d)), g != 64 && (b += String.fromCharCode(e));
  }
  while (i < a.length);
  return b;
}

/**
 * @return {boolean}
 */
function Za(a) {
  return typeof a === 'string';
}
function Point(a, b) {
  isNaN(a) && (a = Jb(a), a = isNaN(a) ? 0 : a);
  Za(a) && (a = parseFloat(a));
  isNaN(b) && (b = Jb(b), b = isNaN(b) ? 0 : b);
  Za(b) && (b = parseFloat(b));
  this.lng = a;
  this.lat = b;
}

Point.prototype.mb = function (a) {
  return a && this.lat === a.lat && this.lng === a.lng
};

function OD(a, b, c) {
  for (; a > c;) a -= c - b;
  for (; a < b;) a += c - b;
  return a;
}
/**
 * @return {number}
 */
function SD(a, b, c) {
  b !== p && (a = Math.max(a, b));
  c !== p && (a = Math.min(a, c));
  return a;
}

/**
 * @return {number}
 */
function Tk(a) {
  return Math.PI * a / 180;
}

/**
 * @return {number}
 */
function Pe(a, b, c, d) {
  return R * Math.acos(Math.sin(c) * Math.sin(d) + Math.cos(c) * Math.cos(d) * Math.cos(b - a));
}

/**
 * @return {number}
 */
function Vo(a, b) {
  if (!a || !b) return 0;
  a.lng = OD(a.lng, -180, 180);
  a.lat = SD(a.lat, -74, 74);
  b.lng = OD(b.lng, -180, 180);
  b.lat = SD(b.lat, -74, 74);
  return Pe(Tk(a.lng), Tk(b.lng), Tk(a.lat), Tk(b.lat));
}
function distance(a, b) {
  if (a && b) {
    if (a.mb(b)) return 0;
    let c;
    c = Vo(a, b);
    if (c === p || c === j) c = 0;
    return c;
  }
  return false;
}

export function getDistance(lat1, lng1, lat2, lng2) {
  if (lat1 && lng1 && lat2 && lng2) {
    const p1 = new Point(lat1, lng1);
    const p2 = new Point(lat2, lng2);
    return (distance(p1, p2) / 1000) .toFixed(2);
  } else {
    return null
  }

}

// 获得距离
const d = getDistance(lng_1, lat_1, lng_2, lat_2)

相关文章

网友评论

      本文标题:js 根据经纬度计算两地距离

      本文链接:https://www.haomeiwen.com/subject/ovlucltx.html