智慧水务管理系统 - 精河县供水工程综合管理平台

init-postgis.sql 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. -- PostGIS 数据库初始化脚本
  2. -- 创建精河县供水管理系统GIS相关表结构
  3. -- 启用PostGIS扩展
  4. CREATE EXTENSION IF NOT EXISTS postgis;
  5. CREATE EXTENSION IF NOT EXISTS postgis_topology;
  6. -- 创建空间索引
  7. CREATE EXTENSION IF NOT EXISTS btree_gist;
  8. -- 创建GIS基础图层表
  9. CREATE TABLE IF NOT EXISTS gis_base_map (
  10. id BIGSERIAL PRIMARY KEY,
  11. name VARCHAR(100) NOT NULL,
  12. type VARCHAR(50) NOT NULL,
  13. description TEXT,
  14. is_active BOOLEAN DEFAULT true,
  15. order_index INTEGER DEFAULT 0,
  16. created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  17. updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
  18. );
  19. -- 创建索引
  20. CREATE INDEX idx_gis_base_map_name ON gis_base_map(name);
  21. CREATE INDEX idx_gis_base_map_type ON gis_base_map(type);
  22. CREATE INDEX idx_gis_base_map_active ON gis_base_map(is_active);
  23. -- 创建IoT设备表
  24. CREATE TABLE IF NOT EXISTS iot_device (
  25. id BIGSERIAL PRIMARY KEY,
  26. device_code VARCHAR(50) UNIQUE NOT NULL,
  27. name VARCHAR(100) NOT NULL,
  28. device_type VARCHAR(20) NOT NULL,
  29. longitude DECIMAL(10, 8),
  30. latitude DECIMAL(11, 8),
  31. location_geom GEOMETRY(Point, 4326),
  32. gis_layer_name VARCHAR(50) NOT NULL,
  33. is_active BOOLEAN DEFAULT true,
  34. created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  35. updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
  36. );
  37. -- 创建空间索引
  38. CREATE INDEX idx_iot_device_geom ON iot_device USING GIST(location_geom);
  39. CREATE INDEX idx_iot_device_code ON iot_device(device_code);
  40. CREATE INDEX idx_iot_device_active ON iot_device(is_active);
  41. CREATE INDEX idx_iot_device_layer ON iot_device(gis_layer_name);
  42. -- 插入默认数据
  43. -- GIS基础图层数据
  44. INSERT INTO gis_base_map (name, type, description, order_index) VALUES
  45. ('精河县基础底图', 'county', '精河县行政区划边界图', 1),
  46. ('管网数据', 'pipe_network', '供水管网矢量数据', 2),
  47. ('监测点位', 'monitoring_points', '水质、水压、流量监测点', 3)
  48. ON CONFLICT (name) DO NOTHING;
  49. -- 模拟IoT设备数据
  50. INSERT INTO iot_device (device_code, name, device_type, longitude, latitude, gis_layer_name, is_active) VALUES
  51. ('SW001', '1号水位监测点', 'SW', 44.0321, 82.8973, 'water_level', true),
  52. ('SW002', '2号水位监测点', 'SW', 44.0365, 82.9058, 'water_level', true),
  53. ('SW003', '3号水位监测点', 'SW', 44.0410, 82.9110, 'water_level', true),
  54. ('YL001', '1号压力监测点', 'YL', 44.0289, 82.8925, 'water_pressure', true),
  55. ('YL002', '2号压力监测点', 'YL', 44.0356, 82.9018, 'water_pressure', true),
  56. ('YL003', '3号压力监测点', 'YL', 44.0432, 82.9153, 'water_pressure', true),
  57. ('LL001', '1号流量监测点', 'LL', 44.0301, 82.8987, 'water_flow', true),
  58. ('LL002', '2号流量监测点', 'LL', 44.0378, 82.9074, 'water_flow', true),
  59. ('WQ001', '1号水质监测点', 'WQ', 44.0345, 82.9021, 'water_quality', true),
  60. ('WQ002', '2号水质监测点', 'WQ', 44.0421, 82.9128, 'water_quality', true)
  61. ON CONFLICT (device_code) DO NOTHING;
  62. -- 更新设备的空间地理信息
  63. UPDATE iot_device
  64. SET location_geom = ST_MakePoint(longitude, latitude)
  65. WHERE location_geom IS NULL AND longitude IS NOT NULL AND latitude IS NOT NULL;
  66. -- 创建视图:按图层类型分组的设备
  67. CREATE OR REPLACE VIEW v_iot_devices_by_layer AS
  68. SELECT
  69. gis_layer_name,
  70. device_type,
  71. COUNT(*) as device_count,
  72. array_agg(device_code) as device_codes,
  73. array_agg(name) as device_names
  74. FROM iot_device
  75. WHERE is_active = true
  76. GROUP BY gis_layer_name, device_type;
  77. -- 创建视图:GIS图层统计
  78. CREATE OR REPLACE VIEW v_gis_layers_stats AS
  79. SELECT
  80. gbm.name as layer_name,
  81. gbm.type as layer_type,
  82. gbm.description,
  83. id.device_count,
  84. CASE
  85. WHEN gbm.type = 'county' THEN '行政区划'
  86. WHEN gbm.type = 'pipe_network' THEN '管网数据'
  87. WHEN gbm.type = 'monitoring_points' THEN '监测点位'
  88. ELSE '其他'
  89. END as layer_category
  90. FROM gis_base_map gbm
  91. LEFT JOIN (
  92. SELECT gis_layer_name, COUNT(*) as device_count
  93. FROM iot_device
  94. WHERE is_active = true
  95. GROUP BY gis_layer_name
  96. ) id ON gbm.name = id.gis_layer_name
  97. WHERE gbm.is_active = true;
  98. -- 创建触发器函数:自动更新updated_at字段
  99. CREATE OR REPLACE FUNCTION update_updated_at_column()
  100. RETURNS TRIGGER AS $$
  101. BEGIN
  102. NEW.updated_at = NOW();
  103. RETURN NEW;
  104. END;
  105. $$ language 'plpgsql';
  106. -- 为相关表添加触发器
  107. CREATE TRIGGER update_gis_base_map_updated_at
  108. BEFORE UPDATE ON gis_base_map
  109. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  110. CREATE TRIGGER update_iot_device_updated_at
  111. BEFORE UPDATE ON iot_device
  112. FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
  113. -- 授权(根据实际用户名调整)
  114. -- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO water_user;
  115. -- GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO water_user;