Files
nxxmdata/backend/controllers/mapController.js
2025-08-25 15:00:46 +08:00

560 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}&center=${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: '服务器错误'
});
}
};