Sequelize – 寻找范围内的点

Posted

技术标签:

【中文标题】Sequelize – 寻找范围内的点【英文标题】:Sequelize – finding point in range 【发布时间】:2022-01-13 17:22:15 【问题描述】:

我有一个 Address 模型,它定义了 point 类型的 geometry 属性。 我想在传递latitudelongituderange 时创建一个函数,它会返回该范围内的所有地址(以米为单位)。我试图按照here 写的内容进行操作,但我得到了:

DatabaseError [SequelizeDatabaseError]: LWGEOM_dwithin: Operation on mixed SRID geometries (Point, 4326) != (Point, 0)

这是我在Address 模型中由point 定义的:

point: 
   type: DataTypes.GEOMETRY('Point'),
   allowNull: true,
,

这是我正在尝试编写的函数:

const findInRangeFrom = (latitude, longitude, range) => 
  return Address.findAll(
    attributes: 
      include: [[
        Sequelize.fn(
          'ST_Distance',
          Sequelize.col('point'),
          Sequelize.fn('ST_MakePoint', longitude, latitude),
        ),
        'distance',
      ]],
    ,
    where: Sequelize.where(
      Sequelize.fn(
        'ST_DWithin',
        Sequelize.col('point'),
        Sequelize.fn('ST_MakePoint', longitude, latitude),
        range,
      ),
      true,
    ),
    order: Sequelize.literal('distance ASC'),
  );
;

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

如果 DB 中的几何图形存储在 SRID 4326 中,那么您需要为您的测试点设置相同的 SRID,如下所示:

Sequelize.fn('ST_SetSRID', Sequelize.fn('ST_MakePoint', longitude, latitude), 4326)

如果反之亦然,那么您需要为point 列指明 SRID 4326:

Sequelize.fn('ST_SetSRID', Sequelize.col('point'), 4326)

【讨论】:

我绝对需要深入了解几何的工作原理!非常感谢 - 它解决了我的问题 :)!

以上是关于Sequelize – 寻找范围内的点的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize包括范围为1的对象:m constraint = false

使用 Serverless Aurora 时 Sequelize 连接超时,寻找增加超时持续时间或重试连接的方法

Sequelize 表名更改

Sequelize 基于关联的查找

表不存在 Sequelize

Sequelize include 在另一个 include 中