kcg-monitoring/frontend/src/services/submarineCable.ts
htlee 2534faa488 feat: 프론트엔드 모노레포 이관 + signal-batch 연동 + Tailwind/i18n/테마 전환
- frontend/ 폴더로 프론트엔드 전체 이관
- signal-batch API 연동 (한국 선박 위치 데이터)
- Tailwind CSS 4 + CSS 변수 테마 토큰 (dark/light)
- i18next 다국어 (ko/en) 인프라 + 28개 컴포넌트 적용
- 레이어 패널 트리 구조 재설계 (카테고리별 온/오프, 범례)
- Google OAuth 로그인 화면 + DEV LOGIN 우회
- 외부 API CORS 프록시 전환 (Airplanes.live, OpenSky, CelesTrak)
- ShipLayer 이미지 탭 전환 (signal-batch / MarineTraffic)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:54:41 +09:00

420 lines
15 KiB
TypeScript

// ═══ Korean Submarine Cable Data ═══
// Source: TeleGeography / submarinecablemap.com
// Major submarine cables landing in South Korea
export interface SubmarineCable {
id: string;
name: string;
color: string;
landingPoints: string[]; // city names
rfsYear?: number; // ready for service year
length?: string; // e.g. "36,500 km"
owners?: string;
route: [number, number][]; // [lng, lat] pairs for the cable path
}
// ── Route reference ──
// Korea Strait: 129.5°E between Korea & Tsushima (water)
// Tsushima-Kyushu channel: ~129.8-130.2°E, 33.5-34°N (water)
// West of Kyushu (Goto-Nagasaki gap): ~129.3°E, 31-33°N (water)
// South of Kyushu (Cape Sata): below 30.8°N when 130-131°E
// South of Shikoku: below 32.5°N when 132-135°E
// South of Kii/Izu: below 33°N when 135-139°E
// Korea south coast: below 33.8°N between 126-129°E = open sea
export const KOREA_SUBMARINE_CABLES: SubmarineCable[] = [
// ═══ Southbound cables (Busan → Korea Strait → East China Sea → south) ═══
{
id: 'apcn-2',
name: 'APCN-2',
color: '#e91e63',
landingPoints: ['부산', '일본', '중국', '대만', '필리핀', '싱가포르', '말레이시아'],
rfsYear: 2001,
length: '19,000 km',
owners: 'KT, NTT, China Telecom 등',
route: [
[129.08, 35.18], // Busan coast
[129.5, 34.5], // Korea Strait (water between Korea & Tsushima)
[129.8, 33.8], // Tsushima-Kyushu channel (water)
[129.3, 32.5], // West of Kyushu (Goto-Nagasaki gap, water)
[129.0, 31.0], // West of Kyushu south (water)
[128.5, 29.5], // South of Kyushu (open sea)
[127.0, 27.0], // East China Sea
[125.0, 25.0], // East China Sea
[123.5, 23.0], // East of Taiwan (sea)
[121.5, 21.0], // South of Taiwan (sea)
[119.5, 18.5], // Luzon Strait
[117.5, 15.0], // South China Sea
[115.0, 10.5], // South China Sea
[111.5, 6.0], // South China Sea
[107.0, 3.0], // Approach Singapore
[104.0, 1.3], // Singapore coast
],
},
{
id: 'apg',
name: 'APG (Asia Pacific Gateway)',
color: '#2196f3',
landingPoints: ['부산', '일본', '중국', '대만', '홍콩', '베트남', '태국', '말레이시아', '싱가포르'],
rfsYear: 2016,
length: '10,400 km',
owners: 'KT, NTT, China Telecom, VNPT 등',
route: [
[129.08, 35.18], // Busan coast
[129.4, 34.4], // Korea Strait
[129.7, 33.7], // Tsushima-Kyushu channel
[129.2, 32.3], // West of Kyushu (water)
[128.8, 30.8], // South of Kyushu (water)
[127.5, 28.5], // East China Sea
[125.5, 26.0], // East China Sea
[123.5, 24.0], // East of Taiwan (sea)
[121.8, 21.5], // South Taiwan (sea)
[119.0, 19.5], // Luzon Strait
[116.5, 18.5], // South China Sea
[114.5, 22.0], // Hong Kong approach (sea)
[113.0, 18.0], // South China Sea
[110.0, 14.0], // Off Vietnam (sea)
[108.5, 11.0], // Off South Vietnam (sea)
[106.5, 7.0], // South China Sea
[104.5, 2.5], // Approach Singapore
[104.0, 1.3], // Singapore coast
],
},
{
id: 'eac-c2c',
name: 'EAC-C2C',
color: '#ff9800',
landingPoints: ['부산', '일본', '중국', '필리핀', '싱가포르'],
rfsYear: 2002,
length: '36,500 km',
owners: 'KT 등',
route: [
[129.08, 35.18], // Busan coast
[129.6, 34.6], // Korea Strait
[130.0, 33.9], // Tsushima-Kyushu channel
[129.5, 32.8], // West Kyushu coast (water)
[129.0, 31.2], // West of Kyushu south (water)
[128.0, 29.0], // East China Sea
[126.0, 26.5], // East China Sea
[124.0, 24.0], // East of Taiwan (sea)
[122.5, 21.0], // South Taiwan (sea)
[121.0, 18.0], // Luzon Strait
[120.0, 14.5], // West of Luzon (sea)
[117.5, 10.5], // South China Sea
[113.0, 6.0], // South China Sea
[108.0, 3.5], // South China Sea
[104.0, 1.3], // Singapore coast
],
},
{
id: 'flag-north-asia',
name: 'FLAG/REACH North Asia Loop',
color: '#9c27b0',
landingPoints: ['부산', '일본', '홍콩', '중국'],
rfsYear: 2002,
length: '11,500 km',
owners: 'Reliance Globalcom',
route: [
[129.08, 35.18], // Busan coast
[129.5, 34.5], // Korea Strait
[129.9, 33.8], // Tsushima-Kyushu channel
[129.4, 32.5], // West Kyushu (water)
[129.0, 31.0], // South of Kyushu (water)
[127.0, 28.0], // East China Sea
[124.5, 25.5], // East China Sea
[122.5, 23.0], // East of Taiwan (sea)
[121.0, 21.0], // South Taiwan (sea)
[118.0, 19.5], // South China Sea
[115.5, 21.0], // Approach Hong Kong
[114.2, 22.0], // Hong Kong coast
],
},
{
id: 'sjc',
name: 'SJC (SE Asia-Japan Cable)',
color: '#8bc34a',
landingPoints: ['부산', '일본', '중국', '홍콩', '필리핀', '싱가포르'],
rfsYear: 2013,
length: '8,900 km',
owners: 'KT, Google, China Mobile 등',
route: [
[129.08, 35.18], // Busan coast
[129.4, 34.4], // Korea Strait
[129.7, 33.6], // Tsushima-Kyushu channel
[129.2, 32.0], // West Kyushu (water)
[128.5, 30.5], // South of Kyushu (water)
[126.5, 27.5], // East China Sea
[124.0, 25.0], // East China Sea
[122.5, 22.5], // East of Taiwan (sea)
[121.0, 20.5], // South Taiwan (sea)
[118.0, 19.0], // South China Sea
[115.0, 21.5], // Approach Hong Kong
[114.2, 22.0], // Hong Kong coast
[113.5, 18.5], // South China Sea
[112.0, 13.0], // South China Sea
[110.0, 7.5], // South China Sea
[106.5, 3.5], // Approach Singapore
[104.0, 1.3], // Singapore coast
],
},
{
id: 'sjc2',
name: 'SJC2',
color: '#03a9f4',
landingPoints: ['부산', '일본', '중국', '대만', '싱가포르', '태국'],
rfsYear: 2022,
length: '10,500 km',
owners: 'KT, China Mobile, Facebook, KDDI 등',
route: [
[129.08, 35.18], // Busan coast
[129.5, 34.5], // Korea Strait
[129.8, 33.7], // Tsushima-Kyushu channel
[129.3, 32.3], // West Kyushu (water)
[128.8, 30.8], // South of Kyushu (water)
[127.0, 28.0], // East China Sea
[125.0, 25.5], // East China Sea
[123.0, 23.5], // East of Taiwan (sea)
[121.5, 21.5], // South Taiwan (sea)
[119.0, 19.5], // South China Sea
[116.0, 21.5], // Approach Hong Kong
[114.5, 22.0], // Hong Kong area
[113.0, 17.5], // South China Sea
[110.0, 12.5], // South China Sea
[107.5, 8.0], // South China Sea
[105.0, 3.5], // Approach Singapore
[104.0, 1.3], // Singapore coast
],
},
// ═══ Japan direct cable ═══
{
id: 'kjcn',
name: 'KJCN (Korea-Japan Cable)',
color: '#4caf50',
landingPoints: ['부산', '기타큐슈(일본)'],
rfsYear: 2003,
length: '230 km',
owners: 'KT, KDDI',
route: [
[129.08, 35.18], // Busan coast
[129.5, 34.8], // Korea Strait mid
[129.9, 34.4], // Strait (water)
[130.3, 34.1], // Approaching Kyushu north coast
[130.9, 33.9], // Kitakyushu coast
],
},
// ═══ Pacific cables (Busan → Korea Strait → south of Japan → Pacific) ═══
{
id: 'tpe',
name: 'TPE (Trans-Pacific Express)',
color: '#00bcd4',
landingPoints: ['거제', '일본', '중국', '대만', '미국'],
rfsYear: 2008,
length: '17,700 km',
owners: 'KT, China Telecom, Verizon 등',
route: [
[128.62, 34.88], // Geoje coast
[129.3, 34.3], // Korea Strait
[129.7, 33.7], // Tsushima-Kyushu channel
[129.3, 32.2], // West Kyushu (water)
[129.0, 31.0], // SW of Kyushu (water)
[129.5, 30.0], // South of Cape Sata (open sea)
[131.5, 30.0], // SE of Kyushu (open sea)
[134.0, 30.5], // South of Shikoku (sea, <32.5°N)
[137.0, 31.5], // South of Kii (sea, <33°N)
[140.0, 32.0], // South of Izu (sea, <33°N)
[143.0, 33.0], // Off east Honshu (sea)
[148.0, 35.5], // North Pacific
[158.0, 38.0], // North Pacific
[170.0, 40.0], // Mid Pacific
[-170.0, 42.0], // Mid Pacific
[-155.0, 41.0], // Mid Pacific
[-140.0, 39.0], // East Pacific
[-130.0, 38.0], // Approach US
[-122.4, 37.8], // US West Coast
],
},
{
id: 'ncp',
name: 'NCP (New Cross Pacific)',
color: '#ffeb3b',
landingPoints: ['부산', '일본', '미국'],
rfsYear: 2018,
length: '13,600 km',
owners: 'KT, Amazon, Microsoft 등',
route: [
[129.08, 35.18], // Busan coast
[129.5, 34.5], // Korea Strait
[129.8, 33.8], // Tsushima-Kyushu channel
[129.4, 32.5], // West Kyushu (water)
[129.0, 31.0], // SW of Kyushu (water)
[129.8, 30.0], // South of Cape Sata (sea)
[132.0, 30.0], // SE of Kyushu (sea)
[135.0, 30.5], // South of Shikoku (sea)
[138.0, 31.0], // South of Kii (sea)
[141.0, 32.0], // South of Izu (sea)
[144.0, 33.5], // Off east Honshu (sea)
[150.0, 37.0], // North Pacific
[160.0, 40.0], // North Pacific
[172.0, 43.0], // Mid Pacific
[-170.0, 45.5], // Mid Pacific
[-155.0, 45.0], // Mid Pacific
[-140.0, 43.0], // East Pacific
[-130.0, 42.0], // Approach US
[-125.0, 40.5], // Near US
[-122.3, 37.4], // US West Coast
],
},
// ═══ GOKI (Incheon → Yellow Sea → south → Okinawa → Guam) ═══
{
id: 'goki',
name: 'GOKI',
color: '#ff5722',
landingPoints: ['인천', '오키나와', '괌'],
rfsYear: 2020,
length: '3,400 km',
owners: 'KT 등',
route: [
[126.59, 37.46], // Incheon coast
[126.0, 36.5], // Yellow Sea (open water, west of Korea)
[125.5, 35.5], // Yellow Sea
[125.0, 34.5], // Yellow Sea south
[125.0, 33.5], // South of Korea (open sea, south of Jeju)
[125.5, 32.0], // East China Sea
[126.5, 30.0], // East China Sea
[127.5, 27.5], // Ryukyu arc
[127.8, 26.3], // Okinawa coast
[129.0, 23.0], // Philippine Sea
[133.0, 19.0], // Philippine Sea
[138.0, 16.0], // Philippine Sea
[144.8, 13.5], // Guam coast
],
},
// ═══ China direct cables (Yellow Sea crossing) ═══
{
id: 'c2c',
name: 'C2C (China-Korea)',
color: '#f44336',
landingPoints: ['태안', '칭다오(중국)'],
rfsYear: 2001,
length: '1,100 km',
owners: 'KT, China Netcom',
route: [
[126.35, 36.75], // Taean coast (west coast Korea)
[125.5, 36.5], // Yellow Sea
[124.0, 36.0], // Yellow Sea mid
[122.5, 35.8], // Yellow Sea
[121.0, 36.0], // Approach Qingdao
[120.4, 36.1], // Qingdao coast
],
},
{
id: 'ckc',
name: 'CKC (China-Korea Cable)',
color: '#ff7043',
landingPoints: ['태안', '상하이(중국)'],
rfsYear: 2006,
length: '1,300 km',
owners: 'KT, China Telecom',
route: [
[126.35, 36.75], // Taean coast (west coast Korea)
[125.5, 36.0], // Yellow Sea
[124.5, 35.0], // Yellow Sea mid
[123.5, 34.0], // Yellow Sea south
[123.0, 33.0], // East China Sea
[122.5, 32.0], // East China Sea
[122.0, 31.5], // Approach Shanghai
[121.8, 31.2], // Shanghai coast
],
},
{
id: 'flag-fea',
name: 'FEA (Flag Europe Asia)',
color: '#ab47bc',
landingPoints: ['부산', '상하이(중국)', '홍콩'],
rfsYear: 2001,
length: '28,000 km',
owners: 'Reliance Globalcom',
route: [
[129.08, 35.18], // Busan coast
[128.0, 34.8], // South Sea (water, south of coast)
[127.0, 34.5], // South Sea
[126.0, 33.8], // South of Jeju area (water)
[125.0, 33.0], // East China Sea
[124.0, 32.0], // East China Sea
[123.0, 31.5], // Approach Shanghai
[121.8, 31.2], // Shanghai coast
],
},
// ═══ Domestic cables ═══
{
id: 'jeju-mainland-2',
name: '제주-본토 해저케이블 2',
color: '#e0e0e0',
landingPoints: ['제주', '해남(전남)'],
rfsYear: 2013,
owners: 'KT',
route: [
[126.53, 33.51], // Jeju north coast
[126.50, 33.75], // Jeju Strait
[126.48, 34.00], // Jeju Strait mid
[126.50, 34.25], // Approach mainland
[126.57, 34.57], // Haenam coast
],
},
{
id: 'jeju-mainland-3',
name: '제주-본토 해저케이블 3',
color: '#bdbdbd',
landingPoints: ['제주', '진도(전남)'],
rfsYear: 2019,
owners: 'KT',
route: [
[126.53, 33.51], // Jeju north coast
[126.30, 33.80], // Jeju Strait west
[126.15, 34.10], // Jeju Strait mid
[126.20, 34.35], // Approach Jindo
[126.26, 34.49], // Jindo coast
],
},
{
id: 'ulleung-mainland',
name: '울릉-본토 해저케이블',
color: '#90a4ae',
landingPoints: ['울릉도', '포항'],
rfsYear: 2016,
owners: 'KT',
route: [
[130.91, 37.48], // Ulleungdo coast
[130.50, 37.15], // East Sea
[130.10, 36.75], // East Sea
[129.70, 36.35], // Approach Pohang
[129.34, 36.02], // Pohang coast
],
},
];
// Landing points in Korea for marker display
export interface CableLandingPoint {
name: string;
lat: number;
lng: number;
cables: string[]; // cable IDs
}
export const KOREA_LANDING_POINTS: CableLandingPoint[] = [
{ name: '부산', lat: 35.18, lng: 129.08, cables: ['apcn-2', 'apg', 'eac-c2c', 'kjcn', 'flag-north-asia', 'ncp', 'sjc', 'sjc2', 'flag-fea'] },
{ name: '거제', lat: 34.88, lng: 128.62, cables: ['tpe'] },
{ name: '태안', lat: 36.75, lng: 126.35, cables: ['c2c', 'ckc'] },
{ name: '인천', lat: 37.46, lng: 126.59, cables: ['goki'] },
{ name: '제주', lat: 33.51, lng: 126.53, cables: ['jeju-mainland-2', 'jeju-mainland-3'] },
{ name: '해남', lat: 34.57, lng: 126.57, cables: ['jeju-mainland-2'] },
{ name: '진도', lat: 34.49, lng: 126.26, cables: ['jeju-mainland-3'] },
{ name: '울릉도', lat: 37.48, lng: 130.91, cables: ['ulleung-mainland'] },
{ name: '포항', lat: 36.02, lng: 129.34, cables: ['ulleung-mainland'] },
];