- 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 추가
50 lines
1.7 KiB
SQL
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);
|