CollisionAvoidanceSystem/src/main/java/com/dongni/collisionavoidance/webSocket/controller/GeopositionController.java

130 lines
5.2 KiB
Java
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.

package com.dongni.collisionavoidance.websocket.controller;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.common.service.VehicleLocationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* WebSocket地理位置控制器
* 提供实时车辆位置数据的WebSocket接口基于PostGIS数据库
*/
@Slf4j
@Controller
@RequiredArgsConstructor
public class GeopositionController {
private final VehicleLocationService vehicleLocationService;
/**
* 获取所有航空器的最新位置信息
*
* 注意:航空器数据不再存储在数据库中,仅用于实时处理
* 此接口将返回空数据,需要从实时数据流获取航空器位置
*
* @return 空的位置数据映射(航空器数据不持久化)
*/
@MessageMapping("/getGeoposition")
@SendTo("/topic/geoSition")
public Map<String, VehicleLocation> getGeosition() {
log.debug("接收到地理坐标请求 - 航空器数据不再持久化存储");
try {
// 航空器数据不再存储在数据库中,返回空映射
// 前端需要从实时数据流或其他方式获取航空器位置信息
Map<String, VehicleLocation> resultMap = Map.of();
log.debug("返回空的航空器位置信息(数据不持久化)");
return resultMap;
} catch (Exception e) {
log.error("获取航空器地理位置数据时发生异常", e);
return Map.of(); // 返回空映射而不是null
}
}
/**
* 获取所有类型车辆的最新位置信息
*
* 注意:只返回无人车位置数据,因为其他车辆数据不再持久化
*
* @return 无人车位置数据映射 (vehicleId -> VehicleLocation)
*/
@MessageMapping("/getAllVehiclePositions")
@SendTo("/topic/allVehiclePositions")
public Map<String, VehicleLocation> getAllVehiclePositions() {
log.debug("接收到全部车辆位置请求 - 仅返回无人车数据");
try {
// 只获取无人车数据,因为其他车辆数据不再持久化存储
List<VehicleLocation> unmannedVehicles = vehicleLocationService
.getActiveVehiclesByType(MovingObjectType.UNMANNED_VEHICLE, 5);
// 转换为Map格式
Map<String, VehicleLocation> resultMap = unmannedVehicles.stream()
.collect(Collectors.toMap(
VehicleLocation::getVehicleId,
location -> location,
(existing, replacement) -> replacement
));
log.debug("返回 {} 个无人车位置信息(航空器和特种车辆数据不持久化)", resultMap.size());
return resultMap;
} catch (Exception e) {
log.error("获取车辆地理位置数据时发生异常", e);
return Map.of();
}
}
/**
* 根据车辆类型获取位置信息
*
* 注意只有UNMANNED_VEHICLE类型会返回数据其他类型返回空数据
*
* @param vehicleType 车辆类型
* @return 指定类型车辆位置数据(仅无人车有持久化数据)
*/
@MessageMapping("/getVehiclesByType")
@SendTo("/topic/vehiclesByType")
public Map<String, VehicleLocation> getVehiclesByType(MovingObjectType vehicleType) {
log.debug("接收到按类型查询车辆位置请求,类型: {}", vehicleType);
try {
List<VehicleLocation> vehicles;
if (MovingObjectType.UNMANNED_VEHICLE.equals(vehicleType)) {
// 无人车数据从数据库获取
vehicles = vehicleLocationService.getActiveVehiclesByType(vehicleType, 5);
log.debug("查询无人车数据: {} 条记录", vehicles.size());
} else {
// 航空器和特种车辆数据不持久化,返回空列表
vehicles = List.of();
log.debug("类型 {} 的数据不持久化存储,返回空数据", vehicleType);
}
Map<String, VehicleLocation> resultMap = vehicles.stream()
.collect(Collectors.toMap(
VehicleLocation::getVehicleId,
location -> location,
(existing, replacement) -> replacement
));
log.debug("返回 {} 个 {} 类型车辆位置信息", resultMap.size(), vehicleType);
return resultMap;
} catch (Exception e) {
log.error("根据类型获取车辆地理位置数据时发生异常,类型: {}", vehicleType, e);
return Map.of();
}
}
}