// 附近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
having子句與where子句同樣,都是用於條件判斷的。java
實現效果圖
node
以上是經過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