Mongodb $ geoIntersect问题

时间:2015-01-27 05:43:59

标签: mongodb geolocation mongodb-query

我有一个带有属性'place'的集合,如下所示。

"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'。 Box会给出类似的错误。 LineString不会抱怨,但也不会返回任何结果。

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

1 个答案:

答案 0 :(得分:1)

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

以下是如何修复它。

1)

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

  

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

2)

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

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

为了索引GeoJSON数据,您必须将数据存储在您命名的位置字段中。 location字段包含一个子文档,其子类型字段指定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
                        ]
                    ]
                ]
            }
        }
    }
})