我试图通过使用 npm geolib 来获得纬度|经度坐标之间的距离。我有一个函数,可以在其中查询 firestore 并返回一组对象。然后我通过 for 循环运行该数组,在该循环中调用 geolib.getPreciseDistance
以获取数组中每个对象的距离。
我很难从 for 循环中获取排序数组作为回报。在完美的世界中,新数组将与索引 [0] 中距离最近的对象排序。
我已经在下面发布了。我感谢任何和所有的反馈,因为我还在学习。谢谢!
function getNearestWalk() {
let currentLng = userLocation.longitude;
let currentLat = userLocation.latitude;
firestore()
.collection('Walks')
.where('status', '==', 'started')
.limit(10)
.get()
.then((walks) => {
const walksArray = [];
walks.forEach((liveWalks) => {
walksArray.push(liveWalks.data());
});
console.log(walksArray);
for (var i = 0; i < walksArray.length; i++) {
geolib.getPreciseDistance(
{ latitude: currentLat, longitude: currentLng },
{
latitude: walksArray[i].latitude,
longitude: walksArray[i].longitude,
}
);
}
});
}
答案 0 :(得分:1)
根据我在您对@Elnatan 的回复中收集到的信息,听起来您想要一个对象数组,表示按最短...最远距离排序的坐标
最直接的方法(不考虑复杂性)如下:
distCalc
,它接受一个对象来执行调用 geolib.getPreciseDistance
并返回其值的循环逻辑。walksArray.sort( (a, b) => distCalc(a) - distCalc(b) )
就我个人而言,我会将您的 #getNearestWalk
中的关注点分开以获得最佳实践,并创建一个辅助函数来获取您的步行,以便使用 try {} catch {}
实现有效的错误处理,因为不能保证异步调用。>
让我知道这是否适合您!
答案 1 :(得分:1)
在 OP 代码中,walks
是一个查询快照。首先要做的是提取文档数据。此函数执行查询并获取文档数据...
function getStartedWalks() {
return firestore()
.collection('Walks')
.where('status', '==', 'started')
.limit(10)
.get()
.then(querySnapshot => querySnapshot.docs.map(d => d.data()));
}
此函数将给定点的距离分配到文档数据中...
// to each doc in docs, assign the distance from a given position
function assignDistances(docs, position) {
return docs.map(doc => {
const docPosition = { latitude: doc.latitude, longitude: doc.longitude };
const distance = geolib.getPreciseDistance(position, docPosition);
return { ...doc, distance }
})
}
现在 getNearestWalk() 很容易编写...
function getNearestWalk(position) {
return getStartedWalks().then(docs => {
docs = assignDistances(docs, position)
return docs.sort((a, b) => a.distance - b.distance)
});
}
这样称呼...
getNearestWalk(userLocation.latitude, userLocation.longitude).then(array => {
// array will be the doc data, sorted by distance from userLocation
})