주제: 천리안위성 2A호 Land Mask / Sea Mask 데이터 적용하기
작성: 2024-01-14
🛰️ GK2A Land/Sea Mask 데이터
1. 2024.01.14 - [✔ Python/3. Image Processing] - GK2A LSM(Land/Sea Mask) 데이터 이해와 활용 방법 (1/2)
2. 2024.01.14 - [✔ Python/3. Image Processing] - GK2A LSM(Land/Sea Mask) 데이터 이해와 활용 방법 (2/2)
이전 포스팅에 이어, 이번 포스팅에서는 직접 코드를 구현해 보도록 하겠습니다.
1. 바이너리 파일 변환
파이썬 라이브러리에는 바이너리 데이터를 해석하기 위한 라이브러리가 있습니다. 바로, struct입니다.
struct는 패킹 및 언패킹 기능을 제공합니다. 일반적으로, python 설치 시, 자동으로 설치됩니다. 하지만, 설치가 되지 않아 import에 오류가 발생하는 경우, pip install struct 명령어를 통해서 쉽게 설치할 수 있습니다.
import struct # 설치가 안되어 있는 경우, pip install struct 로 설치
앞선 포스팅에서 사용한 데이터, 데이터(lsmask_2km.bin)는 2 byte 씩 끊어서 해석해야 한다고 결론이 났습니다.
그럼, 직접 구현해 보겠습니다.
with open(file_path, 'rb') as file:
for y in range(height):
row = []
for x in range(width):
bytes = file.read(2)
if not bytes:
break
value = struct.unpack('h', bytes)[0]
row.append(value)
if not row:
break
data_matrix.append(row)
- 데이터 파일 열기:
- open(file_path, 'rb'): 지정된 경로에 있는 바이너리 파일을 읽기 모드로 엽니다.
- 데이터 읽기 및 NumPy 배열로 변환:
- 루프를 사용하여 바이너리 파일에서 데이터를 읽어와서 struct.unpack 함수를 사용하여 2바이트씩 해석하여 정수 데이터로 변환합니다.
- 각 행마다 데이터를 읽어와 row 리스트에 추가하고, 이러한 행 리스트들을 data_matrix 리스트에 추가합니다.
- 루프가 종료되면 data_matrix를 NumPy 배열로 변환합니다.
2. 바이너리 파일 시각화
위에서 구현한 코드가 잘 구현되었는지 확인하기 위해, 시각화를 진행해 보도록 하겠습니다.
plt.figure(figsize=(7, 7)) # 그림 크기 설정
contours = plt.contourf(data_matrix, levels=[-1, 0.5, 1.5], colors=['blue', 'green'], extend='both')
plt.colorbar(contours, ticks=[-1, 0, 1], label='Land/Sea Mask')
plt.title('GK2A LSM Data with Contourf')
plt.xlabel('가로 (Width)')
plt.ylabel('세로 (Height)')
plt.show()
- 데이터 시각화:
- plt.contourf은 등고선 그래프 및 같은 값의 데이터의 분포를 시각적으로 표출할 때 유용한 방식입니다
- colors을 통해서 육지와 바다의 색을 임의로 설정할 수 있습니다.
특정 원하는 HTML 색상이 있는 경우, 해당 값으로 색상을 기입하여 변경할 수 있습니다.
3. 전체 소스코드
import struct
import numpy as np
import matplotlib.pyplot as plt
# 데이터 로드
file_path = './data/lsmask/gk2a_LSMask/lsmask_2km.bin'
width, height = 5500, 5500
data_matrix = []
with open(file_path, 'rb') as file:
for y in range(height):
row = []
for x in range(width):
bytes = file.read(2)
if not bytes:
break
value = struct.unpack('h', bytes)[0]
row.append(value)
if not row:
break
data_matrix.append(row)
data_matrix = np.array(data_matrix)
# 데이터 시각화
plt.figure(figsize=(7, 7)) # 그림 크기 설정
contours = plt.contourf(data_matrix, levels=[-1, 0.5, 1.5], colors=['blue', 'green'], extend='both')
plt.colorbar(contours, ticks=[-1, 0, 1], label='Land/Sea Mask') # 컬러바 추가
plt.title('GK2A LSM Data with Contourf')
plt.xlabel('가로 (Width)')
plt.ylabel('세로 (Height)')
plt.show()
주의할 점
이번 포스팅에서 구현한 코드의 시각화 결과를 보면, x축과 y축 값이 우리가 흔히 알고 있는 위경도(WGS84) 형태가 아닙니다.
즉, 추후 위성영상과 맵핑 하고자 할 때, projection(투영법)을 적용하여 위경도로 표출하는 추후 작업이 필요합니다.
728x90
반응형
'Python > 2️⃣ 데이터 처리' 카테고리의 다른 글
GK2A LSM(Land/Sea Mask) 데이터 이해와 활용 방법 (1/2) (14) | 2024.01.14 |
---|---|
파이썬으로 데이터 마스킹하기 - Numpy.ma (1) | 2024.01.10 |
웹크롤링으로 SST(Surface Sea Temperature) 데이터 다운로드 자동화하기 (0) | 2023.07.31 |
[머신러닝] 랜덤포레스트 예시 - Pima Indians Diabetes Database (0) | 2023.03.04 |
[머신러닝] 결정트리 실습 - Pima Indians Diabetes Database (0) | 2023.03.03 |