9.1 KiB
9.1 KiB
设计方案:机场道路网络配置集成
1. 引言
本文档描述了将机场道路网络配置信息(定义在 src/main/resources/config/airport_roads.yaml 文件中)加载到碰撞避免系统中,并提供统一接口供其他模块使用的设计方案。目标是实现配置的结构化加载、地理空间表示和便捷查询。
2. 设计目标
- 自动加载: 在应用程序启动时自动加载并解析
airport_roads.yaml文件。 - 类型安全: 将 YAML 配置映射到强类型的 Java 对象。
- 空间表示: 使用标准的地理空间库 (JTS) 将道路中心线和边界表示为内存中的几何对象。
- 统一访问: 提供一个中心服务 (
RoadNetworkService) 来封装道路数据的访问逻辑。 - 高效查询: 支持根据 ID 获取道路信息,以及基于地理位置(点)查询所在道路及其属性(如限速)。
- 模块解耦: 其他模块(如数据处理)通过依赖注入使用服务,无需关心配置文件的具体加载和解析细节。
3. 核心组件
- 配置属性 POJOs: 位于
com.dongni.collisionavoidance.config.properties包下,用于映射airport_roads.yaml文件结构的 Java 类 (如AirportRoadsProperties,RoadProperties,GeometryProperties,DimensionValue)。 - 配置加载器: 位于
com.dongni.collisionavoidance.config包下的 Spring 配置类 (如RoadNetworkConfig) 和辅助类 (YamlPropertySourceFactory),负责指定加载airport_roads.yaml文件并启用属性绑定到 POJOs。 - 运行时数据模型 (
RoadInfo): 位于com.dongni.collisionavoidance.roads.model包下,包含道路静态属性(ID, name, limits 等,已进行单位转换)以及预处理的 JTS 地理空间对象(LineString类型的centerline和Polygon类型的boundary)。 - 道路网络服务 (
RoadNetworkService): 位于com.dongni.collisionavoidance.roads.service包下的 Spring Service Bean,负责初始化和提供道路数据查询。
4. 依赖库
- Java Topology Suite (JTS):
org.locationtech.jts:jts-core:1.19.0(或最新版) - SnakeYAML: (通常由 Spring Boot 包含)
- Lombok: (可选)
5. 实现细节
5.1 配置加载
- 使用
@PropertySource注解配合自定义的YamlPropertySourceFactory来指定加载classpath:config/airport_roads.yaml。 - 使用
@EnableConfigurationProperties将加载的配置绑定到AirportRoadsPropertiesPOJO 类及其嵌套类。 AirportRoadsProperties类使用@ConfigurationProperties(无前缀) 注解。- POJO 类结构需与
airport_roads.yaml文件结构精确匹配(字段名、数据类型、列表、嵌套对象)。
5.2 运行时数据模型 (RoadInfo)
此类应设计为不可变对象 (e.g., 使用 Lombok @Value 和 @Builder),包含以下关键信息:
id: Stringname: StringspeedLimitMetersPerSecond: Double (单位统一为 m/s)directionality: Enum (RoadDirectionality)heightLimitMeters: Double (单位统一为 m)widthLimitMeters: Double (单位统一为 m)prohibited: booleancenterline:org.locationtech.jts.geom.LineString(JTS 对象)boundary:org.locationtech.jts.geom.Polygon(JTS 对象)relatedZones:List<String>
5.3 道路网络服务 (RoadNetworkService)
- 职责:
- 注入
AirportRoadsProperties。 - 在初始化阶段 (
@PostConstruct) 执行以下操作:- 遍历从配置加载的
RoadProperties列表。 - 对每个
RoadProperties:- 使用 JTS
GeometryFactory将coordinates列表转换为LineString对象 (centerline)。 - 根据
width属性,使用LineString.buffer()方法计算道路边界Polygon对象 (boundary)。(注意:需要处理米到地理坐标度数的近似转换,或采用投影坐标系进行精确缓冲)。 - 进行必要的单位转换(如速度 km/h -> m/s,长度单位 -> m)。
- 解析方向性、禁止通行等属性。
- 创建
RoadInfo实例。
- 使用 JTS
- 将所有创建的
RoadInfo实例存储在内存中的 Map 中 (e.g.,Map<String, RoadInfo>),以roadId为键。 - (推荐) 将所有
RoadInfo的boundary(Polygon) 添加到 JTS 空间索引 (如STRtree) 中,以优化空间查询。
- 遍历从配置加载的
- 提供公共方法用于查询道路信息。
- 注入
- 主要接口方法签名示例:
public Optional<RoadInfo> getRoadById(String roadId); public List<RoadInfo> findRoadsContainingPoint(GeoPosition geoPosition); public Optional<RoadInfo> findDominantRoadAt(GeoPosition geoPosition); // 处理点在多条路重叠区域的情况 public Optional<Double> getSpeedLimitMetersPerSecondAt(GeoPosition geoPosition); // ... 其他必要的查询方法 ... - 内部逻辑:
findRoadsContainingPoint: 使用空间索引 (STRtree.query()) 粗筛候选道路,然后使用Polygon.covers(Point)进行精确判断。- 包含健壮的单位转换和错误处理逻辑。
5.4 在其他模块中使用
- 需要访问道路信息的模块(如
CollisionDetectionService)通过 Spring 的依赖注入 (@Autowired或构造函数注入) 获取RoadNetworkService实例。 - 调用
RoadNetworkService提供的公共方法获取道路属性或执行空间查询。
6. 目录结构影响
引入以下新的包和类:
src/main/java/com/dongni/collisionavoidance/
├── config/
│ ├── properties/ # 新包:存放配置属性 POJOs
│ │ ├── AirportRoadsProperties.java
│ │ ├── RoadProperties.java
│ │ ├── GeometryProperties.java
│ │ └── DimensionValue.java
│ ├── RoadNetworkConfig.java # 新类:加载道路配置
│ └── YamlPropertySourceFactory.java # 新类(如果不存在)
├── roads/ # 新包:道路网络相关
│ ├── model/ # 新包:运行时道路模型
│ │ ├── RoadInfo.java
│ │ └── RoadDirectionality.java
│ └── service/ # 新包:道路服务
│ └── RoadNetworkService.java
7. 未来考虑
- 精确缓冲: 实现基于 UTM 或其他合适投影坐标系的缓冲计算。
- 复杂交叉口: 可能需要更高级的拓扑模型或规则处理。
- 动态更新: 考虑配置热加载机制。
- 单位转换: 实现更健壮的单位转换库。
8. 改进计划
8.1 道路网络功能增强
8.1.1 道路拓扑关系管理
- 实现道路连接点(节点)的识别和管理
- 建立道路之间的拓扑关系(相邻、连接等)
- 支持道路网络的路径规划功能
- 实现道路交叉口的特殊处理逻辑
8.1.2 道路属性扩展
- 添加道路类型(跑道、滑行道、服务道路等)
- 增加道路优先级属性
- 支持道路状态(开放、关闭、维护等)
- 添加道路使用时间限制
- 实现道路使用权限管理
8.1.3 空间查询优化
- 改进空间索引实现,使用更高效的索引结构
- 优化缓冲区计算,使用投影坐标系提高精度
- 添加道路相交检测功能
- 实现道路网络的可视化查询
- 支持复杂的空间关系查询
8.2 配置管理优化
8.2.1 配置验证增强
- 添加道路配置的完整性检查
- 实现道路几何数据的有效性验证
- 增加配置项的类型检查和范围验证
- 添加道路网络拓扑完整性验证
8.2.2 配置热更新
- 实现配置文件的动态加载
- 支持配置变更的实时生效
- 添加配置变更的事件通知机制
- 实现配置回滚机制
8.3 性能优化
8.3.1 空间计算优化
- 优化坐标转换和投影计算
- 改进空间索引的构建和查询性能
- 实现空间计算的缓存机制
- 添加并行计算支持
8.3.2 内存管理优化
- 优化道路数据的存储结构
- 实现数据的懒加载机制
- 添加内存使用监控
- 实现大规模道路网络的分片处理
8.4 测试覆盖
8.4.1 单元测试
- 增加道路拓扑关系的测试用例
- 添加配置验证的测试场景
- 完善空间计算的测试覆盖
- 添加边界条件测试
8.4.2 集成测试
- 添加道路网络完整功能的测试
- 实现性能测试场景
- 增加配置热更新的测试用例
- 添加负载测试
8.5 文档完善
8.5.1 技术文档
- 更新道路网络设计文档
- 添加配置管理说明
- 完善API文档
- 添加性能优化指南
8.5.2 使用文档
- 添加配置示例
- 提供最佳实践指南
- 编写故障排除指南
- 添加常见问题解答
8.6 实施优先级建议
-
第一阶段(核心功能增强):
- 道路拓扑关系管理
- 空间查询优化
- 配置验证增强
-
第二阶段(性能与可靠性):
- 空间计算优化
- 内存管理优化
- 单元测试覆盖
-
第三阶段(可维护性):
- 配置热更新
- 文档完善
- 集成测试
-
第四阶段(扩展功能):
- 道路属性扩展
- 可视化功能
- 高级分析功能