如何基于另一数组的经纬度属性对指定坐标数组进行排序
基于array1坐标排序array2的实现方案
注意:array1中经度字段为lon,array2中经度字段为lng,匹配时需要做好字段对应
场景1:坐标完全匹配,按array1中坐标出现顺序排序
实现思路
- 先遍历array1,将每个坐标拼接为唯一标识字符串,存入Map并记录其出现顺序作为排序权重
- 遍历array2,为每个元素计算坐标标识,从Map中取对应权重:匹配到的按权重升序排序,未匹配到的统一放到末尾
实现代码
// 生成坐标权重映射表 const coordWeightMap = new Map(); array1.forEach((item, index) => { // 用逗号分隔拼接lat和lon作为唯一key,避免数字精度导致的匹配错误 const coordKey = `${item.lat},${item.lon}`; coordWeightMap.set(coordKey, index); }); // 对array2排序 const sortedArray2 = array2.sort((a, b) => { const aKey = `${a.coordinates.lat},${a.coordinates.lng}`; const bKey = `${b.coordinates.lat},${b.coordinates.lng}`; // 未匹配到的项权重设为无穷大,排在最后 const aWeight = coordWeightMap.get(aKey) ?? Infinity; const bWeight = coordWeightMap.get(bKey) ?? Infinity; return aWeight - bWeight; });
场景2:坐标存在精度误差,按与array1最近坐标的距离排序
如果两个数组的坐标不是完全相等,需要按距离排序,可使用如下实现:
实现代码
// 简单曼哈顿距离计算,高精度需求可替换为Haversine球面距离公式 const calcDistance = (lat1, lon1, lat2, lon2) => { return Math.abs(lat1 - lat2) + Math.abs(lon1 - lon2); } const sortedArray2 = array2.sort((a, b) => { // 计算当前项和array1所有坐标的最小距离 const aMinDistance = Math.min(...array1.map(item => calcDistance(item.lat, item.lon, a.coordinates.lat, a.coordinates.lng))); const bMinDistance = Math.min(...array1.map(item => calcDistance(item.lat, item.lon, b.coordinates.lat, b.coordinates.lng))); return aMinDistance - bMinDistance; });
性能优化提示
如果array1数据量较大,可提前构建R树等空间索引优化距离查询效率,避免每次排序都遍历整个array1。
内容的提问来源于stack exchange,提问作者Dileet
相关产品推荐
相关产品推荐

