Building tilesets with tilemill

Still in my search for the perfect map for my N900, I started growing envious in Google's relief mode. I have to confess that I am a map junkie (I've been amazed with them since ever) and, for me, mountains are an importantant part of city life's background, if not the center of certain activities like trekking, skiing or climbing. So having a map application like marble feeded with maps I designed with high contrast and hill shading is good, but not enough, but it seemed that, short of abusing gmaps' tiles, there was no option for now.

Then a few days ago I crossed an article in InfoWorld that talks about alternatives, and I got hooked with the first one, TileMill, particularily because of its page on working with terrain data. So I'll try to explore it in this post, or at least install it.

First things first, download the code and the dependencies:

build-essential
libwebkit-dev
libmapnik
libmapnik-dev
mapnik-utils
nodejs
nodejs-dev
npm

libmapnik does not exist in Debian sid, but installing libmapnik-dev takes care of it. In my case, a machine that barely has build-essential, we're talking about 100+MiB in packages. It also needs libsigc++-dev, which is not listed as a dep.

Then after the compilation finished (I had to do an ugly sudo ln -s /usr/lib/i386-linux-gnu/sigc++-2.0/include/sigc++config.h /usr/include/sigc++-2.0/ trick to make the compiler find that file) I got this:

$ ./index.js

module.js:337
    throw new Error("Cannot find module '" + request + "'");
          ^
Error: Cannot find module '../build/Release/node_sqlite3.node'
    at Function._resolveFilename (module.js:337:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:359:17)
    at require (module.js:375:17)
    at Object.<anonymous> (/home/mdione/src/projects/tilemill/node_modules/sqlite3/lib/sqlite3.js:1:104)
    at Module._compile (module.js:446:26)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:32)
    at Function._load (module.js:311:12)
at Module.require (module.js:359:17

I'm gonna say in my defense that I know nothing about node.js, so I can't really say, but when a module I just installed, and one with so many users as I think the sqlite3 one must have, doesn't work because of some path problem, I think it smells fishy.

Debian to the rescue. I simply:

$ rm -rf node_modules/sqlite3/
$ sudo apt-get install node-sqlite3

And it runs without a hitch:

$ ./index.js
[tilemill] Creating configuration dir /home/mdione/.tilemill
[tilemill] Creating files dir /home/mdione/Documents/MapBox
[tilemill] Creating export dir /home/mdione/Documents/MapBox/export
[tilemill] Creating project dir /home/mdione/Documents/MapBox/project
[tilemill] Started [Server Tile:20008].
[tilemill] Creating cache dir /home/mdione/Documents/MapBox/cache
[tilemill] Plugin [editor] loaded.
[tilemill] Plugin [carto] loaded.
[tilemill] Plugin [templates] loaded.
[tilemill] Plugin [fonts] loaded.
[tilemill] Started [Server Core:20009].
[tilemill] Client window created (pass --server=true to disable this)
[tilemill] Checking for new version of TileMill...
[tilemill] npm http GET https://registry.npmjs.org/tilemill
[tilemill] npm
[tilemill]  http 200 https://registry.npmjs.org/tilemill
[tilemill] Latest version of TileMill is 0.9.1.

Update

When running TileMill and trying to do anything I got this message:

Unknown child node in 'Map': 'Parameters'

As per this post and TileMill's instructions to build from source, and I quote, «If the error has to do with node-mapnik then you likely have a Mapnik version that is too old». So I sat down, did some judo takes to put mapnik from git into very nice Debian packages. I'm not proud about the battle; as all wars it was messy, and not all of it was completely legal. But I can assure you that after installing an unreleased version of it, and rebuilding its binding for node.js (see the "Updating" section at the bottom of the build from source, but rm -rf node_modules/mapnik/ first), it works.

TODO:

  • Resolve more dependencies with Debian packages.
  • Play with it
  • ...
  • Profit!