【微信小程序】地址逆编码,根据经纬度计算直线距离

地址逆编码

复制代码
getLatLngByAddress(address) {
    // 校验地址是否为空
    if (!address) {
      wx.showModal({
        title: '提示',
        content: '请输入有效的地址',
      })
      return;
    }

    // 高德地图地理编码接口配置
    const amapKey = '替换成你自己的Key!';
    const url = `https://restapi.amap.com/v3/geocode/geo?address=${encodeURIComponent(address)}&key=${amapKey}`;

    wx.showLoading({ title: '获取中...' });

    // 发起请求
    wx.request({
      url,
      method: 'GET',
      success: (res) => {
        wx.hideLoading();
        const { status, info, geocodes } = res.data;
        // 接口调用成功且返回有效地址解析结果
        if (status === '1' && geocodes && geocodes.length > 0) {
          const [locationInfo] = geocodes;
          const [longitude, latitude] = locationInfo.location.split(','); // 高德返回格式:经度,纬度
          this.calculateDistance(longitude, latitude);
        } else {
          app.toast(info || '未查询到该地址的经纬度');
        }
      },
      fail: (err) => {
        wx.hideLoading();
        this.setData({ errorMsg: '网络错误,请稍后重试' });
        console.error('请求失败:', err);
      }
    });
  },

根据经纬度计算直线距离

复制代码
// 核心:计算两个经纬度之间的距离(Haversine公式)
  calculateDistance(lon, lat) {
    const { longitude, latitude } = this.data;
    // 提取经纬度并转数字
    const lat1 = Number(lat);
    const lng1 = Number(lon);
    const lat2 = Number(latitude);
    const lng2 = Number(longitude);

    // 角度转弧度(Math.sin/cos需要弧度值)
    const radLat1 = Math.PI * lat1 / 180;
    const radLat2 = Math.PI * lat2 / 180;
    const radLng1 = Math.PI * lng1 / 180;
    const radLng2 = Math.PI * lng2 / 180;

    // 计算纬度差、经度差
    const deltaLat = radLat1 - radLat2;
    const deltaLng = radLng1 - radLng2;

    // Haversine公式核心计算
    let distance = 2 * Math.asin(
      Math.sqrt(
        Math.pow(Math.sin(deltaLat / 2), 2) +
        Math.cos(radLat1) * Math.cos(radLat2) *
        Math.pow(Math.sin(deltaLng / 2), 2)
      )
    );
    // 地球平均半径6371公里,计算最终距离(保留2位小数)
    distance = distance * 6371;
    distance = Math.round(distance * 100) / 100;
    console.log(12121, distance);
    this.setData({ distance });
  }
相关推荐
蜗牛前端2 天前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
爱勇宝6 天前
我想认真做一件小事:让孩子和家长更好地互动
微信小程序·小程序·云开发
唯火锅不可辜负6 天前
避坑指南:iOS 下 scroll-view 嵌套 fixed 布局的“翻车”现场与修复
微信小程序
didiplus6 天前
运维人的随身神器:我把25个常用工具塞进了微信小程序
微信小程序
一份执念7 天前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序
一份执念7 天前
ECharts 安装与使用完全指南:从全量引入到小程序分包优化
微信小程序·echarts
skiyee8 天前
🔥UniApp 仅需 5 行代码!实现所有页面中控制应用主题变化
前端·微信小程序
Jinkey9 天前
要用户手机号真的是为了打骚扰电话吗?浅谈微信生态会员账号体系与资产合并
后端·微信·微信小程序
用户43242810611411 天前
微信小程序从0到1接入微信支付的完整攻略
微信小程序
spmcor13 天前
微信小程序 setStorageSync 踩坑实录:别让"顺手一存"变成"隐形炸弹"
微信小程序