使用' geoWithin'喜欢' near'

时间:2015-03-20 10:38:08

标签: mongodb meteor geospatial

我正在尝试实施搜索功能,搜索某个位置的位置以及距离此位置之外的距离。

这是我到目前为止:(使用Meteor)

Places.find({
    location: {
        $geoWithin: {
            $geometry: {
                type: 'Polygon',
                coordinates: [[[-3.2714903,51.4671222], ... ]]
            }
        }
    }
}).fetch();

这会正确找到这个多边形内的所有地方......但我也希望能够找到距离它3英里的地方(希望这是有意义的)

我希望能够在$ near

上实现类似$ maxDistance选项的功能

希望有人能指出我正确的方向,谢谢

2 个答案:

答案 0 :(得分:0)

不同版本的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]
};

答案 1 :(得分:0)

你想要的是“缓冲”。向多边形添加缓冲区,然后执行$geoWithin新的缓冲多边形。

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

如果您想区分原始形状中的POI和缓冲区内的那些对原始形状的返回结果进行额外查询。由于列表应该大大减少,这里不需要索引。

这是一个简单的工具,可以帮助您入门:https://github.com/Turfjs/turf-buffer