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和保存两位小数