MongoDB $ geoIntersects与LineString类型不匹配

时间:2014-05-28 16:31:18

标签: mongodb geojson geo

我有一个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的一个点上,或者我正在执行的查询是否有其他错误?

1 个答案:

答案 0 :(得分: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实际上使用第三方s2模块来进行实际的数学交叉,请参阅https://github.com/mongodb/mongo/blob/master/src/third_party/s2/s2latlngrect.cc。就我而言。

我并不认为这是一个答案,因为我没有答案,但格式比评论更好。