按距离排序经纬度并基于容差分组的问题排查
目标
有两个目标:
- 按距离对经纬度进行排序
- 基于容差对经纬度进行分组
预期结果
经纬度按距离排序并基于容差完成分组。
实际结果
经纬度已按距离排序,但分组效果不符合预期。
已尝试方案
我参考多个StackOverflow回答,使用了Haversine公式,成功实现了按距离排序位置(目标#1,我认为已完成🤔)。我尝试通过Math.abs(lat - lastLat) < tolerance基于容差进行分组,但不确定该逻辑是否有效或灵活(目标#2)。
代码
const locations = [ { lat: 77.62279999, lng: 12.95248389 }, { lat: 77.62517676, lng: 12.95027966 }, { lat: 77.62753442, lng: 12.93745478 }, { lat: 77.62217671, lng: 12.93353553 }, ]; const distance = (lat1, lon1, lat2, lon2) => { const radlat1 = (Math.PI * lat1) / 180; const radlat2 = (Math.PI * lat2) / 180; const theta = lon1 - lon2; const radtheta = (Math.PI * theta) / 180; let dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); dist = Math.acos(dist); dist = (dist * 180) / Math.PI; dist = dist * 60 * 1.1515; dist = dist * 1.609344; return dist; }; const sortedLocationsByDistance = locations.sort(function (a, b) { return distance(0, 0, a.lat, a.lng) - distance(0, 0, b.lat, b.lng); }); console.log('Sorted:', sortedLocationsByDistance); const groupedLocationsByTolerance = {}; const tolerance = 0.001; sortedLocationsByDistance.forEach(({ lat, lng }, index) => { if ( Object.keys(groupedLocationsByTolerance).length && Math.abs(lat - sortedLocationsByDistance.slice(-1)[0].lat) < tolerance && Math.abs(lng - sortedLocationsByDistance.slice(-1)[0].lng) < tolerance ) { groupedLocationsByTolerance[Object.keys(groupedLocationsByTolerance).slice(-1)[0]].push({ lat, lng }); return; } groupedLocationsByTolerance[index] = groupedLocationsByTolerance[index] || []; groupedLocationsByTolerance[index].push({ lat, lng }); }); console.log('Grouped:', groupedLocationsByTolerance);
内容的提问来源于stack exchange,提问作者Paddy
相关产品推荐
相关产品推荐

