Of course! This is a very common task in geospatial programming with GDAL. The concept of an "if/else if" structure is fundamental to writing logic that handles different types of raster or vector data.

Let's break this down. I'll cover:
- The Core Concept: How
if/elif/elsetranslates to GDAL workflows. - Common Scenarios: Real-world examples where you need this logic.
- Code Examples: Practical Python scripts for each scenario.
The Core Concept: if/elif/else in GDAL
In GDAL, you often use if/elif/else to make decisions based on:
- Data Type: Is the raster an integer (e.g.,
GDT_Bytefor land cover) or a floating-point (e.g.,GDT_Float32for elevation)? - Metadata: Does the raster have a specific key in its metadata dictionary (e.g., to identify a product or processing level)?
- Raster Band Count: Does the image have 1 band (grayscale), 3 bands (RGB), or more (e.g., multispectral)?
- Driver: What format is the file (GeoTIFF, NetCDF, HDF5)? This can dictate how you open or process it.
- Attribute Values: In a vector layer, you might loop through features and use
if/elifto apply different styling or processing based on an attribute field.
The general structure looks like this:
import os
from osgeo import gdal, ogr
# --- Example: Checking Raster Data Type ---
# Get a raster band object
# raster_band = ...
# Check the data type using the GDAL constant
if raster_band.DataType == gdal.GDT_Byte:
print("Processing as 8-bit unsigned integer.")
# Do something specific for byte data
elif raster_band.DataType == gdal.GDT_UInt16:
print("Processing as 16-bit unsigned integer.")
# Do something specific for 16-bit unsigned data
elif raster_band.DataType == gdal.GDT_Float32:
print("Processing as 32-bit floating point.")
# Do something specific for float data
else:
print(f"Unsupported data type: {raster_band.DataType}")
# Handle an unexpected data type
# --- Example: Checking Vector Attribute Values ---
# Get a vector layer object
# vector_layer = ...
# Loop through features
for feature in vector_layer:
# Get an attribute value
land_type = feature.GetField("LAND_USE_TYPE")
if land_type == "FOREST":
# Style the feature green
print("Feature is a forest.")
elif land_type == "WATER":
# Style the feature blue
print("Feature is water.")
elif land_type == "URBAN":
# Style the feature gray
print("Feature is urban.")
else:
# Default style
print(f"Feature has unknown land type: {land_type}")
Common Scenarios & Code Examples
Here are some practical examples you'll encounter frequently.

Scenario 1: Processing Rasters Based on Data Type
A common task is to reproject or resample a raster. The nodata value you set might depend on the input's data type.
Goal: Open a raster, determine its data type, and print a human-readable name for it.
import os
from osgeo import gdal
# --- Setup: Create a sample GeoTIFF for demonstration ---
# You can skip this part if you have your own file.
def create_sample_raster(filename, data_type):
driver = gdal.GetDriverByName('GTiff')
width, height = 100, 100
num_bands = 1
# Create the dataset
ds = driver.Create(filename, width, height, num_bands, data_type)
# Set a geotransform and projection
ds.SetGeoTransform([0, 1, 0, 0, 0, -1])
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) # WGS84
ds.SetProjection(srs.ExportToWkt())
# Fill with a simple value
band = ds.GetRasterBand(1)
band.WriteArray([[i for i in range(width)] for j in range(height)])
# Set nodata value based on type
if data_type == gdal.GDT_Byte:
band.SetNoDataValue(255)
elif data_type in [gdal.GDT_UInt16, gdal.GDT_Int16]:
band.SetNoDataValue(-9999)
elif data_type in [gdal.GDT_Float32, gdal.GDT_Float64]:
band.SetNoDataValue(-9999.0)
ds.FlushCache()
ds = None # Close the file
print(f"Created sample file: {filename}")
# Create different files to test
create_sample_raster('sample_byte.tif', gdal.GDT_Byte)
create_sample_raster('sample_float.tif', gdal.GDT_Float32)
# -----------------------------------------------
# --- Main Logic: The if/elif/else structure ---
def analyze_raster(filepath):
"""Opens a raster and identifies its data type."""
try:
ds = gdal.Open(filepath)
if ds is None:
print(f"Could not open {filepath}")
return
band = ds.GetRasterBand(1)
data_type_code = band.DataType
# The core if/elif/else block
if data_type_code == gdal.GDT_Byte:
print(f"File: {filepath} -> Data Type: Byte (8-bit unsigned integer)")
elif data_type_code == gdal.GDT_UInt16:
print(f"File: {filepath} -> Data Type: UInt16 (16-bit unsigned integer)")
elif data_type_code == gdal.GDT_Int16:
print(f"File: {filepath} -> Data Type: Int16 (16-bit signed integer)")
elif data_type_code == gdal.GDT_Float32:
print(f"File: {filepath} -> Data Type: Float32 (32-bit floating point)")
elif data_type_code == gdal.GDT_Float64:
print(f"File: {filepath} -> Data Type: Float64 (64-bit floating point)")
else:
print(f"File: {filepath} -> Data Type: Unknown (Code: {data_type_code})")
ds = None # Close the file
except Exception as e:
print(f"An error occurred with {filepath}: {e}")
# Test the function
print("--- Analyzing Sample Rasters ---")
analyze_raster('sample_byte.tif')
analyze_raster('sample_float.tif')
# Clean up created files
os.remove('sample_byte.tif')
os.remove('sample_float.tif')
Scenario 2: Applying Logic Based on Raster Metadata
Metadata is key for understanding what a raster represents. For example, a climate model output might have a variable attribute in its global metadata.
Goal: Check the metadata to see if the raster represents 'temperature' or 'precipitation' and apply a corresponding processing step.

import os
from osgeo import gdal
# --- Setup: Create sample files with different metadata ---
def create_metadata_raster(filename, variable_name, units):
driver = gdal.GetDriverByName('GTiff')
ds = driver.Create(filename, 100, 100, 1, gdal.GDT_Float32)
band = ds.GetRasterBand(1)
band.SetNoDataValue(-9999.0)
# Set the crucial metadata
ds.SetMetadataItem('variable', variable_name)
ds.SetMetadataItem('units', units)
ds.FlushCache()
ds = None
print(f"Created {filename} with variable='{variable_name}'")
create_metadata_raster('temp.tif', 'temperature', 'celsius')
create_metadata_raster('precip.tif', 'precipitation', 'mm/day')
# ---------------------------------------------------------
# --- Main Logic: The if/elif/else structure ---
def process_climate_data(filepath):
"""Opens a climate raster and processes it based on its variable metadata."""
try:
ds = gdal.Open(filepath)
if ds is None:
print(f"Could not open {filepath}")
return
# Get metadata as a dictionary
metadata = ds.GetMetadata()
variable = metadata.get('variable') # Use .get() for safety (returns None if key doesn't exist)
if variable == 'temperature':
print(f"Processing {filepath} as temperature data.")
# Example: Apply a temperature conversion (e.g., Kelvin to Celsius)
# This is just a placeholder for real logic
print(" -> Applying temperature-specific scaling...")
elif variable == 'precipitation':
print(f"Processing {filepath} as precipitation data.")
# Example: Apply a log transform or set negative values to 0
print(" -> Applying precipitation-specific cleaning...")
elif variable is None:
print(f"File: {filepath} has no 'variable' metadata. Cannot process.")
else:
print(f"File: {filepath} contains an unknown variable: '{variable}'. Skipping.")
ds = None
except Exception as e:
print(f" 