地址逆编码
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 });
}