186 lines
5.1 KiB
SQL
186 lines
5.1 KiB
SQL
-- ================================================================
|
||
-- 电子围栏功能验证脚本
|
||
-- 用于验证无人车在测试区域内的电子围栏检测
|
||
-- ================================================================
|
||
|
||
-- 1. 查看测试区域信息
|
||
SELECT
|
||
area_id,
|
||
name,
|
||
type,
|
||
enabled,
|
||
priority,
|
||
functional_category,
|
||
ST_AsText(boundary) as boundary_wkt,
|
||
ST_Area(boundary::geography) as area_square_meters
|
||
FROM airport_areas
|
||
WHERE area_id IN ('UV_TEST_AREA_A', 'UV_TEST_AREA_B', 'UV_INTERSECTION_ZONE')
|
||
ORDER BY priority DESC;
|
||
|
||
-- 2. 查看测试规则信息
|
||
SELECT
|
||
r.rule_id,
|
||
r.rule_name,
|
||
r.rule_category,
|
||
r.status,
|
||
r.spatial_object_id,
|
||
r.alert_level,
|
||
r.rule_parameters,
|
||
array_agg(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_id LIKE 'GEOFENCE_%'
|
||
GROUP BY r.rule_id, r.rule_name, r.rule_category, r.status, r.spatial_object_id, r.alert_level, r.rule_parameters
|
||
ORDER BY r.rule_id;
|
||
|
||
-- 3. 模拟无人车A在起点位置的检测
|
||
-- 无人车A起点:经度120.083084,纬度36.369696
|
||
WITH unmanned_vehicle_a AS (
|
||
SELECT
|
||
'UV_A_鲁B567' as vehicle_id,
|
||
ST_SetSRID(ST_MakePoint(120.083084, 36.369696), 4326) as current_position
|
||
),
|
||
containing_areas AS (
|
||
SELECT
|
||
uv.vehicle_id,
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type,
|
||
aa.enabled,
|
||
ST_Contains(aa.boundary, uv.current_position) as is_inside
|
||
FROM unmanned_vehicle_a uv
|
||
CROSS JOIN airport_areas aa
|
||
WHERE ST_Contains(aa.boundary, uv.current_position)
|
||
)
|
||
SELECT
|
||
ca.*,
|
||
sr.rule_id,
|
||
sr.rule_name,
|
||
sr.alert_level,
|
||
sr.rule_parameters
|
||
FROM containing_areas ca
|
||
LEFT JOIN spatial_rules sr ON ca.area_id = sr.spatial_object_id
|
||
AND sr.status = 'ACTIVE'
|
||
AND sr.rule_category = 'ACCESS_CONTROL';
|
||
|
||
-- 4. 模拟无人车B在起点位置的检测
|
||
-- 无人车B起点:经度120.086965,纬度36.368599
|
||
WITH unmanned_vehicle_b AS (
|
||
SELECT
|
||
'UV_B_鲁B579' as vehicle_id,
|
||
ST_SetSRID(ST_MakePoint(120.086965, 36.368599), 4326) as current_position
|
||
),
|
||
containing_areas AS (
|
||
SELECT
|
||
uv.vehicle_id,
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type,
|
||
aa.enabled,
|
||
ST_Contains(aa.boundary, uv.current_position) as is_inside
|
||
FROM unmanned_vehicle_b uv
|
||
CROSS JOIN airport_areas aa
|
||
WHERE ST_Contains(aa.boundary, uv.current_position)
|
||
)
|
||
SELECT
|
||
ca.*,
|
||
sr.rule_id,
|
||
sr.rule_name,
|
||
sr.alert_level,
|
||
sr.rule_parameters
|
||
FROM containing_areas ca
|
||
LEFT JOIN spatial_rules sr ON ca.area_id = sr.spatial_object_id
|
||
AND sr.status = 'ACTIVE'
|
||
AND sr.rule_category = 'ACCESS_CONTROL';
|
||
|
||
-- 5. 模拟无人车在交汇区域中心的检测
|
||
-- 交汇区域中心:经度120.085000,纬度36.368000
|
||
WITH unmanned_vehicle_center AS (
|
||
SELECT
|
||
'UV_CENTER_TEST' as vehicle_id,
|
||
ST_SetSRID(ST_MakePoint(120.085000, 36.368000), 4326) as current_position
|
||
),
|
||
containing_areas AS (
|
||
SELECT
|
||
uv.vehicle_id,
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type,
|
||
aa.enabled,
|
||
ST_Contains(aa.boundary, uv.current_position) as is_inside
|
||
FROM unmanned_vehicle_center uv
|
||
CROSS JOIN airport_areas aa
|
||
WHERE ST_Contains(aa.boundary, uv.current_position)
|
||
)
|
||
SELECT
|
||
ca.*,
|
||
sr.rule_id,
|
||
sr.rule_name,
|
||
sr.alert_level,
|
||
sr.rule_parameters
|
||
FROM containing_areas ca
|
||
LEFT JOIN spatial_rules sr ON ca.area_id = sr.spatial_object_id
|
||
AND sr.status = 'ACTIVE'
|
||
AND sr.rule_category = 'ACCESS_CONTROL'
|
||
ORDER BY sr.rule_id;
|
||
|
||
-- 6. 测试禁用区域的检测
|
||
-- 临时禁用无人车A区域
|
||
UPDATE airport_areas
|
||
SET enabled = false, updated_at = CURRENT_TIMESTAMP
|
||
WHERE area_id = 'UV_TEST_AREA_A';
|
||
|
||
-- 重新测试无人车A位置检测(应该返回拒绝访问)
|
||
WITH unmanned_vehicle_a_disabled AS (
|
||
SELECT
|
||
'UV_A_DISABLED_TEST' as vehicle_id,
|
||
ST_SetSRID(ST_MakePoint(120.083084, 36.369696), 4326) as current_position
|
||
),
|
||
containing_areas AS (
|
||
SELECT
|
||
uv.vehicle_id,
|
||
aa.area_id,
|
||
aa.name as area_name,
|
||
aa.type,
|
||
aa.enabled,
|
||
ST_Contains(aa.boundary, uv.current_position) as is_inside,
|
||
CASE
|
||
WHEN aa.enabled = false THEN 'DENIED - Area Disabled'
|
||
ELSE 'ALLOWED'
|
||
END as access_result
|
||
FROM unmanned_vehicle_a_disabled uv
|
||
CROSS JOIN airport_areas aa
|
||
WHERE ST_Contains(aa.boundary, uv.current_position)
|
||
)
|
||
SELECT * FROM containing_areas;
|
||
|
||
-- 恢复区域启用状态
|
||
UPDATE airport_areas
|
||
SET enabled = true, updated_at = CURRENT_TIMESTAMP
|
||
WHERE area_id = 'UV_TEST_AREA_A';
|
||
|
||
-- 7. 查看所有测试数据汇总
|
||
SELECT
|
||
'Areas Count' as metric,
|
||
COUNT(*) as value
|
||
FROM airport_areas
|
||
WHERE area_id LIKE 'UV_%'
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'Rules Count' as metric,
|
||
COUNT(*) as value
|
||
FROM spatial_rules
|
||
WHERE rule_id LIKE 'GEOFENCE_%'
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'Vehicle Types Count' as metric,
|
||
COUNT(*) as value
|
||
FROM spatial_rule_vehicle_types
|
||
WHERE rule_id LIKE 'GEOFENCE_%';
|
||
|
||
-- 完成验证
|
||
SELECT 'Geofence validation completed successfully!' as status; |