mongodb 从 5400 个文档中计算坐标距离
Posted
技术标签:
【中文标题】mongodb 从 5400 个文档中计算坐标距离【英文标题】:mongodb Calculate distance from coordinates from 5400 documents 【发布时间】:2017-08-01 15:42:09 【问题描述】:我有一个包含 5400 个文档的集合。我在足球比赛中保留了 1 名球员的数据。每一秒我都会从玩家那里得到长和纬。现在我想要玩家在游戏过程中的总距离。
一些想法?
这是一个文档的示例:
"_id" : ObjectId("59807a01702661033d918e8e"),
"playerId" : 1,
"timestamp" : ISODate("2017-08-01T11:11:45.078Z")
"loc" :
"type" : "Point",
"coordinates" : [
4.94193,
51.32447
]
【问题讨论】:
见$geoNear
。它按“最近”排序并投影到查询位置的距离。如果您希望与查询点的距离超过 100 个文档(默认返回),那么您需要增加 "limit"
选项以满足您的集合大小或预期结果大小,无论您实际想要什么。通常我们不关心非常多的结果选择,而只是对“最近的”感兴趣。因此是合理的默认值。
我已经在寻找 $geonear 但我不知道如何使用它。可以举个例子吗?
您的意思是和示例一样的文档页面上列出的示例,实际上链接在上面给出的评论中?如果您“已经看过”,那么您应该已经看到了文档中演示的示例用法。这就是它的用途。
对不起,我的英语不是我的母语。我已经写了这段代码,但是我得到了最接近那个点的 28 个坐标,但是我想要坐标 1 和 2、2 和 3、3 和 4、... 5399 和 5400 之间的距离。db.playerTrackings_copy.aggregate([ $geoNear: near: type: "Point", coordinates: [ 4.931326 , 51.3210 ] , distanceField: "dist", spherical: true, limit: 28 , $sort: dist :-1 ])
【参考方案1】:
您可以获取玩家的所有点,计算它们之间的距离,并将距离相加。 距离计算,可以用这个算法(用php,希望没问题)
class Geo
const R = 6371000;
/**
* @param float[] $point1 latitude and longitude
* @param float[] $point2 latitude and longitude
* @return float
*/
static public function calculateDistance($point1, $point2)
$latRad1 = deg2rad($point1[0]);
$latRad2 = deg2rad($point2[0]);
$deltaLat = deg2rad($point2[0] - $point1[0]);
$deltaLon = deg2rad($point2[1] - $point1[1]);
$a = sin($deltaLat/2) * sin($deltaLat/2) +
cos($latRad1) * cos($latRad2) *
sin($deltaLon/2) * sin($deltaLon/2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
return self::R * $c;
希望对你有帮助。
【讨论】:
以上是关于mongodb 从 5400 个文档中计算坐标距离的主要内容,如果未能解决你的问题,请参考以下文章