- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환 - sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자 - t_vessel_latest_position → t_ais_position 테이블 전환 - 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등) - AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼) - CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가 - VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승 - SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류 - WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳) - 모니터링/성능 최적화 코드 mmsi 기반 전환 - DataSource 설정 통합 (snpdb 단일 DB) - AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원) - ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
69 lines
1.9 KiB
PL/PgSQL
69 lines
1.9 KiB
PL/PgSQL
-- Unix timestamp 변환 함수
|
|
CREATE OR REPLACE FUNCTION signal.convert_to_unix_timestamp(
|
|
geom geometry,
|
|
base_time timestamp without time zone
|
|
) RETURNS geometry AS $$
|
|
DECLARE
|
|
wkt_text text;
|
|
points text[];
|
|
point_text text;
|
|
coords text[];
|
|
result_wkt text;
|
|
unix_base bigint;
|
|
relative_seconds bigint;
|
|
unix_time bigint;
|
|
i integer;
|
|
BEGIN
|
|
IF geom IS NULL THEN
|
|
RETURN NULL;
|
|
END IF;
|
|
|
|
-- Unix timestamp 기준값
|
|
unix_base := EXTRACT(EPOCH FROM base_time AT TIME ZONE 'Asia/Seoul')::bigint;
|
|
|
|
-- WKT 텍스트 추출
|
|
wkt_text := ST_AsText(geom);
|
|
|
|
-- LINESTRING M(...) 에서 좌표 부분만 추출
|
|
wkt_text := substring(wkt_text from 'LINESTRING M\((.*)\)');
|
|
|
|
-- 각 포인트를 배열로 분리
|
|
points := string_to_array(wkt_text, ', ');
|
|
|
|
-- 결과 WKT 시작
|
|
result_wkt := 'LINESTRING M(';
|
|
|
|
-- 각 포인트 처리
|
|
FOR i IN 1..array_length(points, 1) LOOP
|
|
-- 좌표를 공백으로 분리 (lon lat m)
|
|
coords := string_to_array(points[i], ' ');
|
|
|
|
-- M값(상대시간 초) 추출 및 Unix timestamp로 변환
|
|
relative_seconds := coords[3]::bigint;
|
|
unix_time := unix_base + relative_seconds;
|
|
|
|
-- 결과에 추가
|
|
IF i > 1 THEN
|
|
result_wkt := result_wkt || ', ';
|
|
END IF;
|
|
result_wkt := result_wkt || coords[1] || ' ' || coords[2] || ' ' || unix_time;
|
|
END LOOP;
|
|
|
|
result_wkt := result_wkt || ')';
|
|
|
|
-- geometry 타입으로 변환하여 반환
|
|
RETURN ST_GeomFromText(result_wkt, 4326);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
|
|
|
|
-- 함수 테스트
|
|
SELECT
|
|
sig_src_cd,
|
|
target_id,
|
|
time_bucket,
|
|
ST_AsText(track_geom) as original,
|
|
ST_AsText(signal.convert_to_unix_timestamp(track_geom, time_bucket)) as converted
|
|
FROM signal.t_vessel_tracks_5min
|
|
WHERE track_geom IS NOT NULL
|
|
LIMIT 1;
|