zoukankan      html  css  js  c++  java
  • 小程序开发笔记【五】---基于LBS附近动态查询

    实现思路 :

    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

  • 相关阅读:
    并行 并发 概念
    为什么C++编译器不能支持对模板的分离式编译_刘未鹏
    并发编程的15 条建议
    VS2005 C++ str.Format 编译错误
    PPT 去除排练计时
    VS2005中 depends.exe 在哪里
    《A wavelet tour of signal processing》前言摘录
    Windows Forms 2.0 Programming 读书笔记Hello, Windows Forms
    VS2005 宽字符 unicode字符集和多字节字符集
    Windows Forms 2.0 Programming 读书笔记Hello, Windows Forms(2)
  • 原文地址:https://www.cnblogs.com/fozero/p/10922325.html
Copyright © 2011-2022 走看看