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