Reading and Plotting VIIRS Imagery with Python

Introduction to VIIRS Data:

The Visible Infrared Imaging Radiometer Suite (VIIRS) is an advanced sensor system designed to collect high-quality imagery and radiometric data of the Earth’s surface and atmosphere. Developed by the National Oceanic and Atmospheric Administration (NOAA) and the National Aeronautics and Space Administration (NASA), VIIRS plays a crucial role in remote sensing and monitoring various environmental parameters.

The Significance of VIIRS in Remote Sensing:

VIIRS is a key instrument onboard two important satellite missions: the Joint Polar Satellite System 1 (JPSS1) and the Suomi National Polar-orbiting Partnership (NPP). These satellites are part of the next generation of polar-orbiting environmental satellites, tasked with providing critical data for weather forecasting, environmental monitoring, and climate research.

Importance of VIIRS/JPSS1 and VIIRS/NPP Datasets:

The VIIRS/JPSS1 and VIIRS/NPP datasets offer valuable information through their high-resolution imagery and radiance measurements across various spectral bands. Some of the key aspects that make these datasets important include:

A. Global Coverage:

VIIRS provides global coverage, capturing data from pole to pole in both day and night. This comprehensive coverage enables a better understanding of global weather patterns, environmental changes, and natural disasters.

B. High Spatial Resolution:

The VIIRS/JPSS1 and VIIRS/NPP datasets offer imagery at an impressive resolution of 375 meters, enabling detailed observations of land, ocean, and atmospheric features. This high spatial resolution is essential for monitoring changes in land use, vegetation, and coastal environments.

C. Multispectral Observations:

VIIRS is equipped with multiple spectral bands, covering a wide range of wavelengths from visible to infrared. This multispectral capability enables the study of various atmospheric and surface properties, including cloud cover, sea surface temperature, vegetation health, and urban heat islands.

D. Nighttime Observations:

One of the remarkable features of VIIRS is its ability to capture data during nighttime. This capability is especially useful for monitoring city lights, auroras, and other nocturnal phenomena.

E. Applications in Weather Forecasting and Environmental Monitoring:

The VIIRS data plays a crucial role in improving weather forecasting models, as it provides essential information on cloud cover, sea surface temperature, and atmospheric parameters. Additionally, the data aids in monitoring natural disasters such as wildfires, volcanic eruptions, and hurricanes.

F. Climate Research and Change Detection:

VIIRS data is instrumental in studying long-term climate trends and detecting changes in land cover, sea ice extent, and vegetation patterns. This information contributes to our understanding of climate change and its impacts on the Earth’s ecosystems.

In summary, the VIIRS/JPSS1 and VIIRS/NPP datasets are invaluable resources for researchers, meteorologists, and environmentalists alike, as they offer a comprehensive view of the Earth’s surface and atmosphere, aiding in weather forecasting, environmental monitoring, and climate research efforts worldwide.

Data Access and Download

Accessing the VIIRS/JPSS1 and VIIRS/NPP datasets requires obtaining the data from official sources that provide satellite data products. The United States Geological Survey (USGS) Earth Explorer and the National Centers for Environmental Information (NCEI) are common platforms that offer access to these datasets.

USGS Earth Explorer:

The USGS Earth Explorer is a user-friendly online platform that allows users to search, preview, and download various Earth observation data, including VIIRS/JPSS1 and VIIRS/NPP datasets. Here’s a step-by-step guide to accessing and downloading the data:

a. Visit the USGS Earth Explorer website: https://earthexplorer.usgs.gov/

b. Create an account (if you don’t have one) and log in.

c. Define your search area using the interactive map or by entering coordinates or place names.

d. Select the date range for the data you want to download.

e. In the “Datasets” tab, expand the “Landsat Archive” section.

f. Choose “VIIRS” as the dataset and select the appropriate sensor (JPSS1 or NPP).

g. Under “Data Type,” select “Level-1B” to access the 6-Min L1B Swath 375m NRT data.

h. Click on “Results” to view the available data scenes.

i. Click on a specific scene to see a preview and verify that it meets your requirements.

j. Add the scene to the cart, and once you have selected all the scenes you need, proceed to the “Download” page.

k. Choose the format and options for downloading (e.g., GeoTIFF) and start the download.

National Centers for Environmental Information (NCEI):

NCEI provides access to various environmental data, including VIIRS/JPSS1 and VIIRS/NPP datasets. Here’s how to access and download the data from NCEI:

a. Go to the NCEI website: https://www.ncei.noaa.gov/

b. Navigate to the “Data Access” or “Data Search” section.

c. Search for VIIRS datasets and specify the VIIRS sensor (JPSS1 or NPP).

d. Choose the “Level-1B” data type for the 6-Min L1B Swath 375m NRT data.

e. Define your search parameters, such as date range and geographical region.

f. Submit the search and review the available datasets.

g. Select the data files you need and proceed to the download options.

h. Choose the desired file format (e.g., HDF, GeoTIFF) and initiate the download.

Please note that both platforms may require registration or authentication before accessing the data. Additionally, data availability and access procedures may be subject to change, so it’s essential to refer to the specific websites for the most up-to-date information.

Keep in mind that VIIRS data files can be quite large, so ensure you have sufficient storage space and a stable internet connection for downloading the datasets.

Required Python Libraries

When working with VIIRS HDF files, you’ll need the pyhdf library to read the data from the HDF format. Additionally, for data manipulation and visualization, some other common Python libraries come in handy:

1. pyhdf:

pyhdf is a Python interface to the HDF4 file format. It allows you to read data from HDF files and access datasets and attributes easily.

2. NumPy:

NumPy is a fundamental package for scientific computing in Python. It provides support for large, multi-dimensional arrays and matrices, along with a collection of mathematical functions to operate on these arrays.

3. pandas:

While not specifically required for reading HDF files, pandas is a powerful library for data manipulation and analysis. It offers data structures like DataFrames that are highly efficient for handling structured data, which can be useful for organizing and processing VIIRS datasets.

4. matplotlib:

matplotlib is a popular plotting library in Python. It provides a wide range of functions for creating 2D plots and visualizations, making it essential for plotting the VIIRS data in various formats.

5. cartopy (optional):

cartopy is a library for cartographic projections and geospatial data visualization. If you plan to overlay geospatial information (e.g., coastlines, borders) on your VIIRS imagery, cartopy is a helpful library.

6. seaborn (optional):

seaborn is a higher-level data visualization library that works well with pandas DataFrames. It provides attractive statistical graphics and additional customization options for plots.

7. xarray (optional):

xarray is a library for working with labeled multi-dimensional arrays, which is particularly useful for geospatial data. If you need more advanced data manipulation capabilities, xarray can be a great addition to your toolkit.

8. h5py (alternative to pyhdf, optional):

h5py is another library for working with HDF files, specifically the newer HDF5 format. While pyhdf is suitable for reading VIIRS HDF4 files, if you encounter HDF5 files in other contexts, h5py might be the preferred choice.

Ensure that you have installed these libraries using pip before starting your Python script. You can install them using the following commands:

Python
pip install pyhdf
pip install numpy pandas matplotlib cartopy seaborn xarray h5py

By using these libraries, you’ll have the necessary tools for reading, manipulating, and visualizing VIIRS data in Python effectively.

Understanding HDF Data Format

HDF (Hierarchical Data Format) is a versatile and widely-used file format for storing and organizing large and complex datasets. HDF files are particularly popular in the field of remote sensing and scientific data storage due to their ability to accommodate multidimensional arrays, metadata, and hierarchical structures.

1. HDF4 File Format in VIIRS Data:

VIIRS data is typically stored in HDF4 format, specifically HDF-EOS (Earth Observing System) format, which is an extension of the HDF4 standard. HDF-EOS is designed to support data collected by NASA’s Earth Observing System instruments, including VIIRS.

The HDF-EOS format allows VIIRS data to be organized efficiently, combining both scientific data and metadata within a single file. This format enables easy access to different datasets and their attributes, making it suitable for working with large-scale Earth observation data.

2. Structure of HDF Files and Dataset Organization:

HDF files are structured in a hierarchical manner, containing datasets, attributes, and groups. Understanding this structure is essential when accessing specific datasets within the file.

A. Datasets:

Datasets are the primary components of HDF files and store the actual data. In the context of VIIRS data, datasets contain the imagery, radiometric data, or other measurements collected by the sensor.

B. Attributes:

Attributes are metadata associated with datasets, providing additional information about the data. These attributes may include units of measurement, calibration coefficients, time of acquisition, and more. They play a crucial role in interpreting and processing the data.

C. Groups:

Groups are containers used to organize datasets and attributes hierarchically. They allow for logical grouping of related data and attributes, making the HDF file more organized and manageable.

D. HDF File Structure for VIIRS Data:

VIIRS HDF files typically contain multiple datasets, each representing different bands or channels of the sensor’s observations. For example, there may be separate datasets for visible light, infrared, and other spectral bands.

These datasets are often organized within groups, with each group representing a specific type of data or product. For instance, one group may contain raw radiance measurements, while another may hold georeferenced imagery.

Additionally, attributes provide essential information about the datasets, such as the scaling factors, offset values, and geospatial coordinates, which are necessary for correctly interpreting and visualizing the data.

E. Accessing Data from HDF Files:

To work with VIIRS data in Python, you’ll need to read specific datasets and attributes using libraries like pyhdf. It allows you to navigate the hierarchical structure of the HDF file and extract the required data for further processing and visualization.

Understanding the hierarchical structure of HDF files and the organization of datasets and attributes is crucial for effectively working with VIIRS data. This knowledge enables users to access the relevant information for their analysis and visualization tasks while leveraging the benefits of the HDF format for efficient data storage and retrieval.

Reading Data from HDF Files

To read data from VIIRS HDF files using the pyhdf library in Python, follow these steps:

Step 1: Install pyhdf Before starting, ensure you have installed the pyhdf library. You can install it using pip:

Python
pip install pyhdf

Step 2: Import the necessary modules

Python
import numpy as np
from pyhdf.SD import SD

Step 3: Open the HDF file Use the SD class from pyhdf.SD to open the HDF file:

Python
file_path = 'path/to/your/VIIRS_HDF_file.hdf'
hdf = SD(file_path, SDC.READ)

Step 4: Explore the available datasets and attributes To understand the structure of the HDF file and locate the datasets and attributes, you can print the list of SDS (Scientific Data Sets) and attributes:

Python
datasets = hdf.datasets()
print("Available datasets:")
for dataset_name in datasets.keys():
    print(dataset_name)

attributes = hdf.attributes()
print("\nAvailable attributes:")
for attr_name in attributes.keys():
    print(attr_name)

Step 5: Read the data from a specific dataset Once you identify the dataset you want to read, use the select method to access it:

Python
dataset_name = 'name_of_the_dataset_to_read'
data = hdf.select(dataset_name)

Step 6: Extract the data Use the [:] indexing to extract the data from the dataset:

Python
data_array = data[:]

Now, data_array will contain the data from the selected dataset as a NumPy array. You can now work with this array as needed for analysis and visualization.

Step 7: Accessing Attributes (Optional) If the dataset has attributes associated with it, you can access them using the attributes property:

Python
attributes = data.attributes()

You can then extract specific attributes from the dataset, such as calibration coefficients or units, as required for data interpretation.

Step 8: Close the HDF file After you’ve finished reading the data, it’s essential to close the HDF file:

Python
hdf.end()

Example: Reading VIIRS Imagery Data Here’s an example of how to read VIIRS imagery data, assuming you have an HDF file containing VIIRS imagery:

Python
import numpy as np
from pyhdf.SD import SD

# Step 1: Open the HDF file
file_path = 'path/to/your/VIIRS_HDF_file.hdf'
hdf = SD(file_path, SDC.READ)

# Step 2: Print available datasets and attributes
datasets = hdf.datasets()
print("Available datasets:")
for dataset_name in datasets.keys():
    print(dataset_name)

attributes = hdf.attributes()
print("\nAvailable attributes:")
for attr_name in attributes.keys():
    print(attr_name)

# Step 3: Read the data from a specific dataset
dataset_name = 'name_of_the_dataset_to_read'
data = hdf.select(dataset_name)

# Step 4: Extract the data
data_array = data[:]

# Step 5: Close the HDF file
hdf.end()

Remember to replace 'name_of_the_dataset_to_read' with the actual name of the dataset you want to read from the HDF file. Additionally, ensure that the HDF file path is correct for your system.

With this guide, you can access and extract specific datasets from VIIRS HDF files using the pyhdf library in Python.

Data Preprocessing and Exploration

Data preprocessing is a crucial step before visualizing VIIRS data. Preprocessing tasks include reshaping the data if necessary and handling missing or invalid values to ensure accurate and meaningful visualizations.

1. Reshaping Data (if needed): Depending on the data’s original structure, you might need to reshape it to match the desired visualization format. For example, if the VIIRS imagery data is stored as a one-dimensional array, you’ll need to reshape it into a two-dimensional array corresponding to the image dimensions (e.g., width and height).

Python
# Assuming data_array is a one-dimensional array representing VIIRS imagery
width, height = 375, 375  # Replace with the actual dimensions of the imagery
reshaped_data = data_array.reshape(width, height)

2. Handling Missing Values: VIIRS data may contain missing or invalid values, represented as NaN (Not-a-Number) or other special values. Before plotting, it’s essential to handle these missing values appropriately. You can replace them with a predefined value or apply interpolation techniques.

Python
import numpy as np

# Assuming data_array contains the VIIRS data
# Replace NaN values with a predefined fill value, e.g., 0
data_array[np.isnan(data_array)] = 0

3. Basic Data Exploration Techniques: Before creating visualizations, exploring the data through statistical summaries provides valuable insights into its characteristics and potential anomalies.

Python
# Assuming data_array contains the preprocessed VIIRS data

# Basic statistical summaries
min_value = np.min(data_array)
max_value = np.max(data_array)
mean_value = np.mean(data_array)
median_value = np.median(data_array)
std_deviation = np.std(data_array)

print("Statistical Summaries:")
print(f"Minimum Value: {min_value}")
print(f"Maximum Value: {max_value}")
print(f"Mean Value: {mean_value}")
print(f"Median Value: {median_value}")
print(f"Standard Deviation: {std_deviation}")

# Histogram
import matplotlib.pyplot as plt

plt.hist(data_array.flatten(), bins=50, color='blue', alpha=0.7)
plt.xlabel("Pixel Values")
plt.ylabel("Frequency")
plt.title("Histogram of VIIRS Data")
plt.show()

# Displaying a sample of the VIIRS data
import random

sample_indices = random.sample(range(data_array.size), 1000)
sample_values = data_array.flatten()[sample_indices]

plt.scatter(sample_indices, sample_values, color='green', alpha=0.7)
plt.xlabel("Pixel Index")
plt.ylabel("Pixel Value")
plt.title("Sample of VIIRS Data")
plt.show()

The statistical summaries (minimum, maximum, mean, median, and standard deviation) provide an overview of the data’s distribution and its variability. The histogram visualizes the frequency distribution of pixel values, offering insights into the data’s overall characteristics, such as intensity ranges and data concentration. The scatter plot displays a sample of pixel values, helping to identify any patterns or outliers.

By preprocessing and exploring the data, you can ensure that the VIIRS data is ready for visualization, and you gain valuable insights into the data’s characteristics, which can guide you in creating meaningful visualizations for analysis and interpretation.

Plotting VIIRS Imagery

To plot VIIRS imagery data using Matplotlib, we’ll use the imshow function to display the data as images. Additionally, we’ll choose suitable colormaps to enhance the visualization and add color bars to indicate the data values.

Python
import numpy as np
import matplotlib.pyplot as plt
from pyhdf.SD import SD

def read_viirs_data(file_path):
    hdf = SD(file_path, SDC.READ)
    data = hdf.select('Data-Field-Name')  # Replace 'Data-Field-Name' with the actual dataset name you want to read
    return data[:]

# Assuming you have preprocessed VIIRS data as 'viirs_data' (e.g., from Step 5 in the previous section)
# If not, you can use the read_viirs_data function to read the data from the HDF file.

# Step 1: Plot VIIRS Imagery
plt.figure(figsize=(8, 8))
plt.imshow(viirs_data, cmap='viridis')  # You can choose a suitable colormap, e.g., 'viridis', 'plasma', 'inferno', 'jet', etc.
plt.title("VIIRS Imagery")
plt.colorbar(label="Pixel Value")
plt.show()

In the code snippet above, replace 'Data-Field-Name' with the actual name of the dataset you want to plot. Also, ensure that you have the viirs_data variable containing the preprocessed VIIRS data.

Choosing Suitable Colormaps:

Colormaps are essential for visualizing the data and conveying information effectively. Choosing the right colormap depends on the characteristics of your data and the information you want to highlight.

  • Sequential Colormaps: These colormaps are suitable for data with a continuous range, such as grayscale images. Examples include 'viridis', 'plasma', 'inferno', and 'cividis', which are perceptually uniform and suitable for representing ordered data.
  • Diverging Colormaps: These colormaps are useful for data with a distinct midpoint or critical value. They show data deviations from a mean or reference point. Examples include 'coolwarm', 'RdBu_r', 'seismic', and 'bwr'.
  • Qualitative Colormaps: These colormaps are appropriate for categorical data or unordered discrete data points. Examples include 'tab10', 'Set1', 'Pastel1', and 'Dark2'.
  • Custom Colormaps: You can create custom colormaps using matplotlib.colors.LinearSegmentedColormap to represent specific data characteristics effectively.

Adding Color Bars:

The color bar provides a scale for interpreting the colors in the plot. It shows the mapping between data values and colors used in the colormap.

  • The colorbar() function generates a color bar corresponding to the colors used in the plot.
  • The label parameter of colorbar() allows you to add a label to the color bar indicating the unit of the data or other relevant information.
Python
# Example with a custom colormap
cmap = plt.cm.get_cmap('viridis')  # Replace 'viridis' with the desired colormap
plt.imshow(viirs_data, cmap=cmap)
plt.title("VIIRS Imagery with Custom Colormap")
cbar = plt.colorbar(label="Pixel Value")  # Add a label to the color bar
plt.show()

Experiment with different colormaps to find the one that best represents the characteristics of your VIIRS data, and use color bars to provide meaningful interpretations of the plotted imagery.

Share The Tutorial With Your Friends
Twiter
Facebook
LinkedIn
Email
WhatsApp
Skype
Reddit

Check Our Ebook for This Online Course

Advanced topics are covered in this ebook with many practical examples.