我有一个带有属性'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不会抱怨,但也不会返回任何结果。
我在这里做错了什么?有什么建议吗?
答案 0 :(得分:1)
主要问题是place
文档和查询不是正确的Polygon GeoJSON文档。
以下是如何修复它。
LinearRing
的第一个和最后一个坐标必须相同。
多边形由一组GeoJSON LinearRing坐标数组组成。这些LinearRings是关闭的LineStrings。闭合的LineStrings具有至少四个坐标对,并指定与第一个和最后一个坐标相同的位置。 - MongoDb doc - Polygon
将coor_type
重命名为type
以符合GeoJSON标准。
{ <location field>: { type: "<GeoJSON type>" , coordinates: <coordinates> } }
为了索引GeoJSON数据,您必须将数据存储在您命名的位置字段中。 location字段包含一个子文档,其子类型字段指定GeoJSON对象类型,坐标字段指定对象的坐标。始终以经度,纬度顺序存储坐标。 Mongodb docs - geojson polygon
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" })
确保您的查询具有正确的多边形值,并搜索包含type
和coordinates
字段的字段。
您在字段place.coordinates
上搜索时应该是place
。
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
]
]
]
}
}
}
})