小程序開發筆記【五】---基於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千米之內的動態,而後動態根據時間倒序展現html

mysql having和where的區別

having子句與where子句同樣,都是用於條件判斷的。java

  1. 區別1
    where是判斷數據從磁盤讀入內存的時候
    having是判斷分組統計以前的全部條件
  2. 區別2
    having子句中能夠使用字段別名,而where不能使用
  3. 區別3
    having可以使用統計函數,可是where不能使用

實現效果圖
node

nodejs--根據座標算距離

以上是經過sql的方式計算距離,也能夠經過在程序中進行計算,這裏提供nodejs中的計算方式mysql

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.htmlgit

相關文章
相關標籤/搜索