获取用户当前位置

这里以uniapp编译成微小的项目为例

在前端找到自己需要用户位置的页面

getLocation() {
  wx.getLocation({
    type: 'gcj02',
    isHighAccuracy: true,  //高精度
    success(res) {
      const latitude = res.latitude // 纬度
      const longitude = res.longitude // 经度
      const speed = res.speed // 速度
      const accuracy = res.accuracy // 位置精度

      console.log(res)
      // 成功获取地理位置信息后的处理逻辑
    },
    fail(err) {
      // 获取地理位置信息失败的处理逻辑
      console.error(err)
    },
    complete() {
      // 接口调用结束的回调函数(调用成功、失败都会执行)
    }
  })

},

只需要把latitudelongitude传给后端就好了,不要用type: 'wgs84',,跳转地图用不了

然后在manifest.json文件配置权限,在mp-weixin里面新增

"mp-weixin": {
    "permission" : {
        "scope.userLocation" : {
            "desc" : "用于展示附近的门店"
        }
    },
    "requiredPrivateInfos": ["getLocation"]
},

然后运行项目

请输入图片描述

看到这个就说明获取成功了,然后把经纬度传给后端

跳转地图

wx.openLocation({
  latitude: 23.426704,
  longitude: 113.232624,
  name: "超网体育",
  address: "超网体育24小时网球学练馆(融创店)",
 })

计算

public function test(): \think\response\Json
{
    // 用户位置
    $userLatitude = 23.301631; // 记得改成前端传回来的
    $userLongitude = 112.787472; // 记得改成前端传回来的

    // 目标数据
    $stores = [
        ['name' => '宴江湖', 'latitude' => 23.14957, 'longitude' => 113.351128],
    ];

    $closestStore = null;
    $minDistance = PHP_INT_MAX;
    $distances = [];

    foreach ($stores as $store) {
        $distance = $this->compute($userLatitude, $userLongitude,,$store['latitude'], $store['longitude']);
        if ($distance < $minDistance) {
            $minDistance = $distance;
            $closestStore = $store;
        }
    }

    $aaa = "门店" . $closestStore['name'] . "距离你有: " . number_format($minDistance / 1000, 2) . " 公里";
    return ret($aaa);
    }

public function compute($latitudeFrom, $longitudeFrom, $latitudeTo,,$longitudeTo): float|int
{
    // 将角度转换为弧度
    $latFrom = deg2rad($latitudeFrom);
    $lonFrom = deg2rad($longitudeFrom);
    $latTo = deg2rad($latitudeTo);
    $lonTo = deg2rad($longitudeTo);

    $latDelta = $latTo - $latFrom;
    $lonDelta = $lonTo - $lonFrom;

    $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
            cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
    return $angle * 6371000; // 地球平均半径,单位为米
}

补充

推荐一个可以拿取目标地点经纬度的网站:拿取经纬度

这个可以打配合,不过经纬度不能用,跳转地图会偏:拾取坐标系统

最后修改:2025 年 01 月 07 日
如果觉得我的文章对你有用,请随意赞赏