QAUP_Management/sql/add_speed_limit_rules.sql

208 lines
6.8 KiB
SQL
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.

-- ================================================================
-- 补充限速规则和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';