高德地图api——通过经纬度计算路线

最近在使用高德地图绘制高速路线,将通过经纬度和高速路线桩号计算路线数据后,将数据绘制在地图上进行展示,在此将封装的方法做下记录,将js引入后直接调用方法即可使用。

//构造工具函数
export class Converter {
  constructor() {
    this.queryKmPile = function (e, r) {
      if (!e[0].path)
        return false;
      (r = r.toLowerCase()), (this.data = e);
      var t = this._kmPile2m(r), i = e.filter(function (e) {
        var r = e.path[0], i = e.path[e.path.length - 1];
        return r[2] <= t && i[2] >= t;
      });
      if (!i[0]) return
      var n = i[0], o = t / 1e3;
      return t % 1e3 == 0 && n[o] ? n[o] : this._computeDistanceOfPoint(i[0].path, t);
    };
    this._kmPile2m = function (e) {
      if (-1 == e.indexOf('+') && -1 == e.indexOf('k')) return
      var r = e.split('+'), t = r[0].split('k')[1];
      return 1e3 * Number(t) + Number(r[1]);
    };
    this._computeDistanceOfPoint = function (e, r) {
      var t = e.filter(function (e) {
        return e[2] <= r;
      }), i = e.filter(function (e) {
        return e[2] >= r;
      }), n = t[t.length - 1], o = [n, i[0]], a = r - n[2];
      return this._distanceOfPoint(o, a);
    };
    this._distanceOfPoint = function (e, r) {
      var t = e[0], i = e[1], n = r / (i[2] - t[2]), o = i[0] - t[0], a = i[1] - t[1], u = o * n + t[0], l = a * n + t[1];
      return [Number(u.toFixed(6)), Number(l.toFixed(6))];
    };
  }
}

/**
 * @param {any}
 * @returns {Array}
 * editor fuhy
 */
//通过公里桩号和起止经纬度计算路线数据,sl,sp起始经纬度数组,起始桩号,el,ep结束经纬度数组,结束桩号,AMap地图对象
export async function getLineData(sl, el, sp, ep, AMap) {
  const data = await wayData(sl, el, AMap);
  let path = data.routes[0].steps.map((p) => {
    return p.path.map((lngLat) => {
      return [lngLat.lng, lngLat.lat];
    });
  });
  let pathArr = [];
  path.forEach((p, i) => {
    if (!i) {
      p.shift();
    }
    pathArr = pathArr.concat(p);
  });
  pathArr[0] = sl;
  pathArr[pathArr.length - 1] = el;
  if (!sp.includes('+') && !sp.includes('k')) return
  const sm =
    Number(sp.split('+')[0].split('k')[1]) * 1000 + Number(sp.split('+')[1]);
  const pathData = pathArr.map((p) => {
    return [p[0], p[1]];
  });
  if (!ep.includes('+') && !ep.includes('k')) return
  const endm =
    Number(ep.split('+')[0].split('k')[1]) * 1000 + Number(ep.split('+')[1]);
  const j = pathData[pathData.length - 1];
  if (endm > j[2]) {
    const dm = endm - j[2];
    const addm = dm / pathData.length;
    pathData.forEach((e, i) => {
      e[2] = e[2] + i * addm;
    });
  }
  return pathData;
}
//通过经纬度计算路线数据,s起始经纬度数组,e结束经纬度数组,AMap地图对象
function wayData(s, e, AMap) {
  return new Promise((resolve, reject) => {
    AMap.plugin('AMap.Driving', function () {
      const d = new AMap.Driving({
        // DrivingPolicy.LEAST_TIME最快捷模式
        policy: AMap.DrivingPolicy.LEAST_TIME,
      });
      d.search(s, e, function (status, result) {
        resolve(result);
      });
    });
  });
}

猜你喜欢

转载自blog.csdn.net/D_XY666/article/details/129724710
今日推荐