簡體   English   中英

MongoDB $ geoIntersects與LineString類型不匹配

[英]MongoDB $geoIntersects does not match LineString type

我有一個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的點上,或者我執行的查詢是否還存在其他問題?

如果在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源代碼和它們的測試,除了端點之外,沒有一個在線上的點。 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 據我所知。

我沒有將其作為答案,因為我沒有答案,但是格式比注釋中的格式好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM