108 lines
3.0 KiB
JavaScript
108 lines
3.0 KiB
JavaScript
/**
|
|
* 地图配置
|
|
* 腾讯地图开放平台: https://lbs.qq.com/
|
|
* 高德地图开放平台: https://lbs.amap.com/
|
|
*/
|
|
|
|
// 腾讯地图配置
|
|
export const TENCENT_MAP = {
|
|
// 腾讯地图Key
|
|
key: 'Q7CBZ-CC2C5-5O6IA-IU5VM-KJGAF-IKBRO',
|
|
|
|
// API地址
|
|
geocoderUrl: 'https://apis.map.qq.com/ws/geocoder/v1/', // 逆地理编码
|
|
directionUrl: 'https://apis.map.qq.com/ws/direction/v1/', // 路线规划
|
|
}
|
|
|
|
// 高德地图配置(备用)
|
|
export const AMAP = {
|
|
key: 'YOUR_AMAP_KEY',
|
|
geocoderUrl: 'https://restapi.amap.com/v3/geocode/regeo'
|
|
}
|
|
|
|
/**
|
|
* 逆地理编码 - 将经纬度转换为地址
|
|
* @param {Number} latitude 纬度
|
|
* @param {Number} longitude 经度
|
|
* @returns {Promise<String>} 详细地址
|
|
*/
|
|
export async function reverseGeocode(latitude, longitude) {
|
|
try {
|
|
const res = await uni.request({
|
|
url: TENCENT_MAP.geocoderUrl,
|
|
method: 'GET',
|
|
data: {
|
|
location: `${latitude},${longitude}`,
|
|
key: TENCENT_MAP.key,
|
|
get_poi: 0 // 不返回周边POI列表
|
|
}
|
|
})
|
|
|
|
if (res.statusCode === 200 && res.data.status === 0) {
|
|
const result = res.data.result
|
|
const addressComponent = result.address_component
|
|
|
|
// 拼接详细地址:省 + 市 + 区 + 街道 + 门牌号
|
|
const detailAddress = [
|
|
addressComponent.province,
|
|
addressComponent.city,
|
|
addressComponent.district,
|
|
addressComponent.street,
|
|
addressComponent.street_number
|
|
].filter(item => item).join('')
|
|
|
|
return {
|
|
success: true,
|
|
address: detailAddress,
|
|
province: addressComponent.province,
|
|
city: addressComponent.city,
|
|
district: addressComponent.district,
|
|
street: addressComponent.street,
|
|
streetNumber: addressComponent.street_number,
|
|
formattedAddress: result.formatted_addresses?.recommend || detailAddress
|
|
}
|
|
} else {
|
|
console.warn('逆地理编码失败:', res.data)
|
|
return {
|
|
success: false,
|
|
address: `位置: ${latitude.toFixed(6)}, ${longitude.toFixed(6)}`,
|
|
error: res.data.message || '获取地址失败'
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error('逆地理编码异常:', e)
|
|
return {
|
|
success: false,
|
|
address: `位置: ${latitude.toFixed(6)}, ${longitude.toFixed(6)}`,
|
|
error: e.message || '网络异常'
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 计算两点之间的距离(米)
|
|
* @param {Number} lat1 纬度1
|
|
* @param {Number} lng1 经度1
|
|
* @param {Number} lat2 纬度2
|
|
* @param {Number} lng2 经度2
|
|
* @returns {Number} 距离(米)
|
|
*/
|
|
export function calculateDistance(lat1, lng1, lat2, lng2) {
|
|
const rad = (d) => d * Math.PI / 180.0
|
|
const EARTH_RADIUS = 6378137.0
|
|
|
|
const radLat1 = rad(lat1)
|
|
const radLat2 = rad(lat2)
|
|
const a = radLat1 - radLat2
|
|
const b = rad(lng1) - rad(lng2)
|
|
|
|
let s = 2 * Math.asin(Math.sqrt(
|
|
Math.pow(Math.sin(a / 2), 2) +
|
|
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)
|
|
))
|
|
s = s * EARTH_RADIUS
|
|
s = Math.round(s)
|
|
|
|
return s
|
|
}
|