208 lines
6.8 KiB
SQL
208 lines
6.8 KiB
SQL
-- ================================================================
|
||
-- 补充限速规则和APRON区域的数据库脚本
|
||
-- 用于兼容原有的限速检测功能
|
||
-- ================================================================
|
||
|
||
-- 1. 添加APRON(停机坪)区域
|
||
-- 基于route.md中的坐标范围创建一个合理的停机坪区域
|
||
INSERT INTO "public"."airport_areas" (
|
||
"area_id", "name", "type", "boundary", "description", "enabled", "priority",
|
||
"functional_category", "access_level", "created_by"
|
||
) VALUES (
|
||
'APRON_01',
|
||
'停机坪区域01',
|
||
'APRON',
|
||
ST_GeomFromText('POLYGON((120.080000 36.372000, 120.088000 36.372000, 120.088000 36.366000, 120.080000 36.366000, 120.080000 36.372000))', 4326),
|
||
'主要停机坪区域,覆盖无人车和航空器活动区域,包含route.md中所有测试路线',
|
||
true,
|
||
8,
|
||
'AIRCRAFT_OPERATIONS',
|
||
'CONTROLLED',
|
||
'system'
|
||
);
|
||
|
||
-- 2. 为APRON区域添加限速规则(兼容原有的限速检测系统)
|
||
INSERT INTO "public"."spatial_rules" (
|
||
"rule_id", "rule_name", "description", "rule_category", "status", "priority",
|
||
"spatial_object_type", "spatial_object_id", "alert_level", "alert_message",
|
||
"rule_parameters", "created_by"
|
||
) VALUES (
|
||
'SPEED_LIMIT_APRON',
|
||
'停机坪限速规则',
|
||
'停机坪区域内所有车辆的限速控制规则',
|
||
'SPEED_LIMIT',
|
||
'ACTIVE',
|
||
1,
|
||
'AREA',
|
||
'APRON_01',
|
||
'WARNING',
|
||
'停机坪内超速行驶',
|
||
'{"maxSpeed":15.0,"unit":"kmh","warningThreshold":0.8,"strictMode":true}',
|
||
'system'
|
||
);
|
||
|
||
-- 3. 添加规则允许的车辆类型(所有类型车辆都受限速规则约束)
|
||
INSERT INTO "public"."spatial_rule_vehicle_types" ("rule_id", "vehicle_type") VALUES
|
||
('SPEED_LIMIT_APRON', 'UNMANNED_VEHICLE'),
|
||
('SPEED_LIMIT_APRON', 'AIRCRAFT'),
|
||
('SPEED_LIMIT_APRON', 'SPECIAL_VEHICLE'),
|
||
('SPEED_LIMIT_APRON', 'AIRPORT_VEHICLE'),
|
||
('SPEED_LIMIT_APRON', 'NORMAL_VEHICLE');
|
||
|
||
-- 4. 添加滑行道区域和限速规则
|
||
INSERT INTO "public"."airport_areas" (
|
||
"area_id", "name", "type", "boundary", "description", "enabled", "priority",
|
||
"functional_category", "access_level", "created_by"
|
||
) VALUES (
|
||
'TAXIWAY_ALPHA',
|
||
'滑行道Alpha',
|
||
'TAXIWAY',
|
||
ST_GeomFromText('POLYGON((120.082000 36.370000, 120.086000 36.370000, 120.086000 36.368000, 120.082000 36.368000, 120.082000 36.370000))', 4326),
|
||
'主要滑行道,连接停机坪和跑道',
|
||
true,
|
||
7,
|
||
'AIRCRAFT_OPERATIONS',
|
||
'CONTROLLED',
|
||
'system'
|
||
);
|
||
|
||
-- 滑行道限速规则
|
||
INSERT INTO "public"."spatial_rules" (
|
||
"rule_id", "rule_name", "description", "rule_category", "status", "priority",
|
||
"spatial_object_type", "spatial_object_id", "alert_level", "alert_message",
|
||
"rule_parameters", "created_by"
|
||
) VALUES (
|
||
'SPEED_LIMIT_TAXIWAY',
|
||
'滑行道限速规则',
|
||
'滑行道区域内的限速控制',
|
||
'SPEED_LIMIT',
|
||
'ACTIVE',
|
||
2,
|
||
'AREA',
|
||
'TAXIWAY_ALPHA',
|
||
'WARNING',
|
||
'滑行道内超速行驶',
|
||
'{"maxSpeed":25.0,"unit":"kmh","warningThreshold":0.9}',
|
||
'system'
|
||
);
|
||
|
||
-- 滑行道限速规则的车辆类型
|
||
INSERT INTO "public"."spatial_rule_vehicle_types" ("rule_id", "vehicle_type") VALUES
|
||
('SPEED_LIMIT_TAXIWAY', 'UNMANNED_VEHICLE'),
|
||
('SPEED_LIMIT_TAXIWAY', 'AIRCRAFT'),
|
||
('SPEED_LIMIT_TAXIWAY', 'SPECIAL_VEHICLE'),
|
||
('SPEED_LIMIT_TAXIWAY', 'AIRPORT_VEHICLE');
|
||
|
||
-- 5. 验证插入的数据
|
||
-- 检查区域
|
||
SELECT
|
||
area_id,
|
||
name,
|
||
type,
|
||
enabled,
|
||
priority,
|
||
functional_category,
|
||
ST_AsText(boundary) as boundary_wkt
|
||
FROM airport_areas
|
||
WHERE type IN ('APRON', 'TAXIWAY')
|
||
ORDER BY priority DESC;
|
||
|
||
-- 检查限速规则
|
||
SELECT
|
||
r.rule_id,
|
||
r.rule_name,
|
||
r.rule_category,
|
||
r.spatial_object_id,
|
||
r.alert_level,
|
||
r.rule_parameters,
|
||
array_agg(vt.vehicle_type ORDER BY vt.vehicle_type) as allowed_vehicle_types
|
||
FROM spatial_rules r
|
||
LEFT JOIN spatial_rule_vehicle_types vt ON r.rule_id = vt.rule_id
|
||
WHERE r.rule_category = 'SPEED_LIMIT'
|
||
GROUP BY r.rule_id, r.rule_name, r.rule_category, r.spatial_object_id, r.alert_level, r.rule_parameters
|
||
ORDER BY r.rule_id;
|
||
|
||
-- 6. 测试限速检测(模拟无人车在APRON区域内的情况)
|
||
-- 测试无人车A在停机坪区域的限速检测
|
||
WITH test_vehicle AS (
|
||
SELECT
|
||
'UV_鲁B567' as vehicle_id,
|
||
'UNMANNED_VEHICLE' as vehicle_type,
|
||
ST_SetSRID(ST_MakePoint(120.084000, 36.369000), 4326) as current_position,
|
||
18.5 as current_speed -- 超过15km/h限速
|
||
),
|
||
area_check AS (
|
||
SELECT
|
||
tv.vehicle_id,
|
||
tv.vehicle_type,
|
||
tv.current_speed,
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type as area_type,
|
||
ST_Contains(aa.boundary, tv.current_position) as is_inside
|
||
FROM test_vehicle tv
|
||
CROSS JOIN airport_areas aa
|
||
WHERE ST_Contains(aa.boundary, tv.current_position)
|
||
),
|
||
rule_check AS (
|
||
SELECT
|
||
ac.*,
|
||
sr.rule_id,
|
||
sr.rule_name,
|
||
sr.rule_category,
|
||
sr.alert_level,
|
||
sr.rule_parameters,
|
||
CASE
|
||
WHEN sr.rule_category = 'SPEED_LIMIT' THEN
|
||
CASE
|
||
WHEN (sr.rule_parameters->>'maxSpeed')::float < ac.current_speed THEN 'VIOLATION'
|
||
ELSE 'COMPLIANT'
|
||
END
|
||
ELSE 'NOT_APPLICABLE'
|
||
END as speed_check_result
|
||
FROM area_check ac
|
||
LEFT JOIN spatial_rules sr ON ac.area_id = sr.spatial_object_id
|
||
AND sr.status = 'ACTIVE'
|
||
LEFT JOIN spatial_rule_vehicle_types vt ON sr.rule_id = vt.rule_id
|
||
AND vt.vehicle_type = ac.vehicle_type
|
||
)
|
||
SELECT
|
||
vehicle_id,
|
||
area_name,
|
||
area_type,
|
||
current_speed as "当前速度(km/h)",
|
||
rule_name,
|
||
(rule_parameters->>'maxSpeed')::float as "限速(km/h)",
|
||
speed_check_result as "检测结果",
|
||
alert_level as "告警级别"
|
||
FROM rule_check
|
||
WHERE rule_category = 'SPEED_LIMIT' OR rule_category IS NULL;
|
||
|
||
-- 7. 创建一个视图用于简化限速检测查询
|
||
CREATE OR REPLACE VIEW speed_limit_areas AS
|
||
SELECT
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type as area_type,
|
||
aa.boundary,
|
||
sr.rule_id,
|
||
sr.rule_name,
|
||
(sr.rule_parameters->>'maxSpeed')::float as max_speed_kmh,
|
||
(sr.rule_parameters->>'warningThreshold')::float as warning_threshold,
|
||
sr.alert_level,
|
||
array_agg(DISTINCT vt.vehicle_type) as applicable_vehicle_types
|
||
FROM airport_areas aa
|
||
JOIN spatial_rules sr ON aa.area_id = sr.spatial_object_id
|
||
JOIN spatial_rule_vehicle_types vt ON sr.rule_id = vt.rule_id
|
||
WHERE sr.rule_category = 'SPEED_LIMIT' AND sr.status = 'ACTIVE' AND aa.enabled = true
|
||
GROUP BY aa.area_id, aa.name, aa.type, aa.boundary, sr.rule_id, sr.rule_name,
|
||
sr.rule_parameters, sr.alert_level;
|
||
|
||
-- 查看创建的视图
|
||
SELECT * FROM speed_limit_areas ORDER BY max_speed_kmh;
|
||
|
||
-- 完成
|
||
SELECT 'Speed limit rules and APRON areas added successfully!' as status,
|
||
COUNT(*) as total_speed_rules
|
||
FROM spatial_rules
|
||
WHERE rule_category = 'SPEED_LIMIT'; |