MongoDB - GeoJSON - 在半径内查找文档

时间:2016-09-09 07:00:10

标签: mongodb latitude-longitude geojson

感谢先前的计算,我有一个先前查询过的城镇中心的坐标:[lon, lat]。我在查询radius中有另一个参数。我想在这个虚拟的cercle中找到我的数据库中的每个文件。

我的架构:

const artisanSchema = new Schema ({
  created: { type: Date, default: Date.now },
  updated: { type: Date, default: Date.now },
  name: { type: String, index: true },
  address: {
    street: String,
    zip: { type: String, index: true },
    town: { type: String, index: true }
  },
  contact: {
    tel: String,
    mail: String,
    web: String
  },
  activities: [String],
  type: String,
  geometry: mongoose.Schema.Types.Point, //"geometry": {"coordinates":[0.704378,45.194518],"type": "Point"
}
  tagMetier: [Number]
});

我尝试这样的查询:

Artisan.
  find ({
    'tagMetier': tag,
    'geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad ] } }
  },
  function (err, artisan) {
    if (err) throw err;
    else {
      res.send(artisan);
    }
  })
  .limit(10)

如果我的目标是我自己的半径为5公里的城镇,那么我可以从我居住的地方获得200公里以上的城镇答案。

2 个答案:

答案 0 :(得分:0)

首先创建索引

您可以确保moongose schema level上的索引或直接Mongodb收藏

这样的Mongo DB

db.Artisan.createIndex( { geometry : "2dsphere" } )

或在moongse Scehema Level

 geometry: mongoose.Schema.Types.Point, index: "2dsphere"

现在查询

  Artisan.find({ location:
   { $geoWithin:
      { $centerSphere: [ [ myTown.longitude, myTown.latitude ], 5 / 3963.2 ] } } ,'tagMetier': tag})

假设你的半径是弧度
以下将在5英里内找到所有工匠

您可以使用$maxDistance作为meter

var METERS_PER_MILE = 1609.34
Artisan.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ myTown.longitude, myTown.latitude ] }, $maxDistance: rad * METERS_PER_MILE } } })

有关详细信息,请查看此信息 https://docs.mongodb.com/manual/tutorial/geospatial-tutorial/

答案 1 :(得分:0)

傻了我,

rad不是像公里那样的度量单位,而是以弧度为单位,因为地球是一个不完美的椭球体(所以我们通过将它计算为一个大球来简化)。

如果我想要以公里为单位的结果,我必须这样做:rad/6378.1 英里:rad/3963.2

最后我写道:geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad/6378.1 ] } }

瞧。