mongodb - 反直观的 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
}
})
解决方案
推荐阅读
- python - RuntimeError:请确保已安装 R(已编辑)
- python - 如何复制选定的文件而不将其移动到python中的另一个目录
- tensorflow - 无法在 TensorFlow 2.x 版的 GraphDef 中加载冻结模型 (.pb)
- numpy - 如何从 np.unique 重建数组
- javascript - 来自 Firebase 存储 URL 的 toDataURL 显示空白图像
- django - 查询数据库时如何使用 django-postgrespool2 设置的池连接?
- angular - 服务器上的页面刷新问题(404) - Angular
- html - 更改大小后不显示画布
- javascript - 如何使用 xpath 通过 SAMLResponse 获取状态
- javascript - 为什么使用 Hooks 的 ReactJS 组件会根据开发者控制台是否打开而呈现一次或两次?