有没有办法找出特定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形状吗?到目前为止我发现的所有内容都表明反转是可能的(找到所有在圆圈内的点),但这种情况没有任何内容。
由于
答案 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数据库中。