Mongodb $geoIntersect 问题

Posted

技术标签:

【中文标题】Mongodb $geoIntersect 问题【英文标题】:Mongodb $geoIntersect issue 【发布时间】:2015-01-27 05:43:59 【问题描述】:

我有一个带有“地点”属性的集合,如下所示。

"place" : 
    "name" : "Central Region",
    "country" : "Country_A",
    "coor_type" : "Polygon",
    "coordinates" : [ 
        [ 
            [ 
                103.749959507073, 
                1.2123138339349
            ], 
            [ 
                103.918426999964, 
                1.2123138339349
            ], 
            [ 
                103.918426999964, 
                1.36874499902569
            ], 
            [ 
                103.749959507073, 
                1.36874499902569
            ]
        ]
    ]

我正在尝试使用 $geoInterset 运算符来获取 place.coordinates 与由两点定义的矩形相交的文档列表。

[ [103.591247, 1.222136], [104.040313, 1.477497] ] 

第一个点是矩形的左下角和另一个右上角。

我写了一个查询:

db.Document.find(
    'place.coordinates':
        $geoIntersects: 
            $geometry:
                type:'Polygon'
                , coordinates:[[103.591247,1.222136],[104.040313,1.477497]]
                
            
        
    
);

然而,mongodb 一直在抱怨

error: 
    "$err" : "Malformed geo query:  $geoIntersects:  $geometry: 
     type:\"Polygon\", 
        coordinates:[[103.591247,1.222136],[104.040313,1.477497]]
    ",
"code" : 16677

我尝试过不同的类型,例如“Box”和“LineString”。框会给出类似的错误。 LineString 不会抱怨,但也不会返回任何结果。

我在这里做错了什么?有什么建议吗?

【问题讨论】:

存储的数据和查询示例均无效。 GeoJSON 中的多边形需要以原点开始和结束,其他坐标对代表每个顶点。 谢谢,尼尔。得到它。 【参考方案1】:

主要问题是place 文档和查询不是正确的 Polygon GeoJSON 文档。

以下是解决方法。

1)

LinearRing 的第一个和最后一个坐标必须相同。

多边形由一组 GeoJSON LinearRing 坐标数组组成。这些线性环是封闭的线串。 Closed LineStrings 至少有四个坐标对,并指定与第一个和最后一个坐标相同的位置。 -- MongoDb doc - Polygon

2)

coor_type 重命名为 type 以符合 GeoJSON 标准。

 <location field>:  type: "<GeoJSON type>" , coordinates: <coordinates>  

为了索引 GeoJSON 数据,您必须将数据存储在您命名的位置字段中。位置字段包含一个子文档,其中一个类型字段指定 GeoJSON 对象类型,一个坐标字段指定对象的坐标。始终按经度、纬度顺序存储坐标。 Mongodb docs - geojson polygon

示例 GeoJSON 多边形文档插入:

var obj = 
    "place": 
        "name": "Central Region",
        "country": "Country_A",
        "type": "Polygon",
        "coordinates": [
            [
                [
                    103.749959507073,
                    1.2123138339349
                ],
                [
                    103.918426999964,
                    1.2123138339349
                ],
                [
                    103.918426999964,
                    1.36874499902569
                ],
                [
                    103.749959507073,
                    1.36874499902569
                ],
                [
                    103.749959507073,
                    1.2123138339349
                ]
            ]
        ]
    
;

db.geo.drop();
db.geo.insert( obj );

//Use the 2dsphere index to validate your GeoJSON format
// and speed up queries
db.geo.ensureIndex( "place"  : "2dsphere" )

3)

确保您的查询具有正确的多边形值,并且在包含typecoordinates 字段的字段上进行搜索。 您在字段 place.coordinates 上搜索,而它应该是 place

$geoIntersects 查询示例

db.geo.find(
    place: 
        $geoIntersects: 
            $geometry: 
                type: "Polygon",
                coordinates: [
                    [
                        [
                            103.749959507073,
                            1.2123138339349
                        ],
                        [
                            103.918426999964,
                            1.2123138339349
                        ],
                        [
                            103.918426999964,
                            1.36874499902569
                        ],
                        [
                            103.749959507073,
                            1.36874499902569
                        ],
                        [
                            103.749959507073,
                            1.2123138339349
                        ]
                    ]
                ]
            
        
    
)

【讨论】:

以上是关于Mongodb $geoIntersect 问题的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

$geoIntersects 不像预期的那样工作

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