我在2dsphere-indexed集合中插入一个Point,并试图在Polygon中找到它:
c = db.foo;
c.ensureIndex({'value.geometry': '2dsphere'});
c.insert({value: {geometry: {type: "Point", coordinates: [0, 0]}}});
c.findOne({'value.geometry': {$geoWithin: {$geometry:
{"type":"Polygon","coordinates":[[[-90,-90],[90,-90],[90,90],[-90,90],[-90,-90]]]}}}})
// Point is found
然而,当我对宽度超过180°的多边形做同样的事情时,找不到Point:
c = db.foo;
c.ensureIndex({'value.geometry': '2dsphere'});
c.insert({value: {geometry: {type: "Point", coordinates: [0, 0]}}});
c.findOne({'value.geometry': {$geoWithin: {$geometry:
{"type":"Polygon","coordinates":[[[-90.1,-90],[90.1,-90],[90.1,90],[-90.1,90],[-90.1,-90]]]}}}})
// no result -- why?
我在MongoDB手册中找不到任何相关信息。为什么限制?
答案 0 :(得分:2)
我想如果你的多边形超过180度经度,那么它可能会“关闭”地球的另一个方向。因此,点(0,0)实际上不再位于您的多边形内部。点(180,0)可能是。您可以通过在地球的“前”部分添加更多点来创建所需的多边形,如(0,-90)和(0,90)。
答案 1 :(得分:0)
经过实验,我得出结论drmirrors解决方案没有达到预期效果:你不得不在盒子的边界周围插入很多点,而且还要在盒子的内部插入很多点找到相交的形状。
至于这是否是预期的行为,MongoDB文档实际上说:“使用GeoJSON指定给$ geoIntersects查询的任何几何必须适合单个半球.MongoDB将大于一半球体的几何解释为较小的半球互补的几何形状。“
http://docs.mongodb.org/manual/reference/operator/geoIntersects/#op._S_geoIntersects
对于包含多个半球的查询,我完全禁用了过滤。