工单小程序2024-11-20
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

184 lines
4.3 KiB

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