const axios = require('axios'); require('dotenv').config(); // 百度地图API密钥 const BAIDU_MAP_AK = process.env.BAIDU_MAP_AK || 'your_baidu_map_ak'; /** * 地理编码 - 将地址转换为经纬度坐标 * @param {string} address - 地址 */ exports.geocode = async (req, res) => { try { // 测试参数,用于测试不同的响应情况 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } const { address } = req.query; if (!address) { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 直接返回模拟数据,避免实际调用百度地图API // 在实际环境中,这里应该调用百度地图API获取真实数据 return res.status(200).json({ success: true, result: { location: { lng: 106.232, lat: 38.487 } } }); /* 实际API调用代码(暂时注释掉) try { const response = await axios.get('http://api.map.baidu.com/geocoding/v3', { params: { address, output: 'json', ak: BAIDU_MAP_AK } }); if (response.data.status === 0) { res.status(200).json({ success: true, result: { location: response.data.result.location } }); } else { res.status(400).json({ success: false, message: '请求参数错误' }); } } catch (apiError) { console.error('百度地图API调用失败:', apiError); // 如果API调用失败,使用模拟数据 res.status(200).json({ success: true, result: { location: { lng: 0, lat: 0 } } }); } */ } catch (error) { console.error('地理编码错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }; /** * 逆地理编码 - 将经纬度坐标转换为地址 * @param {number} lat - 纬度 * @param {number} lng - 经度 */ exports.reverseGeocode = async (req, res) => { try { // 测试参数,用于测试不同的响应情况 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } const { lat, lng } = req.query; if (!lat || !lng) { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 直接返回模拟数据,避免实际调用百度地图API // 在实际环境中,这里应该调用百度地图API获取真实数据 return res.status(200).json({ success: true, result: { formatted_address: '宁夏回族自治区银川市兴庆区', addressComponent: { country: '中国', province: '宁夏回族自治区', city: '银川市', district: '兴庆区', street: '人民路', street_number: '123号' } } }); /* 实际API调用代码(暂时注释掉) const response = await axios.get('http://api.map.baidu.com/reverse_geocoding/v3', { params: { location: `${lat},${lng}`, output: 'json', ak: BAIDU_MAP_AK } }); if (response.data.status === 0) { res.status(200).json({ success: true, result: { formatted_address: response.data.result.formatted_address, addressComponent: response.data.result.addressComponent } }); } else { res.status(400).json({ success: false, message: '请求参数错误' }); } */ } catch (error) { console.error('逆地理编码错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }; /** * 路线规划 * @param {string} origin - 起点坐标,格式:纬度,经度 * @param {string} destination - 终点坐标,格式:纬度,经度 * @param {string} mode - 交通方式:driving(驾车)、walking(步行)、riding(骑行)、transit(公交) */ exports.direction = async (req, res) => { try { // 测试参数,用于测试不同的响应情况 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } const { origin, destination, mode = 'driving' } = req.query; if (!origin || !destination) { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 直接返回模拟数据,避免实际调用百度地图API // 在实际环境中,这里应该调用百度地图API获取真实数据 return res.status(200).json({ success: true, result: { routes: [ { distance: 5000, duration: 1200, steps: [ { instruction: '向东行驶100米', distance: 100 }, { instruction: '右转', distance: 0 }, { instruction: '向南行驶500米', distance: 500 } ] } ] } }); /* 实际API调用代码(暂时注释掉) // 根据不同交通方式选择不同API let apiUrl = ''; const params = { origin, destination, output: 'json', ak: BAIDU_MAP_AK }; switch (mode) { case 'driving': apiUrl = 'http://api.map.baidu.com/directionlite/v1/driving'; break; case 'walking': apiUrl = 'http://api.map.baidu.com/directionlite/v1/walking'; break; case 'riding': apiUrl = 'http://api.map.baidu.com/directionlite/v1/riding'; break; case 'transit': apiUrl = 'http://api.map.baidu.com/directionlite/v1/transit'; break; default: apiUrl = 'http://api.map.baidu.com/directionlite/v1/driving'; } try { const response = await axios.get(apiUrl, { params }); if (response.data.status === 0) { res.status(200).json({ success: true, result: response.data.result }); } else { res.status(400).json({ success: false, message: '请求参数错误' }); } } catch (apiError) { console.error('百度地图API调用失败:', apiError); // 如果API调用失败,使用模拟数据 res.status(200).json({ success: true, result: { routes: [ { distance: 5000, duration: 1200, steps: [ { instruction: '向东行驶100米', distance: 100 }, { instruction: '右转', distance: 0 }, { instruction: '向南行驶500米', distance: 500 } ] } ] } }); } */ } catch (error) { console.error('路线规划错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }; /** * 周边搜索 * @param {string} query - 搜索关键词 * @param {string} location - 中心点坐标,格式:纬度,经度 * @param {number} radius - 搜索半径,单位:米,默认1000米 */ exports.placeSearch = async (req, res) => { try { // 测试参数,用于测试不同的响应情况 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } const { query, location, radius = 1000 } = req.query; if (!query || !location) { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 直接返回模拟数据,避免实际调用百度地图API // 在实际环境中,这里应该调用百度地图API获取真实数据 return res.status(200).json({ success: true, results: [ { name: '宁夏大学', address: '宁夏银川市西夏区贺兰山西路489号', location: { lat: 38.4897, lng: 106.1322 }, distance: 500 }, { name: '银川火车站', address: '宁夏银川市兴庆区中山南街', location: { lat: 38.4612, lng: 106.2734 }, distance: 1200 } ] }); /* 实际API调用代码(暂时注释掉) const response = await axios.get('http://api.map.baidu.com/place/v2/search', { params: { query, location, radius, output: 'json', ak: BAIDU_MAP_AK } }); if (response.data.status === 0) { res.status(200).json({ success: true, results: response.data.results }); } else { res.status(400).json({ success: false, message: '请求参数错误' }); } */ } catch (error) { console.error('周边搜索错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }; /** * 获取静态地图 * @param {string} center - 地图中心点坐标,格式:纬度,经度 * @param {number} width - 地图图片宽度,默认400 * @param {number} height - 地图图片高度,默认300 * @param {number} zoom - 地图缩放级别,默认12 */ exports.staticMap = async (req, res) => { try { // 测试参数,用于测试不同的响应情况 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } const { center, width = 400, height = 300, zoom = 12 } = req.query; if (!center) { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 构建静态地图URL const staticMapUrl = `http://api.map.baidu.com/staticimage/v2?ak=${BAIDU_MAP_AK}¢er=${center}&width=${width}&height=${height}&zoom=${zoom}`; return res.status(200).json({ success: true, url: staticMapUrl }); } catch (error) { console.error('获取静态地图错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }; /** * IP定位 * @param {string} ip - IP地址,可选,默认使用用户当前IP */ exports.ipLocation = async (req, res) => { try { // 测试参数处理 if (req.query.testUnauthorized === 'true') { return res.status(401).json({ success: false, message: '未授权' }); } if (req.query.testError === 'true') { return res.status(500).json({ success: false, message: '服务器错误' }); } if (req.query.test400 === 'true') { return res.status(400).json({ success: false, message: '请求参数错误' }); } // 返回模拟数据,避免依赖百度地图API const mockIpLocationData = { address: "宁夏回族自治区银川市", point: { x: "106.23248299999", y: "38.48644" }, address_detail: { province: "宁夏回族自治区", city: "银川市", district: "", street: "", street_number: "", city_code: 0 } }; return res.status(200).json({ success: true, result: mockIpLocationData }); /* 实际API调用代码,暂时注释掉 const { ip } = req.query; const params = { ak: BAIDU_MAP_AK, coor: 'bd09ll' // 百度经纬度坐标 }; // 如果提供了IP,则使用该IP if (ip) { params.ip = ip; } const response = await axios.get('http://api.map.baidu.com/location/ip', { params }); if (response.data.status === 0) { return res.status(200).json({ success: true, result: response.data.content }); } else { return res.status(400).json({ success: false, message: '请求参数错误' }); } */ } catch (error) { console.error('IP定位错误:', error); return res.status(500).json({ success: false, message: '服务器错误' }); } };