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

gis_ddl.sql 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. -- =====================================================
  2. -- GIS 地图展示模块 DDL
  3. -- 包含: 监测点位表、管网线段表、区域表
  4. -- 数据库: PostgreSQL
  5. -- =====================================================
  6. -- 1. GIS 监测点位表
  7. CREATE TABLE IF NOT EXISTS prod_gis_point (
  8. id BIGSERIAL PRIMARY KEY,
  9. point_code VARCHAR(50) NOT NULL UNIQUE,
  10. point_name VARCHAR(200) NOT NULL,
  11. point_type VARCHAR(20) NOT NULL, -- flow/pressure/level/quality/valve
  12. area VARCHAR(100),
  13. lng DECIMAL(12, 8) NOT NULL, -- 经度
  14. lat DECIMAL(12, 8) NOT NULL, -- 纬度
  15. elevation DECIMAL(8, 2), -- 海拔高度(米)
  16. device_id BIGINT, -- 关联 prod_monitor_device.id
  17. address VARCHAR(500),
  18. status VARCHAR(20) DEFAULT 'online', -- online/offline/fault
  19. properties JSONB, -- 扩展属性(JSON)
  20. remark VARCHAR(500),
  21. created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  22. updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  23. );
  24. COMMENT ON TABLE prod_gis_point IS 'GIS 监测点位表';
  25. COMMENT ON COLUMN prod_gis_point.point_type IS '点位类型: flow-流量/pressure-压力/level-液位/quality-水质/valve-阀门';
  26. COMMENT ON COLUMN prod_gis_point.lng IS '经度';
  27. COMMENT ON COLUMN prod_gis_point.lat IS '纬度';
  28. COMMENT ON COLUMN prod_gis_point.device_id IS '关联设备ID(prod_monitor_device.id)';
  29. COMMENT ON COLUMN prod_gis_point.properties IS '扩展属性(JSON,存储不同类型点位的特有属性)';
  30. -- 索引
  31. CREATE INDEX IF NOT EXISTS idx_gis_point_type ON prod_gis_point(point_type);
  32. CREATE INDEX IF NOT EXISTS idx_gis_point_area ON prod_gis_point(area);
  33. CREATE INDEX IF NOT EXISTS idx_gis_point_status ON prod_gis_point(status);
  34. CREATE INDEX IF NOT EXISTS idx_gis_point_device_id ON prod_gis_point(device_id);
  35. CREATE INDEX IF NOT EXISTS idx_gis_point_lng_lat ON prod_gis_point(lng, lat);
  36. -- 2. GIS 管网线段表
  37. CREATE TABLE IF NOT EXISTS prod_gis_pipeline (
  38. id BIGSERIAL PRIMARY KEY,
  39. pipeline_code VARCHAR(50) NOT NULL UNIQUE,
  40. pipeline_name VARCHAR(200),
  41. pipeline_type VARCHAR(30), -- supply/distribution/drainage/raw_water
  42. material VARCHAR(30), -- ductile_iron/pvc/pe/steel
  43. diameter DECIMAL(8, 2), -- 管径(mm)
  44. start_lng DECIMAL(12, 8) NOT NULL, -- 起点经度
  45. start_lat DECIMAL(12, 8) NOT NULL, -- 起点纬度
  46. end_lng DECIMAL(12, 8) NOT NULL, -- 终点经度
  47. end_lat DECIMAL(12, 8) NOT NULL, -- 终点纬度
  48. length DECIMAL(10, 2), -- 长度(米)
  49. start_node_id BIGINT, -- 起点节点ID(关联 prod_gis_point.id)
  50. end_node_id BIGINT, -- 终点节点ID(关联 prod_gis_point.id)
  51. area VARCHAR(100),
  52. burial_depth DECIMAL(6, 2), -- 埋深(米)
  53. build_year INTEGER,
  54. status VARCHAR(20) DEFAULT 'normal', -- normal/leakage/damaged/maintenance
  55. properties JSONB,
  56. remark VARCHAR(500),
  57. created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  58. updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  59. );
  60. COMMENT ON TABLE prod_gis_pipeline IS 'GIS 管网线段表';
  61. COMMENT ON COLUMN prod_gis_pipeline.pipeline_type IS '管线类型: supply-供水/distribution-配水/drainage-排水/raw_water-原水';
  62. COMMENT ON COLUMN prod_gis_pipeline.material IS '材质: ductile_iron-球墨铸铁/pvc/pe/steel-钢管';
  63. COMMENT ON COLUMN prod_gis_pipeline.status IS '状态: normal-正常/leakage-渗漏/damaged-损坏/maintenance-维护中';
  64. -- 索引
  65. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_type ON prod_gis_pipeline(pipeline_type);
  66. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_area ON prod_gis_pipeline(area);
  67. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_status ON prod_gis_pipeline(status);
  68. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_start_node ON prod_gis_pipeline(start_node_id);
  69. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_end_node ON prod_gis_pipeline(end_node_id);
  70. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_start_coord ON prod_gis_pipeline(start_lng, start_lat);
  71. CREATE INDEX IF NOT EXISTS idx_gis_pipeline_end_coord ON prod_gis_pipeline(end_lng, end_lat);
  72. -- 3. GIS 区域表
  73. CREATE TABLE IF NOT EXISTS prod_gis_area (
  74. id BIGSERIAL PRIMARY KEY,
  75. area_code VARCHAR(50) NOT NULL UNIQUE,
  76. area_name VARCHAR(200) NOT NULL,
  77. area_type VARCHAR(30), -- water_plant/supply_zone/dma/admin_district
  78. center_lng DECIMAL(12, 8),
  79. center_lat DECIMAL(12, 8),
  80. area_size DECIMAL(10, 4), -- 面积(平方公里)
  81. boundary TEXT, -- 边界 GeoJSON (Polygon/MultiPolygon)
  82. parent_id BIGINT, -- 上级区域ID
  83. device_count INTEGER DEFAULT 0,
  84. online_count INTEGER DEFAULT 0,
  85. alert_count INTEGER DEFAULT 0,
  86. population DECIMAL(10, 4), -- 供水人口(万人)
  87. status VARCHAR(20) DEFAULT 'active', -- active/inactive
  88. remark VARCHAR(500),
  89. created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  90. updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  91. );
  92. COMMENT ON TABLE prod_gis_area IS 'GIS 区域表';
  93. COMMENT ON COLUMN prod_gis_area.area_type IS '区域类型: water_plant-水厂/supply_zone-供水片区/dma-独立计量区/admin_district-行政区';
  94. COMMENT ON COLUMN prod_gis_area.boundary IS '区域边界(GeoJSON 格式)';
  95. COMMENT ON COLUMN prod_gis_area.population IS '供水人口(万人)';
  96. -- 索引
  97. CREATE INDEX IF NOT EXISTS idx_gis_area_type ON prod_gis_area(area_type);
  98. CREATE INDEX IF NOT EXISTS idx_gis_area_status ON prod_gis_area(status);
  99. CREATE INDEX IF NOT EXISTS idx_gis_area_parent ON prod_gis_area(parent_id);
  100. CREATE INDEX IF NOT EXISTS idx_gis_area_center ON prod_gis_area(center_lng, center_lat);
  101. -- =====================================================
  102. -- 初始数据 (示例)
  103. -- =====================================================
  104. -- 示例区域
  105. INSERT INTO prod_gis_area (area_code, area_name, area_type, center_lng, center_lat, area_size, device_count, online_count, alert_count, population, status)
  106. VALUES
  107. ('AREA-001', '一体化水厂', 'water_plant', 82.07100000, 44.84500000, 2.5, 15, 12, 1, 5.0, 'active'),
  108. ('AREA-002', '管网一区', 'supply_zone', 82.08500000, 44.85500000, 8.0, 25, 20, 3, 12.0, 'active'),
  109. ('AREA-003', '管网二区', 'supply_zone', 82.09500000, 44.86000000, 6.5, 18, 15, 2, 8.5, 'active'),
  110. ('AREA-004', 'DMA-001', 'dma', 82.08000000, 44.85000000, 1.2, 8, 7, 0, 2.0, 'active'),
  111. ('AREA-005', 'DMA-002', 'dma', 82.09000000, 44.85800000, 1.8, 10, 8, 1, 3.5, 'active')
  112. ON CONFLICT (area_code) DO NOTHING;
  113. -- 示例监测点位
  114. INSERT INTO prod_gis_point (point_code, point_name, point_type, area, lng, lat, elevation, device_id, address, status)
  115. VALUES
  116. ('GIS-FLOW-001', '一号泵站出口流量计', 'flow', '一体化水厂', 82.07123456, 44.84567890, 350.5, 1, '一号泵站出口', 'online'),
  117. ('GIS-FLOW-002', '二号泵站流量计', 'flow', '一体化水厂', 82.07234567, 44.84678901, 348.2, 2, '二号泵站', 'online'),
  118. ('GIS-PRES-001', '管网压力监测点A', 'pressure', '管网一区', 82.08567890, 44.85512345, 340.0, 3, '人民路与建设路交叉口', 'online'),
  119. ('GIS-PRES-002', '管网压力监测点B', 'pressure', '管网一区', 82.08678901, 44.85623456, 338.5, 4, '中山路与解放路交叉口', 'offline'),
  120. ('GIS-LEV-001', '清水池液位计', 'level', '一体化水厂', 82.07012345, 44.84456789, 355.0, NULL, '清水池', 'online'),
  121. ('GIS-QUAL-001', '出厂水质监测仪', 'quality', '一体化水厂', 82.07345678, 44.84789012, 345.0, 5, '出厂水管', 'fault'),
  122. ('GIS-VALV-001', '主干管阀门V01', 'valve', '管网一区', 82.08456789, 44.85401234, 342.0, NULL, '主干管起点', 'online'),
  123. ('GIS-VALV-002', '主干管阀门V02', 'valve', '管网二区', 82.09512345, 44.86023456, 335.0, NULL, '主干管末端', 'online'),
  124. ('GIS-FLOW-003', 'DMA-001入口流量计', 'flow', 'DMA-001', 82.08045678, 44.85067890, 341.5, NULL, 'DMA-001入口', 'online'),
  125. ('GIS-PRES-003', '管网压力监测点C', 'pressure', '管网二区', 82.09623456, 44.86134567, 333.0, NULL, '建设路与和平路交叉口', 'online')
  126. ON CONFLICT (point_code) DO NOTHING;
  127. -- 示例管线
  128. INSERT INTO prod_gis_pipeline (pipeline_code, pipeline_name, pipeline_type, material, diameter, start_lng, start_lat, end_lng, end_lat, length, start_node_id, end_node_id, area, burial_depth, build_year, status)
  129. VALUES
  130. ('PIPE-001', '出厂水主干管', 'supply', 'ductile_iron', 600.00, 82.07123456, 44.84567890, 82.08456789, 44.85401234, 1500.00, 1, 7, '一体化水厂', 1.5, 2020, 'normal'),
  131. ('PIPE-002', '管网一区主干管', 'distribution', 'ductile_iron', 400.00, 82.08456789, 44.85401234, 82.08678901, 44.85623456, 800.00, 7, 4, '管网一区', 1.2, 2020, 'normal'),
  132. ('PIPE-003', '管网二区主干管', 'distribution', 'pvc', 300.00, 82.08678901, 44.85623456, 82.09512345, 44.86023456, 1200.00, 4, 8, '管网二区', 1.0, 2021, 'normal'),
  133. ('PIPE-004', 'DMA-001入口管', 'distribution', 'pe', 200.00, 82.08456789, 44.85401234, 82.08045678, 44.85067890, 500.00, 7, 9, 'DMA-001', 0.8, 2022, 'normal'),
  134. ('PIPE-005', '管网二区支管', 'distribution', 'pe', 150.00, 82.09512345, 44.86023456, 82.09623456, 44.86134567, 300.00, 8, 10, '管网二区', 0.8, 2022, 'maintenance')
  135. ON CONFLICT (pipeline_code) DO NOTHING;