我有一个Mongo集合,我正在尝试执行一个$geoIntersects查询。
以芒果为单位的数据形式如下:
{
"_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的某个点上才能被匹配,或者我正在执行的查询还有什么问题吗?
发布于 2014-05-28 21:10:20
如果在Postgis中运行相同的查询,则得到的答案为true。
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源代码和它们的测试,除了端点之外,没有一个是在线的。MongoDB与https://github.com/mongodb/mongo/blob/master/src/mongo/db/geo/geoquery.cpp中的函数交叉,实际上使用第三方s2模块进行实际的数学交叉,参见party/s2/s2latlngrect.cc。这就是我所能得到的。
我不是把这当作回答,因为我没有答案,但格式比评论好。
https://stackoverflow.com/questions/23917190
复制相似问题