import config from '../config.js' /** * 计算两点之间的距离 * @param {number} lat1 地点1精度 * @param {number} lon1 地点1维度 * @param {number} lat2 地点2精度 * @param {number} lon2 地点2维度 * @param {number} fixed 保留几位小数,默认0,单位km */ function calculateDistance(lat1, lon1, lat2, lon2, fixed = 0) { //计算两点距离 let distance = 0 if (!lat2 || !lon2) return distance //先强制转换一下(后端给的字符串) lat1 = parseFloat(lat1) lon1 = parseFloat(lon1) lat2 = parseFloat(lat2) lon2 = parseFloat(lon2) // 将角度转换为弧度 const R = 6371; // 地球半径,单位公里 const dLat = (lat2 - lat1) * Math.PI / 180; const dLon = (lon2 - lon1) * Math.PI / 180; lat1 = lat1 * Math.PI / 180; lat2 = lat2 * Math.PI / 180; // Haversine公式 const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // 计算距离 distance = R * c; return distance.toFixed(fixed) } function getLocation(fn) { //获取用户经纬度 // wxGetLocation() //此方法只用于提示用户打开gps uni.getLocation({ type: 'gcj02', isHighAccuracy: true, // highAccuracyExpireTime: 1000, success: function(position) { fn(position) }, fail: function() { //使用ip获取定位 let key = config.mapKey; //腾讯地图key getUserAddressByIp(key).then(res => { fn(res.position) //返回经纬度 }) } }) } function getLocationDetail() { //获取用户详细地址 // wxGetLocation() return new Promise((resolve, reject) => { let key = config.mapKey; //腾讯地图key uni.getLocation({ type: 'gcj02', isHighAccuracy: true, // highAccuracyExpireTime: 1000, success: function(position) { getUserAddress(position.latitude, position.longitude, key).then(res => { res.latitude = position.latitude res.longitude = position.longitude resolve(res) }) }, fail: function() { //使用ip获取定位 getUserAddressByIp(key).then(res => { resolve(res) }) } }) }) } function getUserAddress(latitude, longitude, key) { //通过经纬度获取用户详细地址 return new Promise((resolve, reject) => { let url = `/ws/geocoder/v1/?location=${latitude},${longitude}&key=${key}` // #ifndef H5 url = `https://apis.map.qq.com` + url // #endif uni.request({ url, success: (res) => { let { lat, lng } = res.data.result.ad_info.location; let data = { position: { latitude: lat, longitude: lng }, addressDetail: res.data.result.ad_info, address : res.data.result.address } resolve(data) }, fail(err) { reject(err) } }) }) } function getUserAddressByIp(key) { //根据IP获取当前用户位置 return new Promise((resolve, reject) => { uni.request({ url: 'https://api.ipify.org?format=json', success: (ipInfo) => { let url = `/ws/location/v1/ip?ip=${ipInfo.data.ip}&key=${key}` // #ifndef H5 url = `https://apis.map.qq.com` + url // #endif uni.request({ url, success: (res) => { let { lat, lng } = res.data.result.location; let data = { addressDetail: res.data.result.ad_info, ip: res.data.result.ip, position: { latitude: lat, longitude: lng } } resolve(data) }, fail(err) { reject(err) } }) } }) }) } //打开地图让用户选择位置 function selectAddress(longitude, latitude, successCallback) { uni.chooseLocation({ longitude, //经度 latitude, //纬度 success: function(res) { successCallback && successCallback(res) } }); } //sdk自带获取位置方法(只支持微信环境),这里只当提示在用了(具体获取地址逻辑上面几个方法已完成) function wxGetLocation(successCallback, failCallback) { // #ifdef MP-WEIXIN // #endif console.log('wx.getLocation'); wx.getLocation({ type: 'gcj02', isHighAccuracy: true, highAccuracyExpireTime: 2000, success(res) {}, fail(err) { if(err.errMsg == 'getLocation:gps closed'){ uni.showToast({ title: '请打开GPS定位,否则定位不准确', icon: 'none' }) } } }) } export default { calculateDistance, //计算两点距离 getLocationDetail, //获取用户详细地址 getLocation, //获取用户经纬度 selectAddress, //打开地图让用户选择位置 wxGetLocation, }