Installing & Updating to GDAL 3.11.0 on Ubuntu: A Ground Up Rewrite
How GDAL 3.11 Finally Fixed the Thing That's Been Broken for 27 Years and how to install this on a Ubuntu system with a single script
I've been wrestling with GDAL for over a decade. Like most people working with geospatial data, I've developed a complicated relationship with this absolutely essential, completely indispensable, and utterly maddening piece of software.
GDAL or the Geospatial Data Abstraction Library is everywhere. It's the invisible engine powering Google Earth, Earth Engine, your Uber Maps, your car's GPS, the weather app on your phone, and virtually every piece of mapping software you've ever used. From desktop GIS applications like QGIS to commercial giants like ArcGIS, from NASA's satellite data processing pipelines to the routing algorithms that get your DoorDash delivered on time, GDAL is the unsung hero moving mountains of geospatial data behind the scenes.
But if you've ever had to actually use GDAL directly, you know the pain. This write up highlights some of the amazing improvements made in GDAL 3.11 , gives you a new one liner to build from source and install and more so read on. Here’s something useful start your week
"Burn the Village to the Ground"
The 2024 GDAL User Survey captured something beautiful in its raw honesty. When asked what could make GDAL easier to use, one frustrated user responded
"OMG the command line options on the tools. Burn the village to the ground and build again".
You can watch the entire video with these discussions and improvements here and read the stable documentation here
That wasn't just venting it was a battle cry that reached the core development team. And in May 2025, with the release of GDAL 3.11 "Eganville," they did exactly that.
After 27 years of accumulated technical debt, inconsistent naming conventions, and commands that felt like they were designed by committee (because they were), the GDAL team has delivered what might be the most significant user experience overhaul in open-source software history.
A Tale of Two APIs (and Seventeen Different Syntaxes)
Let me paint you a picture of the old GDAL experience. You wanted to convert a GeoTIFF to a cloud-optimized format? You'd type:
gdal_translate -of COG input.tif output.tif
Reproject it to a different coordinate system? Different command entirely:
gdalwarp input.tif output.tif -t_srs EPSG:4326
Working with vector data? Welcome to a parallel universe with completely different naming:
ogr2ogr output.gpkg input.shp
As of 2024, GDAL has 26 years of existence, and throughout the years, various utilities have been added by diverse contributors, leading to inconsistent naming of utilities (underscore or not?), options and input/output parameter. Some commands had underscores (gdal_translate
), others didn't (gdalwarp
). Input and output file order was inconsistent. Option flags were a grab bag of single letters, abbreviations, and random acronyms.
The greatest number of respondents reported using GDAL from Python, with a roughly 50/50 split between the GDAL Python bindings and higher-level packages such as shapely, rasterio, and geopandas. After Python, the greatest number of respondents reported using the command line interface. That's millions of people, daily, navigating this maze of inconsistency.
Installation the Old Way
But before you could even get to the command-line pain, you had to install GDAL. And if you've ever tried to install GDAL on Ubuntu, you know this was its own special circle of hell.
I will say I have used this tutorial as the saving grace and a it was amazing for when it was written and last updated about 5 years ago. Also thank you to my wonderful friend Sara Safavi who has been involved in adventures like this for a while
The old way looked deceptively simple:
sudo add-apt-repository ppa:ubuntugis/ppa
sudo apt-get update
sudo apt-get install gdal-bin libgdal-dev
Not to mention once you have followed the sequence you are praying to your Geospatial Gods about dependency conflicts, version mismatches, and the dreaded "unmet dependencies" errors. Want Python bindings? Better hope the pip version exactly matches your system version, or you're in for hours of environment variable juggling
export CPLUS_INCLUDE_PATH=/usr/include/gdal
export C_INCLUDE_PATH=/usr/include/gdal
pip install GDAL==$(gdal-config --version)
I've seen senior engineers people who deploy compute clusters on Supercomputers fighting unwieldy issues trying to get GDAL working consistently across different Linux versions.
The New One-Line Build & Install
Since I was aware of the complexities of getting this to work on a Ubuntu environments and since the Personal Packaging Archive (PPA) from the UbuntuGIS team was a few versions behind I knew it would mean building GDAL from source. So I created a simple shell script, you can see the contents of the script here. This installation script builds the latest version from source with a single command:
curl -sL "https://url.geocarpentry.org/gdal-ubuntu" | bash
To showcase this I created a fresh VM on GCP and ran the test
The script dynamically fetches the newest release, installs all build dependencies.
The script compiles from source with optimal settings, and handles all the system integration including dependencies.
The Git-Style Revolution
GDAL 3.11 changes everything with a single, unified command structure inspired by Git, Docker, and modern CLI design. The new CLI, driven by sub-commands of the 'gdal' main program, is more convenient, consistent, predictable, and capable. It provides a GDAL spin on CLI concepts from rasterio, git, and others.
Instead of memorizing dozens of separate utilities, you now have one entry point with intuitive subcommands:
# Old way
gdalinfo my.tif
gdal_translate -of COG in.nc out.tif
gdal_translate -projwin 2 50 3 49 in.tif out.tif
# New way
gdal raster info --format=text my.tif
gdal raster convert --of=COG in.nc out.tif
gdal raster clip --bbox=2,49,3,50 in.tif out.tif
Every command follows the same pattern: gdal <family> <operation>
. Input files first, output files last. No more guessing whether it's -t_srs
or --target-srs
or -a_srs
—everything is consistent.
Even better, the new CLI has typo detection. Type gdal raster convret
and it responds with "Do you mean 'convert'?"
Python, Python Revolution
The GDAL 3.11 modernization isn't just command-line deep. It introduces gdal.Run()
, a Python API that mirrors the new CLI structure:
from osgeo import gdal
# Clean, readable programmatic access
gdal.Run("raster", "convert",
input="input.tif",
output="output.tif",
output_format="COG",
overwrite=True)
No more subprocess calls or wrestling with low-level GDAL objects for simple operations. The Python API and CLI are now perfectly aligned—what you can do in one, you can do in the other.
Real-World Impact
This isn't just about syntax sugar. The new CLI enables workflows that were previously painful or impossible. Pipeline operations let you chain multiple processes in memory:
gdal raster pipeline \
read /vsis3/sentinel-cogs/data.tif ! \
reproject --dst-crs EPSG:3857 ! \
write local_output.tif --of COG --overwrite
This single command reads satellite data directly from AWS S3, reprojects it, and writes a cloud-optimized GeoTIFF locally all in one streaming operation without temporary files.
For organizations processing terabytes of geospatial data, this kind of efficiency improvement translates to real cost savings and dramatically simplified deployment scripts.
Looking Forward
For those who are simply getting started this might just save you a few minutes , provide you with a little more peace of mind. Whatever it might be I thought it was worth sharing with the community knowing I use this tool every single day of my life. Hope you the new installer instructions can benefit you too. Find the stable docs here
For the millions of us who work with geospatial data daily whether we're tracking climate change, optimizing supply chains, or just trying to convert a shapefile without losing our minds GDAL 3.11 represents a genuine quality of life upgrade. The tools we depend on are finally catching up to mental maps of ease.
Great writeup! Excited about the new GDAL CLI.
OMG - finally! Thank you, Frank & crew!