实现思路 :

  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

小程序开发笔记【五】---基于LBS附近动态查询的更多相关文章

  1. 微信小程序开发笔记02

    今天学习了微信小程序开发用到的语言,wxml与wxss语言基本语法与html和css基本语法相似,学习起来相对简单.在小程序主要的语言是js(javascript,跟准确的说是jqery) ,由于这种 ...

  2. 微信小程序开发笔记01

    微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...

  3. 微信小程序开发系列五:微信小程序中如何响应用户输入事件

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  4. 微信小程序开发笔记(一)

    一.为什么要学习微信小程序开发 微信小程序是一个可以在微信上打开的轻应用,他是由多个页面组成的程序,跟传统APP比较如下: 优点 1.不需要在应用商店下载,不占用内存空间,即开即用 2.可以在微信内直 ...

  5. 微信小程序开发笔记

    前言: 因为前段时间一直在做关于微信小程序方面的项目,作为一名后端的攻城狮而言做一些简单的前端页面数据操作和管理还是比较容易快上手的,当然前提是要理解微信小程序的基本语法和请求原理.该篇博客主要记录的 ...

  6. 微信小程序开发笔记04

    今天将小程序的页面进行优化 消除昨天遇到的bug问题. 完成了微信小程序的开发.

  7. 微信小程序开发(五)开发框架MINA

    微信团队为小程序提供的框架命名为MINA应用框架.MINA框架通过封装微信客户端提供的文件系统.网络通信.任务管理.数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方 ...

  8. 微信小程序开发笔记(二)

    一.前言 继承上一篇所说的,有了对微信小程序的基础概念后,这边将会示范动手做一个小程序,在动手的过程中我们可以更快的熟悉小程序里面的架构和开发流程. 二.小程序的设计 这次要做的是一个猜数字的程序,程 ...

  9. 微信小程序学习笔记五 常见组件

    1. 常见组件 重点讲解小程序中常用的布局组件 1.1 view 代替 原来的div标签 <!-- pages/index/index.wxml --> <view hover-cl ...

  10. 小程序学习笔记五:API

    API 小程序提供了丰富的微信原生API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等. api调用格式: 1:wx.on 开头的 API 是监听某个事件发生的API接口,接受一 ...

随机推荐

  1. IPv6地址类型和操作

    IPv6地址的号段划分和前缀表示法: IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分 地址结构图 全局路由前缀 (48位) 子网ID (16位 ...

  2. ajax的jQuery的表单序列化获取参数serialize()

    需要引入jQuery.js才能使用$("form表单的id").serialize()可获取form表单里面所有表单元素的值和name属性值,按顺序拼接成查询字符串格式为name值 ...

  3. WIP表解析

      1,WIP的作用 负责纪录生产相关信息,生产什莫--工单的制定,下达,生产步鄹--工序及其移动,投入什莫--组件需求和投料,资源投入入和费用吸收,负责纪录生产成本的归集和差异分析,投入多少组件,资 ...

  4. UML——Use Case Diagram(用例图)

    用例图主要用来描述角色以及角色与用例之间的连接关系.说明的是谁要使用系统,以及他们使用该系统可以做些什么.一个用例图包含了多个模型元素,如系统.参与者和用例,并且显示这些元素之间的各种关系,如泛化.关 ...

  5. Linux系统中的load average(平均负载/运行队列)

    1.load average 的含义 系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度) linux系统中的Load对当前CPU工作量的 ...

  6. Rust中的Cargo工作空间实践

    这是为了开发大型程序,分治crate用的. 目录结构如下: 一,根cargo.toml内容 [workspace] members = [ "adder", "add-o ...

  7. ReportMachine打印条形码的问题

    ReportMachine打印条形码的问题 最近用RM报表来打印条形码,调试过程非常顺利,扫描枪识别也很正常,唯独斑马打印机的走纸不准确是个问题,正好客户不想用这种纸型,并定制了新纸型,心想等新纸型到 ...

  8. 洛谷 U87052 一线天

    洛谷 U87052 一线天 题目传送门 题目背景 \(JDFZ\)即将举办第一届"一线天"趣味运动会...... 题目描述 "一线天"运动会在\(JLU\)南岭 ...

  9. Jmeter接口测试,怎么在下一个接口调用上一个接口的数据

    常用的两种方式,第二种容易上手1.使用正则提取器 jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器(http://www.cnblogs.com/0201zcr/p/5089 ...

  10. win/zabbix_agent.conf

    # This is a configuration file for Zabbix agent service (Windows) # To get more information about Za ...