kcg-monitoring/database/migration/009_group_polygons.sql
htlee 2441e3068a feat(prediction): 선단/어구그룹 폴리곤 서버사이드 생성 + PostGIS 저장
- DB migration 009: group_polygon_snapshots 테이블 (PostGIS geometry)
- polygon_builder.py: Shapely 기반 convex hull + buffer 폴리곤 생성
- scheduler.py: 5분 주기 분석 사이클에 폴리곤 생성 Step 4.5 통합
- fleet_tracker.py: get_company_vessels() 메서드 추가
- kcgdb.py: save_group_snapshots(), cleanup_group_snapshots() 추가
- requirements.txt: shapely>=2.0 추가
2026-03-24 13:30:31 +09:00

50 lines
1.7 KiB
SQL

-- 009: 선단/어구그룹 폴리곤 스냅샷 테이블
-- 5분 주기 APPEND, 7일 보존
SET search_path TO kcg, public;
CREATE TABLE IF NOT EXISTS kcg.group_polygon_snapshots (
id BIGSERIAL PRIMARY KEY,
-- 그룹 식별
group_type VARCHAR(20) NOT NULL, -- FLEET | GEAR_IN_ZONE | GEAR_OUT_ZONE
group_key VARCHAR(100) NOT NULL, -- fleet: company_id, gear: parent_name
group_label TEXT, -- 표시명 (회사명 또는 모선명)
-- 스냅샷 시각
snapshot_time TIMESTAMPTZ NOT NULL,
-- PostGIS geometry
polygon geometry(Polygon, 4326), -- convex hull + buffer (3점 미만 시 NULL)
center_point geometry(Point, 4326), -- 중심점
-- 지표
area_sq_nm DOUBLE PRECISION DEFAULT 0, -- 면적 (제곱 해리)
member_count INT NOT NULL DEFAULT 0, -- 소속 선박/어구 수
-- 수역 분류 (어구그룹용)
zone_id VARCHAR(20), -- ZONE_I ~ ZONE_IV | OUTSIDE
zone_name TEXT,
-- 멤버 상세 (JSONB 배열)
members JSONB NOT NULL DEFAULT '[]',
-- [{mmsi, name, lat, lon, sog, cog, role, isParent}]
-- 색상 힌트
color VARCHAR(20),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 조회 성능 인덱스
CREATE INDEX IF NOT EXISTS idx_gps_type_time
ON kcg.group_polygon_snapshots(group_type, snapshot_time DESC);
CREATE INDEX IF NOT EXISTS idx_gps_key_time
ON kcg.group_polygon_snapshots(group_key, snapshot_time DESC);
CREATE INDEX IF NOT EXISTS idx_gps_snapshot_time
ON kcg.group_polygon_snapshots(snapshot_time DESC);
-- 공간 인덱스
CREATE INDEX IF NOT EXISTS idx_gps_polygon_gist
ON kcg.group_polygon_snapshots USING GIST(polygon);