微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反直觉的 MongoDB geoIntersects 结果 - 小的相交多边形不返回

如何解决反直觉的 MongoDB geoIntersects 结果 - 小的相交多边形不返回

我有一个带有地理围栏和定义点位置的 mongo 文档。我有一个用户四处走动,随着位置的变化发布他们的位置。我在发布的位置周围构建了一个地理围栏,并尝试查看该地理围栏是否包含文档的点位置或与文档的地理围栏相交。我得到的结果似乎不一致。

我希望以下两个查询都返回 1 个结果,但是,只有第一个查询返回结果。虽然这不是我期望地理空间交叉查询的工作方式,但似乎传递到查询中的地理围栏需要包含定义文档上地理围栏的点之一,而不仅仅是与其中一个边界相交。

如何编写 geoIntersects 查询,以便两个地理围栏都返回文档?或者我是否需要以某种方式以不同的方式定义文档的地理围栏?我已经尝试了文档和查询中地理围栏点的顺时针和逆时针定义。

The three geofences visualized

// 文档(黑色地理围栏)

{
    "_id" : ObjectId("5dbb51f8a6c14c000164dfcc"),"Name" : "Test Document","Location" : {
        "Longitude" : 55.1165732575153,"Latitude" : 25.0430787023156
    },"Hidden" : false,"Geofence" : [ 
        {
            "Longitude" : 55.1166610906269,"Latitude" : 25.0428277929586
        },{
            "Longitude" : 55.1166610906269,"Latitude" : 25.0428277929586
        }
    ]
}

// 1 个结果(绿色地理围栏)

db.getCollection('MyDocuments').find({
    "$or": [
        {
            "Geofence": {
                "$geoIntersects": {
                    "$geometry": {
                        "type": "polygon","coordinates": [
                            [
                                [
                                    55.11666456834192,25.042733676877324
                                ],[
                                    55.11676242159365,25.042760017397315
                                ],[
                                    55.11680236745489,25.042823609037915
                                ],[
                                    55.116761597245147,25.042887200678515
                                ],[
                                    55.11666456834192,25.042913541198506
                                ],[
                                    55.11656753943869,[
                                    55.11652676922895,25.042733676877324
                                ]
                            ]
                        ]
                    }
                }
            }
        },{
            "Location": {
                "$geoWithin": {
                    "$polygon": [
                        [
                            55.11666456834192,25.042733676877324
                        ],[
                            55.11676242159365,25.042760017397315
                        ],[
                            55.11680236745489,25.042823609037915
                        ],[
                            55.116761597245147,25.042887200678515
                        ],[
                            55.11666456834192,25.042913541198506
                        ],[
                            55.11656753943869,[
                            55.11652676922895,25.042733676877324
                        ]
                    ]
                }
            }
        }
    ],"Hidden": {
        "$ne": true
    }
})

// 0 结果(红色地理围栏)

db.getCollection('MyDocuments').find({
    "$or": [
        {
            "Geofence": {
                "$geoIntersects": {
                    "$geometry": {
                        "type": "polygon","coordinates": [
                            [
                                [
                                    55.116678546791337,25.042891386808234
                                ],[
                                    55.11677538065845,25.042917727328225
                                ],[
                                    55.116814920860168,25.042981318968825
                                ],[
                                    55.1167745795893,25.043044910609426
                                ],[
                                    55.116678546791337,25.043071251129417
                                ],[
                                    55.11658251399337,[
                                    55.116542172722507,25.042891386808234
                                ]
                            ]
                        ]
                    }
                }
            }
        },{
            "Location": {
                "$geoWithin": {
                    "$polygon": [
                        [
                            55.116678546791337,25.042891386808234
                        ],[
                            55.11677538065845,25.042917727328225
                        ],[
                            55.116814920860168,25.042981318968825
                        ],[
                            55.1167745795893,25.043044910609426
                        ],[
                            55.116678546791337,25.043071251129417
                        ],[
                            55.11658251399337,[
                            55.116542172722507,25.042891386808234
                        ]
                    ]
                }
            }
        }
    ],"Hidden": {
        "$ne": true
    }
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。