Skip to content

Convert NetCDF to GeoTIFF

This script converts monthly grids stored in NetCDF format into individual GeoTIFF rasters. It loops over all NetCDF files in a folder, extracts the primary data variable, enforces CRS (EPSG:4326), sorts months if needed, and exports each monthly slice as a separate GeoTIFF file.


import os
import glob
import rioxarray
import xarray as xr

input_folder = "Monthly Growing Area Grids/2015"
output_folder = "monthly_tifs"
os.makedirs(output_folder, exist_ok=True)

# Get all NetCDF files in the input folder
nc_files = glob.glob(os.path.join(input_folder, "*.nc"))
print(nc_files)


for nc_file in nc_files:
    print(f"Processing: {nc_file}")
    ds = xr.open_dataset(nc_file)

    # Get the primary data variable
    var_name = list(ds.data_vars)[0]
    print("var_name",var_name)
    data = ds[var_name]

    # Enable spatial referencing
    data = data.rio.write_crs("EPSG:4326")

    # Sort months if unordered
    if not all(data['month'][i] <= data['month'][i+1] for i in range(len(data['month']) - 1)):
        data = data.sortby('month')

    for i, month in enumerate(data['month'].values, start=1):
        month_data = data.sel(month=month)

        output_path = os.path.join(
            output_folder,
            f"{os.path.basename(nc_file).replace('.nc', '')}_month_{month:02d}.tif"
        )

        # Flip lat axis if needed (optional, comment out if not required)
        if month_data.latitude[0] < month_data.latitude[-1]:
            month_data = month_data.sel(latitude=slice(None, None, -1))

        # Export to GeoTIFF
        month_data.rio.to_raster(output_path, dtype="float32", nodata=-9999)
        print(f"Saved: {output_path}")

    ds.close()