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)
确保您的查询具有正确的多边形值,并且在包含type
和coordinates
字段的字段上进行搜索。
您在字段 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 不返回特定城市的任何数据