|                                                                                                                                                                                        |  | 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 => {					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				}				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,}
 |