Mongodb 使用';地理范围内';比如';近';

Mongodb 使用';地理范围内';比如';近';,mongodb,meteor,geospatial,Mongodb,Meteor,Geospatial,我正在尝试实现一个搜索功能,它可以搜索某个位置内的位置,也可以搜索该位置以外的某个距离内的位置 这就是我目前所拥有的:(使用流星) 这可以正确地找到这个多边形内的所有地方……但我也希望能够找到这个多边形外3英里的地方(希望这有意义) 我希望能够在$near上实现类似$maxDistance的选项 希望有人能给我指出正确的方向,谢谢不同版本的MongoDB支持不同的地理索引和查询选项。Meteor过去只支持较旧的MongoDB版本(1.0.4之前)。我不得不尝试不同的方法,这就是自Meteor 0

我正在尝试实现一个搜索功能,它可以搜索某个位置内的位置,也可以搜索该位置以外的某个距离内的位置

这就是我目前所拥有的:(使用流星)

这可以正确地找到这个多边形内的所有地方……但我也希望能够找到这个多边形外3英里的地方(希望这有意义)

我希望能够在$near上实现类似$maxDistance的选项


希望有人能给我指出正确的方向,谢谢不同版本的MongoDB支持不同的地理索引和查询选项。Meteor过去只支持较旧的MongoDB版本(1.0.4之前)。我不得不尝试不同的方法,这就是自Meteor 0.9以来对我有效的方法:

var query = {
        loc: {
            $nearSphere: {
                $geometry: user.watchLocation,
                $maxDistance: 1000 //1 km
            }
        }
    };
使用2dsphere索引:

Places._ensureIndex({
    loc: "2dsphere"
});
并且具有
place.loc
属性以及
user.watchlocation
以以下格式存储:

place.loc = {
     type: "Point",
     coordinates: [pos.lng, pos.lat]
};
你想要的是所谓的“缓冲”。向多边形添加缓冲区,然后在新缓冲多边形内执行
$geoin

如果3英里范围是静态的,我建议将其保存为一个单独的
searchRange
字段并为其编制索引。或者,将其卸载到客户端:-)

如果要区分原始形状中的POI和缓冲区中的POI,请针对原始形状对返回的结果执行附加查询。因为列表应该大大减少,所以这里不需要索引


这里有一个简单的工具可以帮助您入门:

尝试查询,然后询问“问题出在哪里”,谢谢@Florian的回复!先试试这个。。。但是,如果使用$nearSphere,您只会得到距离位置中心1公里(而不是距离位置周长1公里)的结果?您是对的,我在您的问题中忽略了多边形周长。
place.loc = {
     type: "Point",
     coordinates: [pos.lng, pos.lat]
};