MongoDB $geoIntersects 与 LineString 类型不匹配

Posted

技术标签:

【中文标题】MongoDB $geoIntersects 与 LineString 类型不匹配【英文标题】:MongoDB $geoIntersects does not match LineString type 【发布时间】:2014-07-18 00:07:57 【问题描述】:

我有一个 Mongo 集合,我正在尝试对其执行 $geoIntersects 查询。

mongo中的数据格式为:


    "_id" : ObjectId,
    "created_at" : ISODate,
    "sentiment" : 0.631925,
    "yyyy-mm" : "2012-9",
    "lat_lon" : [
        -2.0566385,
        52.84265
    ]

以以下形式运行 $geoIntersects 查询:

db.gbSmall.findOne(
    lat_lon: 
        $geoIntersects: 
            $geometry: 
                type: "Point",
                coordinates: [-2.0566385,52.84265]
            
        
    
)

db.gbSmall.findOne(
    lat_lon: 
        $geoIntersects: 
            $geometry: 
                type: "LineString",
                coordinates: [[-2.0566385,52.84265],[-3.0566385,52.84265]]
            
        
    
)

两者都正确返回记录;但是,如果我更改查询,使线穿过该点,例如:

db.gbSmall.findOne(
    lat_lon: 
        $geoIntersects: 
            $geometry: 
                type: "LineString",
                coordinates: [[-1.0566385,52.84265],[-3.0566385,52.84265]]
            
        
    
)

记录没有返回。

记录是否必须落在 geoJSON lineString 的某个点上才能匹配,还是我正在执行的查询有其他问题?

【问题讨论】:

我可以确认您的结果。有趣的问题。我尝试使用没有小数位的数字,例如 [-3,50] 到 [-1,50] 的线是否与点 [-2,50] 相交,但没有返回任何内容。我的猜测是它与舍入精度有关。我快速浏览了源代码,但无济于事,因为我不是 c++ 大师。 您对此有进一步了解吗?在我头晕目眩之前,我仔细查看了源代码,但我有理由确定这是一个错误。 【参考方案1】:

如果您在 Postgis 中运行相同的查询,您会得到正确的答案。

Select ST_Intersects(ST_GeomFromText('POINT(-2.0566385 52.84265)', 4326),
 ST_GeomFromText('LINESTRING(-1.0566385 52.84265,-3.0566385 52.84265)', 4326));

对于类似的健全性检查查询,您也会得到相同的答案:

Select ST_Intersects(ST_GeomFromText('POINT(-2 50)',4326),
 ST_GeomFromText('LINESTRING(-3 50, -1 50)',4326));

而 MongoDB 版本对于您上面给出的等效查询均不返回任何内容。

对我来说,这看起来像是一个错误。我检查了 MongoDB 源代码和他们的测试,除了端点之外,没有一个在线点。 https://github.com/mongodb/mongo/blob/master/src/mongo/db/geo/geoquery.cpp 中的 MongoDB intersects 函数实际上使用 3rd 方 s2 模块来执行实际的数学交集,请参阅 https://github.com/mongodb/mongo/blob/master/src/third_party/s2/s2latlngrect.cc。这就是我所得到的。

我没有将此作为答案,因为我没有答案,但格式比 cmets 更好。

【讨论】:

这个问题在 Mongo 中修复了吗? @KoustavChanda,我不知道,我不再使用 MongoDB。

以上是关于MongoDB $geoIntersects 与 LineString 类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中正确使用 $geoIntersects?

MongoDB $geoIntersects 不返回特定城市的任何数据

mongodb - $geoIntersects 按重叠百分比排序

地理空间查询是不是适用于数组? ($geoWithin, $geoIntersects)

如何在 $geoIntersects 查询中使用当前文档字段之一作为坐标

$geoIntersects 不像预期的那样工作