请救救我! 我有一个项目使用Sequelize,Postgres和Postgis(用于GPS). 模式(简化)为:

export default class Activity extends Model {
  static init(sequelize) {
    return super.init({
      sequelize,
      tableName: 'activities',
    })
  }

  static get modelAttributes() {
    return {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },

      activity_name: {
        type: 'citext',
        allowNull: false,
        unique: {
          args: true,
          msg: 'Activity name already in use.',
        },

      point: {
        type: DataTypes.GEOMETRY,
        allowNull: true,
      },
    }
  }
}

我没有放置迁移文件,因为这部分工作得很好:当我保存数据时,它被正确注册.

await Activity.bulkCreate({
  activity_name: 'whatever,
  point: { type: 'Point', coordinates: [lat, lng] },
})

当我试图在一定距离内进行活动时,问题就出现了:

const result = await User.findAll({
      include: [
        {
          model: Activity,
          required: true,
          where: {
            point: Sequelize.fn(
              'ST_DWithin',
              Sequelize.fn(
                'ST_SetSRID',
                Sequelize.fn('ST_MakePoint', 40.119536, 8.495837),
                4326
              ),
              parseFloat(distance) // number 10000
            ),
          },
        },
      ],
    })

下面的代码抛出一个错误:"函数st_din(geomy,integer)不存在". 我在这个问题上挣扎了一段时间.有什么解决办法吗? 提前感谢!

推荐答案

这个问题有两个方面:

  1. ST_DWithin()需要两个几何图形和一个距离限制.您只提供了一个几何体和限制:

    布尔ST_DWithin(几何g1、几何g2、双精度distance_of_srid);

  2. ST_SetSRID()会将参考系的上下文添加到提供的几何图形.您 Select 了EPSG:4326,它使用geographical degrees作为基本单位,而不是米,也不是英里.ST_DWithin文档中有一个警告:

    距离以几何图形的空间参考系定义的单位指定.

    这意味着180度的距离限制已经返回所有东西,不过滤任何东西,因为在球体上,你总是最多180度的距离:东经181度,西经179度.Change the SRID或换算单位:假设WGS-84‘S球面地球半径为6371008.8m,你可以通过将周长除以360度:6371008.8*2*pi/360来得出111195.08m度.那么,一米等于1/111195.08度,这就是为什么你可能想要交换一下:

    parseFloat(distance) * 5000
    

    为此

    parseFloat(distance) /111195.08
    

Node.js相关问答推荐

使用 axios 和 Cheerio (Node js) 抓取 google 搜索

Rest-Api动态图像路径和Express除非

无法使用 Express 设置会话 cookie 的过期日期

$not 的聚合版本是什么?

如何获取文件的中间值?

为什么我不能将 id 发送到后端并通过 findByIdAndRemove() 删除项目?

使用 Nodejs 获取 Firebase 云消息传递历史记录

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

使用 Node.js 在 MongoDB 中搜索

为什么 req.params.id 返回 undefined未定义?

您如何写入 aws lambda 实例的文件系统?

提供静态文件到底是什么意思?

适用于 Windows 7 的 NodeJS

异步函数 - 等待不等待promise

Bootstrap 中的 Grunt 依赖冲突

Node应用程序中相同npm包的两个版本

响应分块时获取整个响应正文?

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?

Node.js 中的 PHP exit()/die() 类似功能是什么

我无法全局安装 nodemon,nodemon无法识别