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 个文档中计算坐标距离的主要内容,如果未能解决你的问题,请参考以下文章

怎么算经纬度和距离呢?

GraphQL和MongoDB` $ geoNear`聚合

MongoDB聚合:计算数组元素或距离之间的差异

计算 2 个坐标 iphone 之间的距离 - 最佳实践

Android java从sqlite计算距离许多坐标[重复]

计算距离一个坐标的新坐标 x 米和 y 度