Sequelize、postgres 和 posgis:查找 n° 公里内的活动

问题描述 投票:0回答:1

请帮忙! 我有一个使用 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_dwithin(geometry, integer) 不存在”。 我有一段时间一直在为这个问题苦苦挣扎。有什么解决办法吗? 提前谢谢!!!

node.js postgresql sequelize.js postgis
1个回答
0
投票

当您仅将一个几何图形传递给函数时,您应该将

point
列作为
ST_DWithin
的第一个参数传递:

where: Sequelize.where(Sequelize.fn(
              'ST_DWithin',
              Sequelize.col('point'),
              Sequelize.fn(
                'ST_SetSRID',
                Sequelize.fn('ST_MakePoint', 40.119536, 8.495837),
                4326
              ),
              parseFloat(distance) // number 10000
            ),
            '=',
            'true'
          )
© www.soinside.com 2019 - 2024. All rights reserved.