import { lineString, nearestPointOnLine, point } from "@turf/turf"; /** * 将给出的点,按照路径排序 * @param {*} startPos * @param {*} endPos * @param {*} points */ const sort = function (startPos: any, endPos: any, points: number[][]) { const line = lineString([startPos, endPos]); const results: any[] = []; points.forEach((p: any) => { const pt = point(p); const snapped = nearestPointOnLine(line, pt, { units: "miles" }); results.push({ snapped: snapped.geometry && snapped.geometry.coordinates, point: p, }); }); if (Math.abs(startPos[1] - endPos[1]) > Math.abs(startPos[0] - endPos[0])) { //以lat为基准排序 if (startPos[1] - endPos[1] > 0) { // 正序 results.sort((r1, r2) => { return r1.snapped[1] > r2.snapped[1] ? -1 : 1; }); } else { // 倒序 results.sort(function (r1, r2) { return r1.snapped[1] < r2.snapped[1] ? -1 : 1; }); } } else { //以lng为基准排序 if (startPos[0] - endPos[0] > 0) { // 正序 results.sort(function (r1, r2) { return r1.snapped[0] > r2.snapped[0] ? -1 : 1; }); } else { // 倒序 results.sort(function (r1, r2) { return r1.snapped[0] < r2.snapped[0] ? -1 : 1; }); } } return results.map((r) => { return r.point; }); }; export default sort;