Dealing with GDAL and Mapnik

Getting GDAL and Mapnik to play nice is a complete pain. Now that I've managed it, I'll give you the solution and explain some of the background.

Mapnik has two plugins for reading image files and using them as background in maps. For OpenCycleMap I currently use the "raster" plugin which reads the files directly, and I need to calculate and supply mapnik with all the coordinates for each image. It's a bit tedious, but when we set up OpenCycleMap a few years ago it was the only way we could get things to work.

Time moves on, and for new projects (and the massive forthcoming OpenCycleMap upgrade) I'm using the "gdal" plugin. This uses the wonderful (but sometimes infuriating) GDAL libraries to read the images and use any geo-information that's embedded within them. Saves a lot of hassle, and when you're dealing with tens of thousands of raster images then things like .vrt files are a godsend.

However, gdal has a secret lurking deep within its sourcecode, and it's all to do with libtiff. libtiff is the library for reading .tif files, which are normally limited to 4Gb in size. There's a new version of libtiff that deals with giant tiff files that are greater than 4Gb (known as BigTIFF). The version of libtiff that comes with Ubuntu doesn't have BigTIFF support, so the GDAL packages use their own internal copy of the library. With version 0.8.0 of gdal, a feature was added to throw an error if multiple versions of gdal were found active at the same time (in 0.8.1 this was downgraded to a warning). But for most applications using gdal there's no big problem - they use the gdal libraries, and hence use the BigTIFF version of libtiff. Meanwhile the standard libtiff (which loads of other things need - trust me, don't try uninstalling it) is left out of the picture and usused.

The problem is if your application - say, mapnik - compiles against both the system libtiff and gdal-with-BigTiff. If you're using gdal before 0.8.0 then you might get silent corruption of the output, if you're using 0.8.0 the mapnik will keep crashing with "ERROR 1: WARNING ! libtiff version mismatch : You're linking against libtiff 3.X but GDAL has been compiled against libtiff >= 4.0.0"

The trick to this is to avoid using any ubuntu packages of gdal - whether from the ubuntugis PPA repositories or anywhere else - until someone somewhere sorts it all out (probably in some future Ubuntu libtiff will have BigTiff support built-in). In the meantime, grab yourself gdal from source (0.8.0 is fine, btw) and configure it with

./configure --with-libtiff=/usr/lib

This forces gdal to use the system libtiff, and prevents any corruptions or segfaults in applications (like mapnik, which you'll need to recompile too). It means you don't get BigTiff support, but hey-ho. But most importantly, you can stop spending all your life juggling gdal versions trying to find which particular combination of packages and PPAs work (hint: none of them do). Thanks to Dane for the final clue - I've spent days of my life repeatedly battling this!

This post was posted on 9 August 2011 and tagged General