Getting Started with SNAP Toolbox in Python

SentiNel Application Program, more commonly known as SNAP is a highly adaptable open-source software for scientific exploration of earth observation satellite data.

Aditya Sharma
Towards Data Science

--

Photo by USGS on Unsplash

Developed by the European Space Agency (ESA), SNAP is a common software platform that supports the Sentinel missions. It consists of several modules that can be modified and re-used for image processing, modelling and visualization of data from earth observation satellites. SNAP can be utilized not only as a research support tool for Sentinel missions (Sentinel 1, Sentinel 2 and Sentinel 3) but also as a functional outlet for effectively processing large amounts of satellite data, including data from other missions such as Landsat, MODIS and RapidEye in various different formats. The project page of SNAP and the individual toolboxes can be found at http://step.esa.int.

In this article, I want to go through the step-by-step process of configuring your python installation to use the SNAP-Python or “snappy” interface. Doing so will allow you to efficiently analyze large volumes of satellite data by automating image processing tasks using python scripts.

The article will cover the following topics:

  1. Download and install latest SNAP release (v7.0) on Windows,
  2. Configure snappy during and after the SNAP installation process,
  3. Setup a virtual environment,
  4. Configure optimal settings for snappy, and
  5. Visualize satellite data using snappy

Download SNAP Toolbox

SNAP consists of several toolboxes. You can install each toolbox separately or you can install the all-in-one version. In this tutorial, we will install the latter.

SNAP Toolboxes can be downloaded from the link below: https://step.esa.int/main/download/snap-download/

Create Virtual Environment

Before you should install the SNAP software on your system, I would recommend creating a virtual environment either using pip or conda. For this tutorial, we will use conda. To run this command, you need to have Anaconda or Miniconda installed on your system already.

Create a new virtual environment called “snap” with python version 2.7 by executing the command below on your system’s python configured command line tool.

conda create -n snap python=2.7

The reason we are using python version 2.7 is because SNAP software only supports python versions 2.7, 3.3 and 3.4.

NOTE: If you are using pip to create a new environment you will have to install venv package. Find out more on how to create virtual environments using venv here.

SNAP Installation

Next, we can start installing the SNAP software using the downloaded executable file.

You can configure your python installation to use snappy during the SNAP installation itself by checking the tickbox and proving the path to your python directory (as shown below). However, in this tutorial, we will NOT check the tickbox and configure snappy after SNAP has finished installing.

The rest of the installation process is pretty straight forward. The first time you start up SNAP it will do some updates. Once they’ve finished you are all set to use the SNAP software.

Configure Snappy

Once SNAP has finished installing, we want to get the directory location of where our virtual environment “snap” is located. From there, we want the following two paths:

  1. Python executable path for your virtual environment
  2. A folder called “Lib” in your virtual environment directory

Open up the SNAP Command-Line Tool, which is installed as part of the SNAP software and run the following command:

snappy-conf {path_to_snap_env}\python.exe {path_to_snap_env}\Lib\

Change the amount of RAM available

Before we can start using snappy to create a python script, we need to change a few things in order to ensure that the snappy operators will run with highest optimality. The default setup is quite slow if you’re planning to do some image rendering and batch processing operations. This is important if you want to use snappy to automate heavy processing tasks and work with multiple files.

Go over to the {virtural_env “snap ”directory } > Lib > snappy.

Open the snappy configuration file called “snappy.ini”.

Edit the value for the parameter called “java_max_mem” and set it to a value that corresponds to about 70–80% of your system’s RAM.

java_max_mem: 26G

In the same directory, lies a file called “jpyconfig.py”. Change the parameter “jvm_maxmem” like so:

jvm_maxmem = '26G'

Change the TileCache Memory

Next, navigate to where your SNAP software is installed. By default it is set to C:\Program Files\snap. Inside it, you will find the folder called etc containing the SNAP properties file called “snap.properties”. Edit the file and change the parameter called snap.jai.tileCacheSize. Set this to a value equal to 70–80% of the java_max_mem value. The number you enter should be in megabytes. You may have to enable administrator privileges to save the changes to this file.

snap.jai.tileCacheSize = 21504

NOTE: The values shown here are for a system with 32GB RAM. Changes must be made with your system’s RAM in mind.

Start Using Snappy

So for this last section, we want to explore how snappy works and visualize some sample data. Before we can start using snappy, we need some data and in this tutorial, we will use the testing data that comes pre-loaded with snappy installation.

# Import Librariesimport os
import numpy as np
import matplotlib.pyplot as plt
import snappy
from snappy import ProductIO
# Set Path to Input Satellite Data# miniconda users
path = r'C:\Users\{User}\miniconda3\envs\snap\Lib\snappy\testdata'
# anaconda users
path = r'C:\Users\{User}\anaconda3\envs\snap\Lib\snappy\testdata'
filename = 'MER_FRS_L1B_SUBSET.dim'# Read File
df = ProductIO.readProduct(os.path.join(path, filename))
# Get the list of Band Names
list(df.getBandNames())
# Using "radiance_3" band as an example
band = df.getBand('radiance_3') # Assign Band to a variable
w = df.getSceneRasterWidth() # Get Band Width
h = df.getSceneRasterHeight() # Get Band Height
# Create an empty array
band_data = np.zeros(w * h, np.float32)
# Populate array with pixel value
band.readPixels(0, 0, w, h, band_data)
# Reshape
band_data.shape = h, w
# Plot the band
plt.figure(figsize=(18,10))
plt.imshow(band_data, cmap = plt.cm.binary)
plt.show()
Plot for “radiance_3" band

I’ve also made a video showing everything that I’ve laid out in this post. So if there is any confusion concerning how to go about the process of installing and configuring SNAP Toolbox in Python, do check it out.

--

--

Geoscientist and data science enthusiast interested in applied use of remote sensing satellites.