小程序开发笔记【五】---附近动态查询

实现思路 :

  1. 获取用户当前位置经纬度坐标
  2. 查询动态时将经纬度坐标传给后台
  3. 后端通过sql语句计算经纬度坐标之间的距离
      // 附近20公里发的动态  按时间排序
      let sql = `SELECT *
  , ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((${myLatitude} * PI() / 180 - latitude * PI() / 180) / 2), 2) + COS(${myLatitude} * PI() / 180) * COS(latitude * PI() / 180) * POW(SIN((${myLongitude} * PI() / 180 - longitude * PI() / 180) / 2), 2))) * 1000) AS distance
FROM tb_group_posts having distance <= 20000 and status=? ORDER BY createtime desc LIMIT ?, ?`;
      result = await this.app.mysql.query(sql, ['0', (pageNum - 1) * pageSize, pageSize]);

说明:6378.138这个是地球的直径,单位千米.myLatitude 是用户位置的纬度,myLongitude是用户位置经度.latitude 为动态的纬度字段,longitude为动态的经度字段。
这里通过having distance <= 20000来查询附近20公里以内的动态,然后动态根据时间倒序展示

mysql having和where的区别

having子句与where子句一样,都是用于条件判断的。

  1. 区别1
    where是判断数据从磁盘读入内存的时候
    having是判断分组统计之前的所有条件
  2. 区别2
    having子句中可以使用字段别名,而where不能使用
  3. 区别3
    having能够使用统计函数,但是where不能使用

实现效果图

nodejs--根据坐标算距离

以上是通过sql的方式计算距离,也可以通过在程序中进行计算,这里提供nodejs中的计算方式

var EARTH_RADIUS = 6378.137; //地球半径  
//将用角度表示的角转换为近似相等的用弧度表示的角 java Math.toRadians  
function rad(d) {
    return d * Math.PI / 180.0;
}
/** 
 * 谷歌地图计算两个坐标点的距离 
 * @param lng1  经度1 
 * @param lat1  纬度1 
 * @param lng2  经度2 
 * @param lat2  纬度2 
 * @return 距离(千米) 
 */
function getDistance(lng1, lat1, lng2, lat2) {
    var radLat1 = rad(lat1);
    var radLat2 = rad(lat2);
    var a = radLat1 - radLat2;
    var b = rad(lng1) - rad(lng2);
    var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
        + Math.cos(radLat1) * Math.cos(radLat2)
        * Math.pow(Math.sin(b / 2), 2)));
    s = s * EARTH_RADIUS;
    s = Math.round(s * 10000) / 10000;
    return s;
}
 
 
// let a = distance([119.9969915847, 30.2754597274,], [119.9972383479, 30.2759230036])
// let a = distance([30.2822920169, 125.0036899474], [30.2818472718, 120.0034646419])
let a = getDistance(30.27895275, 119.9921260576, 30.2832692396, 120.0249984587)
console.log(a)

参考阅读

https://blog.csdn.net/qq_27238185/article/details/80339653
https://www.cnblogs.com/jiafuwei/p/5699091.html

猜你喜欢

转载自www.cnblogs.com/fozero/p/10922325.html
今日推荐