微信小程序计算用户离商家的距离(利用经纬度求距)

前言

最近在帮朋友(商家)写小程序,所以看了不少关于小程序的知识,总结一下计算距离这条线。

思路

一共有两种方法,各有利弊:
1.利用小程序的wx.getLocation 方法得到用户的经纬度,然后用已知的商家的经纬进行计算;
2.利用腾讯地图位置服务calculateDistance直接计算

先熟悉下两个单词:
**longitude:经度;
latitude:纬度;**
下边是两种方法的具体实现

一、获取用户的位置信息,再进行计算(wx.getLocation)

1.小程序提供了获取用户位置信息的api,所以我们能直接获取到经纬度;
2.在百度拾取坐标系统,获取商家的具体经纬度(例:北京故宫116.403414(经度),39.924091(纬度)。)
3.利用公式进行两点的经纬度计算

代码:

Page({
 data:{
    },
 onLoad: function() {
        var _this = this;
        _this.findXy() //查询用户与商家的距离
        },
        
   findXy() { //获取用户的经纬度
        var _this = this
        wx.getLocation({
            type: 'wgs84',
            success(res) {
                _this.getDistance(res.latitude, res.longitude, 39.924091,116.403414)
            }
        })
    },
    
     Rad: function(d) { //根据经纬度判断距离
        return d * Math.PI / 180.0;
    },
    getDistance: function(lat1, lng1, lat2, lng2) {
        // lat1用户的纬度
        // lng1用户的经度
        // lat2商家的纬度
        // lng2商家的经度
        var radLat1 = this.Rad(lat1);
        var radLat2 = this.Rad(lat2);
        var a = radLat1 - radLat2;
        var b = this.Rad(lng1) - this.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 * 6378.137;
        s = Math.round(s * 10000) / 10000;
        s = s.toFixed(2) + '公里' //保留两位小数
        console.log('经纬度计算的距离:' + s)
        return s
    }
    )}

二、利用腾讯地图的位置服务

1.这里配置的地方就比较多一点了,先到腾讯位置服务注册登录,申请key、引入依赖。
下图的第三步配置是要在小程序的后台那里设置,记得不要找错地方了。如图:

clipboard.png
2.配置完成了之后,小程序重新编译一下
3.我们看下腾讯的api,是怎么求两点距离的腾讯位置-两点求距
4.读完可知,我们只需要商家的经纬度即可,我们在小程序里实验一下

// 引入SDK核心类
var QQMapWX = require('../../utils/qqmap-wx-jssdk.js');

Page({
 onLoad: function() {
        var _this = this;
        _this.findShop() //查询用户与商家的距离
        },
 findShop() { //拿到商家的地理位置,用到了腾讯地图的api
        // 实例化API核心类
        var _that = this
        var demo = new QQMapWX({
            key: '你申请到的key' // 必填
        });
        // 调用接口
        demo.calculateDistance({
            to: [{

                latitude: 39.924091, //商家的纬度
                longitude: 116.403414, //商家的经度
            }],
            success: function(res) {
                let hw = res.result.elements[0].distance //拿到距离(米)
                if (hw && hw !== -1) { //拿到正确的值
                    //转换成公里
                    hw = (hw / 2 / 500).toFixed(2) + '公里'
                } else {
                    hw = "距离太近或请刷新重试"
                }
          
                console.log('腾讯地图计算距离商家' + hw);
            }
        });
    }
})

可能会出现的错误:
{status:199,message:'此key未开启webservice功能'},
不要紧,打开腾讯位置-key配置,设置一下刚才申请key的详情页面,把下列选项全部勾上,把你小程序的appid也写上。
保存完,重新编译再试

clipboard.png

优缺点

优点:
第一种方法,不用配置任何东西,只需两点的经纬度即可,没有使用次数限制;
第二种方法,不需要自己计算,腾讯会计算好,距离比较精确,只需要只要商家的经纬度即可


缺点:
第一种方法,计算精度上可能有待考量,在我的实验下,感觉是在上帝视角,直接计算两个点的距离,不过好像两点距离不太远,问题不大;
下图是我用两种方法计算的杭州-石家庄的距离,方法一显然比腾讯的少一点距离,腾讯可能参考了一些实际的路程、路况之类的吧,感觉跟从地图上查行程规划出来的距离差不多。

clipboard.png
第二种方法,有使用次数上的限制,每天只能用1万次,当然可以再去买配额

建议

既然腾讯的api有使用次数限制,那我们就写个方法,先用腾讯的,加上判断,用完了再用 经纬度计算的。当然,有钱的大佬可以另外买腾讯的配额。

可以假装很努力,但结果不会骗你

1.1k 声望
165 粉丝
0 条评论
推荐阅读
mpvue写小程序遇到的问题总结(自己用mpvue实现一个小程序的tabbar,vantUi的使用)
公司要开发一个小程序,面向用户分为3种角色,所以要自己手写个tabbar(文章编辑中,届时将链接放过来)因为也是时隔很久写小程序,就选择了跟vue相近的mpvue来写,或多或少也遇到了点问题,现总结一下。

大师兄5阅读 5.4k评论 4

ESlint + Stylelint + VSCode自动格式化代码(2023)
安装插件 ESLint,然后 File -> Preference-> Settings(如果装了中文插件包应该是 文件 -> 选项 -> 设置),搜索 eslint,点击 Edit in setting.json

谭光志34阅读 20.7k评论 9

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城32阅读 7.3k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco24阅读 2.2k评论 3

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 2k

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.8k评论 3

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 20k评论 9

可以假装很努力,但结果不会骗你

1.1k 声望
165 粉丝
宣传栏