# ๐ŸŒค๏ธ ๊ธฐ์ƒ์ฒญ 3์ฐจ์› ๊ฐ๊ด€๋ถ„์„ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๋ฐ ๋ฐ”๋žŒ ๋ฒกํ„ฐ ๊ฒ€์ฆ ์‹œ์Šคํ…œ > **KMA 3D Objective Analysis Grid Data Extraction & Wind Vector Verification System** ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ์ƒ์ฒญ(KMA)์˜ ์ˆ˜์น˜ ๊ฐ๊ด€๋ถ„์„ ์‹œ์Šคํ…œ(NetCDF ๊ฒฉ์ž ์ž๋ฃŒ)๊ณผ ์ง€์ƒ ๊ธฐ์ƒ ์‹ค์ธก API ๋ฐ์ดํ„ฐ๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ณ„ํ•˜์—ฌ, ํŠน์ • ํƒ€๊ฒŸ ์œ„ยท๊ฒฝ๋„์— ๋Œ€ํ•ด ์ •๋ฐ€ํ•œ 5๋ถ„ ๊ฐ„๊ฒฉ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ฐ”๋žŒ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ(U, V ์„ฑ๋ถ„)์˜ ์ผ๊ด€์„ฑ ๋ฐ ์ •ํ•ฉ์„ฑ์„ ์ˆ˜ํ•™์ ยท๊ณผํ•™์ ์œผ๋กœ ๊ฒ€์ฆ ๋ฐ ์‹œ๊ฐํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. --- ## ๐Ÿ“‚ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ํŒŒ์ผ ์—ญํ•  ```text weather-api/ โ”‚ โ”œโ”€โ”€ .gitignore # Git ์ €์žฅ์†Œ ๋“ฑ๋ก ์ œ์™ธ ํŒจํ„ด ์„ค์ • (venv, .env, *.csv, *.png) โ”œโ”€โ”€ .env.example # API ์ธ์ฆํ‚ค ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์˜ˆ์‹œ ํŒŒ์ผ โ”œโ”€โ”€ requirements.txt # ํ”„๋กœ์ ํŠธ ์‹คํ–‰์— ํ•„์š”ํ•œ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก โ”‚ โ”œโ”€โ”€ PROJECT_INFO.md # ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜, ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ ๋ฐ ์ฃผ์š” ๊ฒฐ๋ก  ์š”์•ฝ โ”œโ”€โ”€ README.md # ๋ณธ ํŒŒ์ผ (์ „์ฒด ์ƒ์„ธ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ) โ”‚ # [1] ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๋ฐ API ์—ฐ๋™ ์Šคํฌ๋ฆฝํŠธ โ”œโ”€โ”€ extract_weather_data.py # ํŠน์ • ๊ด€์‹ฌ ์‹œ์ (visible-times.txt)์˜ ์ „ํ›„ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ ๋‹จ์ผ ์ถ”์ถœ โ”œโ”€โ”€ extract_continuous_data.py # ์žฅ๊ธฐ(4์›” 1์ผ ~ 5์›” 7์ผ) 5๋ถ„ ์—ฐ์† ๋ฐ์ดํ„ฐ ์ˆœ์ฐจ ์ถ”์ถœ (์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ) โ”œโ”€โ”€ extract_continuous_data_fast.py # ThreadPoolExecutor(์Šค๋ ˆ๋“œ 5๊ฐœ) ๊ธฐ๋ฐ˜ ๊ณ ์† ์—ฐ์† ๋ฐ์ดํ„ฐ ์ถ”์ถœ ๋ฐ ์ •๋ ฌ ๋ณ‘ํ•ฉ โ”œโ”€โ”€ check_api_columns.py # KMA API ์ปฌ๋Ÿผ ํ—ค๋” ์ •๋ณด ๋””๋ฒ„๊น… ๋ฐ ํ™•์ธ โ”‚ # [2] ๊ฒฉ์ž ๋ถ„์„ ๋ฐ ์ขŒํ‘œ ๋งคํ•‘ โ”œโ”€โ”€ verify_grid.py # sfc_grid_latlon.nc(NetCDF) ๊ฒฉ์ž๋ง ๋กœ๋“œ ํ›„ ์ตœ์ธ์ ‘ 3x3 ์‹ค์ œ ๊ฒฉ์ž ์ขŒํ‘œ ํƒ์ƒ‰ โ”œโ”€โ”€ visualize_grid.py # ๊ฐ€์ƒ 500m ๊ธฐ์ƒ ๊ฒฉ์ž์  ์ขŒํ‘œ ๊ณต๊ฐ„ ์‹œ๊ฐํ™” ๋ฐ ๊ฒ€์ฆ โ”‚ # [3] ๋ฐ”๋žŒ ๋ฒกํ„ฐ ์ •ํ•ฉ์„ฑ ๋ถ„์„ ๋ฐ ๊ฒ€์ฆ โ”œโ”€โ”€ verify_wind_vectors.py # ํ’ํ–ฅ/ํ’์† & U/V ์„ฑ๋ถ„ ๊ธฐ์ƒ ์‚ผ๊ฐ ๊ณต์‹ ์—ญ์‚ฐ ๋ฐ ๊ธฐ๋ณธ ๊ฒ€์ฆ โ”œโ”€โ”€ analyze_relative_error.py # ๋™์„œ(U), ๋‚จ๋ถ(V) ์„ฑ๋ถ„๋ณ„ ์ ˆ๋Œ€/์ƒ๋Œ€/๋ฒกํ„ฐ ์ดํ•ฉ ์˜ค์ฐจ์œจ ์ •๋Ÿ‰ํ™” ๋ถ„์„ โ”œโ”€โ”€ analyze_ws_error.py # U, V ์„ฑ๋ถ„์„ ํ™œ์šฉํ•œ ๋ฐ”๋žŒ ํฌ๊ธฐ(Wind Speed) ์—ญ์‚ฐ ๋ฐ ์˜ค์ฐจ ๊ฒ€์ฆ โ”‚ # [4] ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” โ”œโ”€โ”€ plot_weather_data.py # 2์ค‘ ์ถ•(๊ธฐ์˜จยท์ด์Šฌ์  vs ํ’์†) ์‹œ๊ณ„์—ด ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ ๋ฐ ํŠน์ • ํƒ€์ž„์Šคํƒฌํ”„ ์‹ค์„  ํ‘œ๊ธฐ โ”œโ”€โ”€ plot_weather_no_wind.py # ํ’์† ์ œ์™ธ ๊ธฐ์˜จ ๋ฐ ์ด์Šฌ์  ์‹œ๊ณ„์—ด ๋ถ„์„ ์ฐจํŠธ ์ƒ์„ฑ โ”œโ”€โ”€ plot_weather_with_humidity.py # ๊ธฐ์˜จ, ์ด์Šฌ์  ์˜จ๋„์™€ ์ƒ๋Œ€์Šต๋„ ๋ณ€ํ™”๋ฅผ ๋‹ค์ค‘ ์ฐจํŠธ๋กœ ์‹œ๊ฐํ™” โ”‚ # [5] ์›์ฒœ ๋ฐ์ดํ„ฐ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (์„ค์ •) โ”œโ”€โ”€ sfc_grid_latlon.nc # ๊ธฐ์ƒ์ฒญ 3์ฐจ์› ๊ฐ๊ด€๋ถ„์„ 500m ํ•ด์ƒ๋„ ๊ฒฉ์ž ์œ„/๊ฒฝ๋„ ์›์ฒœ ํŒŒ์ผ โ”œโ”€โ”€ weather_data_definition.csv # ์ˆ˜์ง‘๋˜๋Š” 10๊ฐœ ๊ธฐ์ƒ ๊ด€์ธก ๋ณ€์ˆ˜์˜ ์˜๋ฏธ ๋ฐ ๋‹จ์œ„ ์ •์˜์„œ (ํ•ต์‹ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ) โ”œโ”€โ”€ visible-times.txt # ์‹œ๊ฐํ™” ๊ทธ๋ž˜ํ”„ ์ƒ์— ํ•˜์ด๋ผ์ดํŠธํ•  ํ•ต์‹ฌ ๊ด€์ธก ์‹œ์  ๋ชฉ๋ก โ””โ”€โ”€ target-coord.txt # ๋ถ„์„ ํƒ€๊ฒŸ ์ค‘์‹ฌ ์ขŒํ‘œ ``` --- ## ๐Ÿ“Š ๊ธฐ์ƒ ๊ด€์ธก ๋ณ€์ˆ˜ ์ƒ์„ธ ์ •์˜ (Weather Data Columns) ๋ณธ ์‹œ์Šคํ…œ์—์„œ ์ถ”์ถœ ๋ฐ ์ •์ œํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ƒ ๋ณ€์ˆ˜๋Š” `weather_data_definition.csv`์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: | ์ปฌ๋Ÿผ๋ช… (Column) | ์„ค๋ช… (Description) | ๋‹จ์œ„ (Unit) | ๋น„๊ณ  (Remark) | | :--- | :--- | :---: | :--- | | **tm** | ๊ด€์ธก์‹œ๊ฐ (KST) | `YYYYMMDDHHMI` | ํ•œ๊ตญ ํ‘œ์ค€์‹œ ๊ธฐ์ค€ | | **ta** | ๊ธฐ์˜จ | `ยฐC` | ์ง€์ƒ 1.5m ๋†’์ด | | **hm** | ์ƒ๋Œ€์Šต๋„ | `%` | - | | **td** | ์ด์Šฌ์  ์˜จ๋„ | `ยฐC` | - | | **wd_10m** | 10๋ถ„ ํ‰๊ท  ํ’ํ–ฅ | `deg` | 0~360๋„ (๋ถ:0, ๋™:90, ๋‚จ:180, ์„œ:270) | | **ws_10m** | 10๋ถ„ ํ‰๊ท  ํ’์† | `m/s` | - | | **uu** | ๋™์„œ ๋ฐ”๋žŒ ์„ฑ๋ถ„ (U) | `m/s` | **์„œํ’(+)**, ๋™ํ’(-) | | **vv** | ๋‚จ๋ถ ๋ฐ”๋žŒ ์„ฑ๋ถ„ (V) | `m/s` | **๋‚จํ’(+)**, ๋ถํ’(-) | | **rn_ox** | ๊ฐ•์ˆ˜ ์œ ๋ฌด | `-` | 0: ๋ฌด๊ฐ•์ˆ˜, 1: ๊ฐ•์ˆ˜ | | **vs** | ์‹œ์ • | `km` | ๊ฐ€์‹œ๊ฑฐ๋ฆฌ | --- ## โš™๏ธ ์„ค์น˜ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• (Setup & Installation) ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” **Python 3.8 ์ด์ƒ** ํ™˜๊ฒฝ์—์„œ ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ### 1. ๊ฐ€์ƒํ™˜๊ฒฝ ๊ตฌ์ถ• ๋ฐ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ```bash # ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ cd weather-api # ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ (venv) python3 -m venv venv # ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” # Windows (cmd): venv\Scripts\activate.bat # Windows (PowerShell): .\venv\Scripts\Activate.ps1 # Linux / macOS: source venv/bin/activate # ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜ pip install --upgrade pip pip install -r requirements.txt ``` ### 2. KMA API ์ธ์ฆํ‚ค ์„ค์ • (`.env`) ๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ(APIS) ์—ฐ๋™์„ ์œ„ํ•ด ์ธ์ฆํ‚ค ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— `.env` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆํ‚ค๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค: ```bash # .env ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘ echo "KMA_API_KEY=๋ฐœ๊ธ‰๋ฐ›์€_๊ธฐ์ƒ์ฒญ_์ธ์ฆํ‚ค" > .env ``` > โš ๏ธ **๋ณด์•ˆ ๊ฒฝ๊ณ  (CWE-798 ๋ฐฉ์ง€)**: `.env` ํŒŒ์ผ์€ ์ธ์ฆํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. **์ ˆ๋Œ€๋กœ ์ด ํŒŒ์ผ์„ Git ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹/์—…๋กœ๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.** `.gitignore` ์„ค์ •์— ์˜ํ•ด ์ž๋™ ์ฐจ๋‹จ๋˜์ง€๋งŒ, ํ•ญ์ƒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. --- ## ๐Ÿš€ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๊ฐ€์ด๋“œ (Usage Pipeline) ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ์ •๋ฐ€ ๊ฒฉ์ž ์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ˆœ์„œ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ### Step 1. ์ตœ์ธ์ ‘ ์‹ค์ œ ๊ธฐ์ƒ ๊ฒฉ์ž ๋งคํ•‘ ๋กœ์ปฌ์˜ NetCDF ๊ฒฉ์ž๋ง ํŒŒ์ผ(`sfc_grid_latlon.nc`)์„ ๋ถ„์„ํ•˜์—ฌ ํƒ€๊ฒŸ ์œ„ยท๊ฒฝ๋„์™€ ๋งคํ•‘๋˜๋Š” ๊ธฐ์ƒ์ฒญ ๊ฒฉ์ž์˜ ์ธ๋ฑ์Šค(`ny`, `nx`) ๋ฐ ์ธ์ ‘ 3x3 ๊ฒฉ์ž์  ์ขŒํ‘œ๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ```bash python verify_grid.py ``` - **์ถœ๋ ฅ ๊ฒฐ๊ณผ**: ์ตœ์ธ์ ‘ ๊ฒฉ์ž ์ขŒํ‘œ๊ฐ€ `exact_grid_points.txt`๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ### Step 2. ๊ฒฉ์ž ์‹œ๊ฐํ™” ๊ฒ€์ฆ ๊ฒฉ์ž๋ง ๊ณต๊ฐ„์„ ๊ฐ€์‹œํ™”ํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฉ์ž์ ์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ”Œ๋กฏ์„ ์ƒ์„ฑํ•ด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ```bash python visualize_grid.py ``` - **์ถœ๋ ฅ ๊ฒฐ๊ณผ**: `grid_points_visualization.png` ์ƒ์„ฑ (์ค‘์•™ ์ขŒํ‘œ ๋นจ๊ฐ„์ƒ‰ ๋งคํ•‘) ### Step 3. 5๋ถ„ ์—ฐ์† ๋ฐ์ดํ„ฐ ๊ณ ์† ์ถ”์ถœ ์Šค๋ ˆ๋“œ ํ’€ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด 4์›” 1์ผ๋ถ€ํ„ฐ 5์›” 7์ผ๊นŒ์ง€์˜ ๊ธฐ์ƒ ์—ฐ์† ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ```bash python extract_continuous_data_fast.py ``` - **์ถœ๋ ฅ ๊ฒฐ๊ณผ**: ๋Œ€์šฉ๋Ÿ‰ ํ†ตํ•ฉ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ ํŒŒ์ผ `weather_data_continuous_20260401_20260507.csv` ์ƒ์„ฑ ### Step 4. ๋ฐ”๋žŒ ๋ฒกํ„ฐ ์ •ํ•ฉ์„ฑ ๋ถ„์„ ๋ฐ ์˜ค์ฐจ ๊ทœ๋ช… ์ˆ˜์ง‘๋œ ๊ธฐ์ƒ ์‹ค์ธก ๋ฐ์ดํ„ฐ์˜ ํ’ํ–ฅ/ํ’์† ์ •๋ณด์™€ U/V ์„ฑ๋ถ„ ์ •๋ณด์˜ ๋ฌผ๋ฆฌ์ /์ˆ˜ํ•™์  ์ •ํ•ฉ์„ฑ์„ ์ •๋Ÿ‰ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ```bash # 1. ๊ธฐ๋ณธ์ ์ธ U/V ๋ฒกํ„ฐ ๊ณต์‹ ์—ญ์‚ฐ ๋ฐ ์ฐจ์ด ํ™•์ธ python verify_wind_vectors.py # 2. ์„ฑ๋ถ„๋ณ„ ์ ˆ๋Œ€, ์ƒ๋Œ€์˜ค์ฐจ ๋ฐ ๋ฒกํ„ฐ ์ดํ•ฉ ์˜ค์ฐจ ์ข…ํ•ฉ ๋ถ„์„ python analyze_relative_error.py # 3. U/V ๊ธฐ๋ฐ˜ ํ’์† ์—ญ์‚ฐ ์ •๋ฐ€๋„ ๋ถ„์„ python analyze_ws_error.py ``` - **์ฃผ์š” ๊ฒฐ๋ก **: ํ‰๊ท  ์ ˆ๋Œ€ ์˜ค์ฐจ๊ฐ€ `0.05 m/s` ๋ฏธ๋งŒ์œผ๋กœ ์‚ฐ์ถœ๋˜์–ด, ์†Œ์ˆ˜์  ์ฒ˜๋ฆฌ ๊ณผ์ •์˜ ์ ˆ์‚ฌ ์˜ค์ฐจ๋ฅผ ์ œ์™ธํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ•™์  ์ผ๊ด€์„ฑ์„ ๊ฐ€์ง์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Step 5. ๊ธฐ์ƒ ๋ณ€ํ™” ๋‹ค์ค‘ ์ฐจํŠธ ์‹œ๊ฐํ™” ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์˜จ๋„, ์ด์Šฌ์ , ํ’์† ๋“ฑ์˜ ์‹œ๊ณ„์—ด ์ถ”์ด ๋ถ„์„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. `visible-times.txt`์— ์ •์˜๋œ ํ•ต์‹ฌ ํƒ€๊ฒŸ ์‹œ์ ๋“ค์ด ๋ถ‰์€์ƒ‰ ์ˆ˜์ง ์‹ค์„ ์œผ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ```bash python plot_weather_data.py ``` - **์ถœ๋ ฅ ๊ฒฐ๊ณผ**: `weather_timeseries_plot.png` ์ด๋ฏธ์ง€ ์ƒ์„ฑ --- ## ๐Ÿงฎ ๋ฐ”๋žŒ ๋ฒกํ„ฐ ์—ญ์‚ฐ ๊ณต์‹ (Scientific Formulas) ๊ธฐ์ƒํ•™์  ๋ฐ”๋žŒ ๋ฒกํ„ฐ ๊ตฌ์„ฑ ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, `verify_wind_vectors.py` ๋“ฑ์— ํƒ‘์žฌ๋˜์–ด ์‹ค์ฆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. - **๋ฐ”๋žŒ ๋ฒกํ„ฐ ์„ฑ๋ถ„ ๋ถ„ํ•ด (Decomposition)** ๋ฐ”๋žŒ์ด ๋ถˆ์–ด์˜ค๋Š” ๋ฐฉํ–ฅ(ํ’ํ–ฅ $\theta$)๊ณผ ๊ฐ•๋„(ํ’์† $WS$)๋กœ๋ถ€ํ„ฐ ๋ถˆ์–ด๋‚˜๊ฐ€๋Š” ๋ฒกํ„ฐ $U$(๋™์„œ์„ฑ๋ถ„)์™€ $V$(๋‚จ๋ถ์„ฑ๋ถ„)๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค: $$U = -WS \cdot \sin\left(\frac{\theta \cdot \pi}{180}\right)$$ $$V = -WS \cdot \cos\left(\frac{\theta \cdot \pi}{180}\right)$$ - **๋ฐ”๋žŒ ๋ฒกํ„ฐ ํ•ฉ์„ฑ (Reconstruction)** $$WS_{calc} = \sqrt{U^2 + V^2}$$ - **์˜ค์ฐจ ํ‰๊ฐ€ ์ง€ํ‘œ (Vector Relative Error)** $$Error_{mag} = \sqrt{(U_{calc} - U_{obs})^2 + (V_{calc} - V_{obs})^2}$$ $$Error_{rel} = \frac{Error_{mag}}{WS_{obs}}$$