Skip to content
本页目录

基于地理位置查询

AirCode 数据库支持存储地理位置数据,并基于地理位置来实现查询。这可以让你快速实现类似查找附近的饭店、查找一个区域内的景点等操作。

存储地理位置数据

在 AirCode 的数据库中,地理位置数据是包含 typecoordinates 两个字段的对象。例如以下对象代表一个地理点:

js
// A point at 103.7715° E, 29.5441° N
{
  type: 'Point',
  coordinates: [ 103.7715, 29.5441 ]
}
// A point at 103.7715° E, 29.5441° N
{
  type: 'Point',
  coordinates: [ 103.7715, 29.5441 ]
}

其中 type 代表地理位置的类型,coordinates 代表地理位置的坐标。

重要提示

当用经纬度来表示坐标时,经度在前,纬度在后

  • 经度值为 -180 到 180,正数代表东经,负数代表西经
  • 纬度值为 -90 到 90,正数代表北纬,负数代表南纬

完整的地理位置对象定义及示例,可参考数据库 API - 地理位置对象

建立地理索引

要想在数据库中基于地理位置查询,首先需要对查询的字段建立地理位置索引(2DSPHERE)。

在控制台的 Database 区域中,选中数据表,并切换到 Indexes 标签可以看到所有已经建立的索引。

点击右侧的添加索引图标,在弹出对话框中选择存储地理位置的字段,并将索引类型选择为 2DSPHERE ,点击 Create 完成创建。

注意

对于要建立地理索引的字段,其存储的值必须为地理位置数据,否则为索引会失效。

成功后,可以看到列表中出现了刚才创建的索引。此时就可以在查询时对该字段使用地理操作符了。

使用地理操作符查询

对于已经建立了地理索引的字段,可以通过地理操作符来实现基于地理位置的查询。所有地理操作符都在 aircode.db 对象下。

例如,查询 position 字段值在对应点附近,距离大于 100 米小于 2000 米的所有记录:

js
const aircode = require('aircode');

module.exports = async function(params, context) {
  // All operators are nested in `aircode.db`
  const { db } = aircode;
  // Use `db.table` to get a table
  const PlacesTable = db.table('places');

  // Query operations on geospatial data
  const result = await PlacesTable
    .where({
      position: db.near({
        $geometry: {
          type: 'Point',
          coordinates: [ -73.9855, 40.7580 ]
        },
        $maxDistance: 2000, // in meters
        $minDistance: 100   // in meters
      })
    })
    .find();

  return {
    result
  };
}
const aircode = require('aircode');

module.exports = async function(params, context) {
  // All operators are nested in `aircode.db`
  const { db } = aircode;
  // Use `db.table` to get a table
  const PlacesTable = db.table('places');

  // Query operations on geospatial data
  const result = await PlacesTable
    .where({
      position: db.near({
        $geometry: {
          type: 'Point',
          coordinates: [ -73.9855, 40.7580 ]
        },
        $maxDistance: 2000, // in meters
        $minDistance: 100   // in meters
      })
    })
    .find();

  return {
    result
  };
}

完整的地理操作符和示例,可参考数据库 API - 地理操作符