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