每日数据库知识-mongodb查询基于经纬度的两点距离

245 阅读2分钟

mongodb内置地址位置数据类型,可以用来记录和查询地址位置信息,查询形式多样,记录位置的格式为GeoJson,比如基于两点的经纬度来计算直线距离。

每日数据库知识

GeoJSON(地理JSON)是一种轻量级的数据交换格式,用于存储和传输地理空间数据。它基于JSON(JavaScript Object Notation)标准,因此易于理解和使用。GeoJSON可以表示多种地理空间数据类型,包括点、线、多边形、多点、多线和多面。 GeoJSON的主要特点包括:

  1. 简单性:GeoJSON的结构简单,易于理解和实现。
  2. 可扩展性:它允许用户定义自己的字段和属性。
  3. 兼容性:由于它是基于JSON,因此可以轻松地与Web应用程序集成。
  4. 空间索引:GeoJSON支持空间索引,这使得在数据库中快速查询地理空间数据成为可能。

GeoJSON在地理信息系统(GIS)领域得到了广泛应用,它被用于存储、传输和查询地图数据。例如,在MongoDB中,可以使用GeoJSON格式来存储和查询地理位置数据。

MongoDB 有两种类型的地理空间索引:2dsphere 和 2d。2dsphere 索引可以与基于 WGS84 基准的地球球面几何模型一起使用。这个基准将地球表面模拟成一个扁圆球体,这意味着在两极会比较扁。因此,使用 2dsphere 索引的距离计算考虑到了地球的形状,提供了比 2d 索引更准确的距离处理,比如计算两个城市之间的距离。在存储二维平面上的点时使用 2d 索引。

一个点由一个二元数组给出,表示 [ 经度,纬度]​(​[longitude,latitude]​)​:

{
    "name" : "New York City",
    "loc" : {
        "type" : "Point",
        "coordinates" : [50, 2]
    }
}

本例中所命名的 "loc" 字段可以是任意名称,但内嵌对象中的字段名称是由 GeoJSON 指定的,不能更改。

可以使用 3 种类型的地理空间查询:交集(intersection)​、包含(within)和接近(nearness)​。查询时,需要将想查找的内容指定为 {"$geometry" : geoJsonDesc} 格式的 GeoJSON 对象。

现在我们来使用mongodb内置的地理空间索引来计算一下西安北大街和北京天安门之间的直线距离。

访问 blog.51cto.com/u_16213434/… ,它介绍了一个例子。

db.places.insertOne({ name: 'XIAN', location: { type: 'Point', coordinates: [108.9469 , 34.2697] } })
​
db.places.createIndex({ location: '2dsphere' })
​
# 北京天安门
db.places.aggregate([{ $geoNear: { near: { type: 'Point', coordinates: [116.3980, 39.9093] }, distanceField: 'distance', spherical: true } }])
​

输出的结果如下:

{
  _id: ObjectId('66b95aab307ce07a53b1bf29'),
  name: 'XIAN',
  location: {
    type: 'Point',
    coordinates: [
      108.9469,
      34.2697
    ]
  },
  distance: 911436.0401364684
}

这个结果是911436米,大约是 911.44公里,经过验证发现结果大致准确,因为经纬度距离有不同的算法,无法知晓Mongdob是用的什么内置的算法。

使用 jingweidu.bmcx.com/ 这个网址查询地点的经纬度。

使用 www.lddgo.net/convert/dis… 这个网址查询经纬度的距离。