如何获得包含Point的所有圈子?

时间:2014-08-20 22:25:56

标签: mongodb geojson

有没有办法找出特定Point所在的多边形(特别是圆圈)?

在这种情况下,我会存储一个包含圆圈的文档,如下所示,我会以经度和经度传递一个点,并希望找回该点在给定圆圈内的所有文档。

{
  "_id" : ObjectId("53e3e85ce4b0c2e8227a1dad"),
  "name" : "Menlo College",
  "location" : [-122.1928, 37.45632],
  "radius" : NumberLong(215),
},
{
  "_id" : ObjectId("53e43d19e4b0aeabcb3d3f9d"),
  "name" : "West Valley College",
  "location" : [-122.01021194458008, 37.263226547586207],
  "radius" : NumberLong(604),
}

如果这不可能,那么至少可以使用其他GeoJSON形状吗?到目前为止我发现的所有内容都表明反转是可能的(找到所有在圆圈内的点),但这种情况没有任何内容。

由于

1 个答案:

答案 0 :(得分:1)

可以使用MongoDB的$geoIntersects地理空间查询运算符。

因此,如果您有一组GeoJson多边形并且想要找出与给定点相交的所有多边形,那么您需要运行以下内容:

db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

在上面的命令中,loc是包含GeoJson多边形坐标的每个文档的属性。另外,请确保2dsphere以上的<locationFieldOfYourDocuments>索引。

现在,为了解决您的原始问题,我将使用一些javascript。可能有更好的解决方案,但不是我所知。

假设您的所有圈子都存储在Circles集合中。我将查询该集合并逐个获取每个圆,然后与另一个包含单个点的集合执行交叉,如果它与圆相交,则该单个点将是您想要查询的点。因此,请将该点存储在SinglePoint集合中。

脚本看起来像......

db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
    var circle = circleCursor.next();
    var coord = circle.location;
    var radiusInRadians = circle.radius * conversionFactorForRadius;
    var intersect = db.SinglePoint.find({loc :
                                         { $geoWithin :
                                           {$centerSphere : [coord], radiusInRadians}
                                         }});
    if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}

您所要做的就是将此脚本保存在文件(myScript.js)中并拨打电话:

mongo DBName pathTomyScript.js

这将存储与Intersects集合中的输入点相交的所有圆。以上所有集合都应该在DBName数据库中。