koa + sequelize做距离计算(MySql篇)

1.核心思路

1.利用sequelize的fn方法调用MySql原生函数(st_distance_sphere、point)

2.这里利用到了MySql的原生函数,不懂可以去看看mysql的函数知识

2.核心代码

//st_distance_sphere、point函数用来计算当前经纬度和目的地经纬度
//col为获取表头的字段名
//最后将计算完的值命名为"distance"
fn('st_distance_sphere' ,  fn('point', col('lng'), col('lat')) ,  fn('point', lng , lat)  )   , "distance" 

//示例
fn('st_distance_sphere' ,  fn('point', col('需要查询经度'), col('需要查询纬度')) ,  fn('point', 你的经度, 你的纬度)  )   , "distance" 

3.完整代码

const FindAll = async (ctx) => {
    try {
        const { pageNum, pageSize , lng , lat } = ctx.query;
        if (!pageNum && !pageSize) {
            return ctx.app.emit('error', parameterMissingError, ctx)
        }
        const res = await Works.findAndCountAll({
            raw: true,
            nest: true,
            attributes:{
              include:[
                // 原生函数计算距离
                [ fn('st_distance_sphere' ,  fn('point', col('lng'), col('lat')) ,  fn('point', lng , lat)  )   , "distance" ]
              ]  
            },
            include: [{
                as: 'user',
                model: User,
                attributes: ['nickName']
            }],
            limit: pageSize * 1,
            offset: (pageNum - 1) * pageSize * 1,
            order: [
                //根据距离排序
                [ fn('st_distance_sphere' ,  fn('point', col('lng'), col('lat')) ,  fn('point', lng , lat)  ) , 'DESC' ]
            ],
        })
        ctx.body = { code: 200, msg: '查询成功', data: res }
    } catch (err) {
        console.log(err)
        return ctx.app.emit('error', findError, ctx)
    }
}

4.效果展示

distance就是查询到的参数,需要用parseFloat((distance/1000).toFixed(2)) ; 转成km和保存两位小数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值