Recientemente, estoy usando Amap para dibujar una ruta de alta velocidad. Después de calcular los datos de la ruta a través de la longitud, latitud y número de estación de la ruta de alta velocidad, los datos se dibujarán en el mapa para su visualización. Aquí registraré el método encapsulado. y llamar directamente al método después de introducir 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);
});
});
});
}