파이썬 라이브러리에는 바이너리 데이터를 해석하기 위한 라이브러리가 있습니다. 바로, 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(투영법)을 적용하여 위경도로 표출하는 추후 작업이 필요합니다.