【发布时间】:2016-06-09 22:51:00
【问题描述】:
我在 mongodb 中将行程/轨迹存储为LineString,索引为2dsphere。
根据提供的图片,Trip 1 是用户想要搜索的轨迹,Trip2-6 是已经存储在 mongodb 上的行程。
给定 $near 上的 maxDistance,Trip1 应该与所示的 Trip 3 和 4 “匹配”。
但是 $geointersects 似乎接受 Polygon or Multipolygon 作为 $geometry 类型,$near 似乎只接受 Point。
是否有任何省时方法来使用 mongo 查询实现以下场景?
谢谢!
编辑:正如 Alex Blex 所说,我将几何图形更改为 Polygon。
数据可视化(Trip 1 是搜索 Trip,Trip2-3 存储在 db 中)
所以我们在 mongo 上存储了以下文档:
Trip2
tripData: Object
{
type: Polygon
coordinates: [
[ [8,2] , [7,3] , [7,4], [8,2] ]
]
}
Trip3
tripData: Object
{
type: Polygon
coordinates: [
[ [3,1], [4,1], [4,1.9999], [3,1] ]
]
}
Trip 1 是我们搜索的行程
tripData: Object
{
type: Polygon
coordinates: [
[ [2,2] , [1,4] , [3,5] , [4,2] , [2,2] ]
]
}
我运行的查询如下:
db.trips.find({ tripData: { $geoIntersects : { $geometry : trip1 } } } )
此查询未按预期返回任何内容,因为行程不相交,正如您在可视化中看到的那样。如何修改查询以使用 $near 运算符将 Trip1 与 Trip3 匹配?
【问题讨论】:
-
如何存储行程?如果它只是一条线,你可以做一个简单的数学来计算交点。
-
我将行程存储为 LineString(这意味着坐标数组),但我想利用 2dsphere 索引并拥有 mongo 在处理地理空间数据方面提供的效率。此外,我认为做数学运算会很耗时,因为在最坏的情况下,我必须将行程 1 的每个点与其他行程的每个其他点进行比较。
-
“数学”是指通过将
near值添加到坐标,将目标Trip 1转换为多边形。基本上是地理相交您绘制的石灰形状。如果你提供一些数据,用代码回答会更简单。 -
@AlexBlex 感谢您抽出宝贵时间,我已经编辑了问题。
-
您不喜欢测试驱动的方法,对吗 =) 我希望看到 2 个文档和 1 个查询,其坐标您知道应该只返回 1 个文档,例如
Trip 4和Trip 6文档,以及Trip 1带有near值的查询。
标签: mongodb gis geospatial