| 
						 | 
						- import config from '../config.js'
 - 
 - 
 - function calculateDistance(lat1, lon1, lat2, lon2) { //计算两点距离
 - 	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(0)
 - }
 - 
 - 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) //返回经纬度
 - 	// 		})
 - 	// 	}
 - 	// })
 - 	
 - 	uni.getFuzzyLocation({
 - 		type: 'gcj02',
 - 		// type: 'wgs84',
 - 		success (res) {
 - 			fn(res)
 - 		}
 - 	})
 - }
 - 
 - 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)
 - 		// 		})
 - 		// 	}
 - 		// })
 - 		getLocation((position) => {
 - 			getUserAddress(position.latitude, position.longitude, 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,
 - }
 
 
  |