✔ Python/3. Image Processing

GK2A LSM(Land/Sea Mask) 데이터 이해와 활용 방법 (2/2)

  • -
주제: 천리안위성 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)
 

GK2A LSM(Land/Sea Mask) 데이터 이해와 활용 방법 (1/2)

주제: 천리안위성 2A호 Land Mask / Sea Mask 데이터 이해하기 작성: 2024-01-14 안녕하세요, 루카스입니다. 이번 포스팅에서는 대한민국 기상위성인 천리안위성 2A호(GEO-KOMPSAT-2A, 이하 GK2A)과 관련하여 LSM(

wscode.tistory.com


이전 포스팅에 이어, 이번 포스팅에서는 직접 코드를 구현해 보도록 하겠습니다.

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)
  1. 데이터 파일 열기:
    • open(file_path, 'rb'): 지정된 경로에 있는 바이너리 파일을 읽기 모드로 엽니다.
  2. 데이터 읽기 및 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()
  1. 데이터 시각화:
    • plt.contourf은 등고선 그래프 및 같은 값의 데이터의 분포를 시각적으로 표출할 때 유용한 방식입니다
    • colors을 통해서 육지와 바다의 색을 임의로 설정할 수 있습니다.
      특정 원하는 HTML 색상이 있는 경우, 해당 값으로 색상을 기입하여 변경할 수 있습니다.

 

3. 전체 소스코드

GK2A 랜드마스크 시각화

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
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.