REMOTE SENSING

Python을 이용한 SNAP API 사용법 소개

유병혁 2023. 10. 22. 16:36

안녕하세요? 이번 글은 Python을 이용한 SNAP API 사용법을 소개해 보겠습니다. 이번 글은 'How to use the SNAP API from Python'의 아래 원문 글 내용을 일부 번역, 정리한 것입니다. *SNAP은 Java API를 제공하므로 jpy와 snappy 플러그인에 대한 이해와 활용이 필요합니다.

 

How to use the SNAP API from Python - SNAP - Confluence

This page provides an introduction to use the SNAP Java API from Python. Introduction SNAP implementation language is Java and therefore SNAP's "native" API is a Java API. According to the SNAP architecture, the reference SNAP Java API documentation of the

senbox.atlassian.net

SNAP(SeNtinel Application Platform)은 다양한 원격탐사 데이터의 활용, 확인 및 처리를 용이하기 위해 개발된 실행 도구 및 API(Application Programming Interface)의 모음(참고 글: https://foss4g.tistory.com/1896)입니다. SNAP의 기능은 Sentinel Toolbox를 통해 액세스됩니다.

Introduction(소개)

SNAP 구현 언어는 Java이므로 SNAP의 "네이티브" API는 Java API입니다. SNAP 아키텍처에 따르면, 두 개의 SNAP 하위 시스템인 SNAP EngineSNAP Desktop의 참조 SNAP Java API 문서는 Python에서도 거의 완벽하게 적용됩니다.

 

Python에서 SNAP Java API를 사용하는 것은 가능하며 원칙적으로 이를 달성하는 두 가지 방법이 있습니다:

  1. 표준 Python(CPython, 씨파이썬) 설치 사용
  2. Jython(자이썬) 접근 방식 사용 (SNAP 8 이후 버전부터 Jython을 지원하지 않음.)

권장되는 표준 Python(CPython) 접근 방식을 사용하면, Python 프로그램/스크립트에서 SNAP 코드를 호출하고 Python으로 작성된 플러그인으로 SNAP를 확장할 수 있습니다.

 

SNAP의 표준 Python 접근 방식 확장은 현재 래스터 데이터 프로세서(운영자) 플러그인으로 제한되며 컴퓨터에 설치된 표준 Python(CPython) 인터프리터를 사용해야 합니다(SNAP에는 CPython 인터프리터가 포함되어 있지 않습니다). 지원되는 버전은 Python 2.7, 3.3~3.10 64비트(Linux + Darwin), 32비트 및 64비트(Windows), Anaconda 배포판입니다.

 

Windows 사용자는 SNAP 설치가 32비트인 경우 32비트 Python을 사용해야 하고, SNAP 설치가 64비트인 경우 64비트 Python을 사용해야 합니다.

The esa_snappy Plugin(esa_snappy 플러그인)

SNAP 10 이상 버전부터는 Python에서 SNAP Java API에 액세스할 수 있는 외부 플러그인으로 'esa_snappy'가 제공됩니다. SNAP 9 이하 버전에서는 'snappy'가 제공됩니다.

Access, Installation and Configuration(액세스, 설치 및 구성)

SNAP용 Python 액세스, 설치 및 구성 방법에 대한 지침은 최신 SNAP 10의 경우 새로운 SNAP-Python(esa_snappy) 인터페이스(SNAP 버전 10+)를 사용하도록 Python 구성을 참조하거나 이전 SNAP 버전의 경우 SNAP-Python(snappy) 인터페이스(SNAP 버전 <= 9)를 사용하도록 Python 구성을 참조합니다.

 

(SNAP 9.0.0을 기준으로) Python 3.5 또는 3.6을 사용하는 것이 좋습니다. 더 높은 Python 버전의 경우 jpy를 수동으로 빌드해야 합니다. jpy는 Python 프로그램에 Java 코드를 삽입하거나 그 반대로 사용할 수 있는 양방향 Python-Java 브리지(bi-directional Python-Java bridge)입니다.

 

SNAP-Python(snappy, 스내피) 인터페이스 사용을 위해 Python 설치를 구성하는 가장 쉬운 방법은 SNAP 설치 과정에서 설정하는 것입니다. 설치 프로그램 내에서 체크박스를 활성화하고 Python 실행 파일의 경로를 선택하기만 하면 됩니다.

Python 실행 파일의 경로는 다음 명령어로 확인하실 수 있습니다.

import sys
sys.executable
'C:\\Users\\bhyu\\AppData\\Local\\Programs\\Python\\Python36\\python.exe'

그러나 설치 과정에서 간과했거나 snappy용 다른 Python 설치를 구성하려는 경우 나중에 수동 설정하는 것도 큰 문제는 아닙니다. Windows에서는 시작 메뉴에서 'SNAP Command-Line(SNAP 명령줄)'을 선택한 후 아래와 같이 입력하면 됩니다.

snappy-conf <python-exe>
snappy-conf C:\\Users\\bhyu\\AppData\\Local\\Programs\\Python\\Python36\\python.exe

그러면 현재 SNAP 설치용으로 구성된 Python 모듈 snappy와 Python 인터프리터가 사용자 홈 디렉터리의 .snap/snap-python 디렉터리에 생성됩니다. 이 때 Python 경로는 SNAP와 함께 사용하려는 Python 인터프리터 실행 파일의 '전체 경로'여야 합니다(지원되는 버전은 2.7, 3.3~3.6). snappy 모듈을 다른 곳에 배치하려면 다음 구성을 사용하시면 됩니다.

snappy-conf <python-exe> <snappy-dir>

이제 Python 실행 파일의 경로를 사용하여 도구를 호출할 수 있으며 선택적으로 snappy 폴더를 생성해야 하는 디렉터리를 지정할 수 있습니다. 아래 결과를 보면 구성이 성공한 것입니다.

완료되면 명령이 중단될 수 있으며 프롬프트로 돌아가지 않습니다. 이 경우 CTRL + C를 누르고 아니오('n')를 입력하시면 됩니다. 아래와 같이 snappy 예제 코드를 실행해 보겠습니다.

from snappy import ProductIO
import numpy as np
import matplotlib.pyplot as plt
p = ProductIO.readProduct('snappy/testdata/MER_FRS_L1B_SUBSET.dim')
rad13 = p.getBand('radiance_13')
w = rad13.getRasterWidth()
h = rad13.getRasterHeight()
rad13_data = np.zeros(w * h, np.float32)
rad13.readPixels(0, 0, w, h, rad13_data)
p.dispose()
rad13_data.shape = h, w
imgplot = plt.imshow(rad13_data)
imgplot.write_png('radiance_13.png')

이 접근 방식은 현재 작업 디렉터리가 snappy 디렉터리인 경우에만 유효합니다.

cd <snappy-dir>
cd C:\Users\bhyu\.snap\snap-python
python

Configure Python (Python 구성)

Python에서 SNAP Python API를 효과적으로 사용하려면 Python 인터프리터에서 snappy 모듈을 감지할 수 있어야 합니다. 이를 달성하는 방법에는 여러 가지가 있습니다. Snappy를 영구적으로 액세스할 수 있도록 하려면 Python에서 Snappy를 설치하면 됩니다. 명령줄(셸, Unix의 경우 터미널 창, Windows의 경우 cmd)에 다음과 같이 입력합니다.

cd C:\Users\bhyu\.snap\snap-python\snappy
python setup.py install

Change the Memory Settings (메모리 설정 변경)

snappy 디렉터리에는 snappy.ini라는 파일이 있습니다. 여기에서 snappy가 사용할 수 있는 메모리 양을 변경할 수 있습니다. 아래는 snappy가 11GB의 RAM을 사용할 수 있음을 의미합니다. 권장 값은 시스템에서 사용 가능한 RAM의 70%-80%입니다.