peixue-dev/peidu/uniapp/config/map.js

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
}