获取用户当前位置
这里以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() {
// 接口调用结束的回调函数(调用成功、失败都会执行)
}
})
},
只需要把latitude
和longitude
传给后端就好了,不要用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; // 地球平均半径,单位为米
}
补充
推荐一个可以拿取目标地点经纬度的网站:拿取经纬度
这个可以打配合,不过经纬度不能用,跳转地图会偏:拾取坐标系统