Mongodb:检查一个点是否在存储的多边形内

20

我刚开始接触mongodb地理位置特性。

我在数据库中存储了一些代表国界的多边形和对应的国家名称。现在我想要检查一个点位于哪个国家。例如,如果我提供我的地理位置,我希望得到我所在的国家。

有没有用mongodb实现这个功能的方法?也许可以使用geoWithin?

谢谢


请查看以下答案:https://dev59.com/6mfWa4cB1Zd3GeqPi50B 和 https://dev59.com/UmTWa4cB1Zd3GeqPB02j。两个问题都很相关且都有解决方案。 - Rasim
2
我需要相同的内容。@brotherofken:问题正好相反:我需要搜索包含参数点的多边形(存储在mongodb中)。我找不到任何这方面的例子。 - g.annunziata
我需要找出一个点是否在一个封闭的圆内。有什么方法可以实现吗? - Saras Arya
4个回答

9
你必须按照以下模式存储位置数据:
{"loc":
     {"coordinates":[
       [
         [1.0,1.0],
         [1.0,10.0],
         [10.0,10.0],
         [10.0,1.0],
         [1.0,1.0]
       ]
      ],
     "type":"Polygon"
   }
}

然后发送$geoIntersects查询

db.polygons.find({"loc":{"$geoIntersects":{"$geometry":{"type":"Point", "coordinates":[x, y]}}}}

为什么在坐标中存在一个包含另一个数组的数组呢?再添加一组坐标对我们有什么作用呢?例如,[[[1,1],...],[[2,2]...]]。 - Stan Bondi
也许一个多边形可以位于另一个多边形内部。 - David Chaava
是的,我一段时间前发现下一个数组元素指定了“切掉”外部多边形的多边形。https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple - Stan Bondi

7

您需要使用$geoIntersects来实现此功能。

db.features.find({mystoredpolygon:{$geoIntersects:{$geometry:{type:'Point', coordinates:[22,38]}}}})

是的,$geoIntersects 可以使用。这是参考链接:MongoDB $geoIntersects - Adam

4

1
谢谢提供多边形,但我已经得到了一个更精确的集合,只是不记得从哪里得到的了。你认为我需要遍历所有这些多边形来查找点所在的位置吗?还是说MongoDB的geoWithin可以帮助我避免这种回溯? - SkinyMonkey
1
geoWithin 返回多边形内的所有要素。geoIntersects 返回与要素(在此情况下为点)相交的要素。因此,在这种情况下,geoIntersects 可以在一个查询中精确地给出您想要的结果,而您必须对每个多边形运行 geoWithin。 - Cody Django

0
你的情况似乎与MongoDB地理空间教程示例相同,该示例使用$geoIntersects而不是$geoWithin
就像MongoDB文档中显示的示例一样,假设你在数据库中存储了代表国家的多边形,并且一个点是你当前的位置,你可以使用MongoDB的$geoIntersects地理空间查询功能来执行以下查询。
db.neighborhoods.findOne({
     geometry: { 
        $geoIntersects: {
             $geometry: { 
                type: "Point", 
                coordinates: [ -73.93414657, 40.82302903 ] 
            }
        } 
    } 
})

在这里,neighborhood 是你的集合,其中存储了你所在国家的多边形。查询的第二行中的 geometry 是存储在数据库中的实际多边形(即 Geo-Json 格式)。而 $geometry 中的 "Point" 则是你想要查找所在国家的当前位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接