首页 > 解决方案 > 反直观的 MongoDB geoIntersects 结果 - 小的相交多边形不返回

问题描述

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

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

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

可视化的三个地理围栏

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

{
    "_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
        }, 
        {
            "Longitude" : 55.1166610906269,
            "Latitude" : 25.0428277929586
        }, 
        {
            "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,
                                    25.042887200678515
                                ],
                                [
                                    55.11652676922895,
                                    25.042823609037915
                                ],
                                [
                                    55.11666456834192,
                                    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,
                            25.042887200678515
                        ],
                        [
                            55.11652676922895,
                            25.042823609037915
                        ],
                        [
                            55.11666456834192,
                            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,
                                    25.043044910609426
                                ],
                                [
                                    55.116542172722507,
                                    25.042981318968825
                                ],
                                [
                                    55.116678546791337,
                                    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,
                            25.043044910609426
                        ],
                        [
                            55.116542172722507,
                            25.042981318968825
                        ],
                        [
                            55.116678546791337,
                            25.042891386808234
                        ]
                    ]
                }
            }
        }
    ],
    "Hidden": {
        "$ne": true
    }
})

标签: mongodbgeospatial

解决方案


推荐阅读