1.核心思路
1.利用sequelize的fn方法调用MySql原生函数(ST_Distance_Sphere 、POINT)
2.通MOD过函数将查询到的距离除以1000,这样km就变成了米 ,利用FOMAT函数将查询到的结果精确到两位小数
3.这里利用到了MySql的原生函数,不懂可以去看看mysql的函数知识
2.核心代码
//FORMAT函数保存位置后两位小数
//MOD函数将米转换成KM
//ST_Distance_Sphere、POINT函数用来计算当前经纬度和目的地经纬度
//col为获取表头的字段名
//最后将计算完的值命名为"distance"
fn('FORMAT' , fn('MOD' , fn('ST_Distance_Sphere', fn('POINT', col('lng'), col('lat')) , fn('POINT', lng , lat) ) , 1000 ) , 2) , "distance"
//示例
fn('FORMAT' , fn('MOD' , fn('ST_Distance_Sphere', fn('POINT', col('数据库经度'), col('数据库纬度')) , fn('POINT', 你的经度, 你的纬度) ) , 1000 ) , 2) , "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: [
[
fn('FORMAT' , fn('MOD' , fn('ST_Distance_Sphere', fn('POINT', col('lng'), col('lat')) , fn('POINT', lng , lat) ) , 1000 ) , 2) , "distance"
]
],
include: [{
as: 'user',
model: User,
attributes: ['nickName']
}],
limit: pageSize * 1,
offset: (pageNum - 1) * pageSize * 1,
order: [['createdAt', 'DESC']],
})
ctx.body = { code: 200, msg: '查询成功', data: res }
} catch (err) {
console.log(err)
return ctx.app.emit('error', findError, ctx)
}
}
4.效果展示
distance就是查询到的参数