World-wide CartoCSS port of Stamen's classic terrain style.
The original Terrain style only covered the United States. As part of a new Knight Foundation grant, we expanded Terrain to cover the entire world. The Knight grant also funded prototyping for some totally-different new terrain styles, so to avoid confusion we are calling the this reboot of the old style "Terrain Classic."
Most of the current development process for Terrain Classic is based on the toner-carto repo.
- PostGIS @2.2.0
- Node.js --version 0.10*
- TileMill 1@
master(this includes the latest Mapnik): github.com/mapbox/tilemill
- Imposm 3, which includes dependencies of its own:
*NOTE: The Node Version Manager script is helpful if you are using a more recent version of Node than 0.10 (which is fairly likely). This is important as TileMill 1@master will only run on Node --version 0.10.
On OS X, installation with Homebrew looks like this:
brew install postgis gdal node go leveldb protobuf pv # follow instructions to start postgresql mkdir -p /tmp/imposm cd /tmp/imposm export GOPATH=`pwd` git clone https://github.com/omniscale/imposm3 src/imposm3 go get imposm3 go install imposm3 # bin/imposm3 is your new binary; either add $GOPATH/bin to your PATH or copy # it to /usr/local/bin (or similar)
Terrain Classic Itself
- Clone this repo
make linkto sym-link the project into your TileMill project directory
make db/sharedto fetch and transform Natural Earth and OSM coastline data
make db/CA(or similar; see
Makefilefor a list of registered extracts and expand it as desired).
maketo generate the
project.mmlfile. (Alternatively, make
terrain-classic-labelsto work on the variant styles)
- Start TileMill by running
npm startfrom the TileMill repo
- Open http://localhost:20009/#/project/terrain-classic
make db/<place> will write to the database specified in
.env (with a format that resembles
terrain is the database name). If you experience trouble connecting, try adding credentials, e.g.
postgres://user:password@localhost/terrain (it will use
$USER with no password otherwise). Barring that, check your
pg_hba.conf to ensure that access is configured correctly.
(We primarily develop on OS X where PostgreSQL from Homebrew works out of the box.)
NOTE: Changes to project settings (i.e.
.mml files not
.mss stylesheets) in TileMill will not persist the changes. To make changes, edit the relevant
.yml file and re-run
make [variant] to re-generate the
project.mml that TileMill reads.
To test the terrain style with a hillshade overlay, a
tessera.json config is provided. Install tessera with
npm install tessera and then run
npm start in the terrain-classic directory. Open http://localhost:8080/ to view the
terrain-classic style composited with Open Terrain hillshades.
Testing with the side-by-side viewer (experimental)
In the root folder run
npm install && npm start which will start tessera running at http://localhost:8080
Then, in the
side-by-side folder, run a simple webserver such as
python -m SimpleHTTPServer. Then go to http://localhost:8000 (or whatever port the webserver is running at) to view the side-by-side viewer.
What's the deal with the
Makefile? Why is it so complicated?
Magic, mostly. It probably can (and should) be simplified! Consider this another, in-progress "make for data" approach (which actually uses
The goal here is to provide an idempotent process for bootstrapping the project that uses as few additional dependencies as possible.
make is the age-old solution to this problem, although it takes a more file-focused approach. Put another way, it attempts to efficiently encapsulate otherwise complicated and error-prone operations.
Makefile here attempts to replicate
make's behavior relative to rebuilding files with database tables. In other words, if a Postgres relation already exists, it will be left as-is. If it doesn't exist (has been dropped or hasn't been created), it will be created on-demand.
Why do I have to install
libpq (which underlies PostgreSQL's command-line tools) supports a number of environment variables which can be used to avoid repetition (and avoid errors). However, each component of the connection information is separate, and is more easily and concisely encoded in a URI (i.e.
pgexplode is aware of
libpq's environment variables and will expand
DATABASE_URLs components (which is simpler than managing multiple values and constructing a URL for
imposm3 and other tools).