/** * 地图配置 * 腾讯地图开放平台: 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} 详细地址 */ 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 }