mongo检查点是否在存储的多边形内

时间:2017-01-28 20:10:05

标签: node.js mongodb mongoose geospatial

我有一个用户集合,每个用户都有一个点

userSchema

username: string,
location: {
      type: { type: String, default: 'Point' },
  coordinates: {type: [Number], default: [0,0] }
},

此外,我还有一个位置集合,其中每个位置都是多边形。

locationsSchema

name: {type: String, required: true},
area: {
  type: { type: String, default: 'Polygon' },
  coordinates: {type: [], required: true }
}   

现在我说我选择了2个位置的poygons [id1,id2]。我想找到这个位置内的所有用户,即poygon id1和id2。 我该怎么做?

我知道如果我有一点我可以找到像这样的多边形

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

但是,如果我被赋予多边形并且想要找到其中的所有用户呢?

修改

我想出了一个多边形,我可以做到这一点

User.find({location: { $geoWithin: { $geometry: locations[0] }}});

我如何处理多个多边形?

1 个答案:

答案 0 :(得分:0)

对于有此问题的任何人。我只是通过创建遍历所有多边形的Multipolygon来解决它。

var loc_json = {type: 'MultiPolygon', coordinates: []};
var flat_loc = _.flatMap(all_loc, 'locations');
var locations = [];
_.forEach(flat_loc, function(loc) {
   locations.push(loc.area.coordinates);
});
loc_json.coordinates = locations;
User.find({location: { $geoWithin: { $geometry: loc_json }}});