Skip to content

Gallery

Every image here comes from an example style in the repository, rendered with ezu tile or ezu bbox. The style JSON is the whole recipe — copy it, change a colour, render again.

Ten wave-then-line stroke layers, factored into one user-defined function, plus a water-hatch function for the sea. This is the front-page render.

A pencil-sketch render of central Tokyo
Central Tokyo at z13, three tiles across.
Terminal window
ezu bbox --style crates/ezu/examples/styles/pencil-sketch.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out pencil.png

Style: pencil-sketch.json · Concepts: params and functions

Scatter-dab fills through the hokusai brush engine, anchored in world coordinates so the wash continues across tile edges. Parametric: paper and softness are declared knobs.

A watercolour render of central Tokyo
The same ground in watercolor.json, at its declared defaults.
Terminal window
ezu bbox --style crates/ezu/examples/styles/watercolor.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out water.png
# …or with the knobs turned
ezu tile --style crates/ezu/examples/styles/watercolor.json \
--tile 13/7276/3225 --param 'paper=#ffe0f0' --param softness=2 --out water.png

Style: watercolor.json

Raster-DEM tiles → hillshade + hypsometric tint. All-remote assets, so it renders straight from a URL with no checkout.

Shaded relief of Mount Fuji
Mount Fuji at z11 — hypsometric tint under shaded relief, from DEM tiles alone.
Terminal window
ezu tile --style https://raw.githubusercontent.com/reearth/ezu/main/crates/ezu/examples/styles/hillshade.json \
--tile 11/1813/807 --out fuji.png

Style: hillshade.json · Concepts: sources and assets

Not a vector style at all: GSI aerial photography pulled in as a raster source, saturation pushed up with hsl, then posterize to twelve steps per channel. Four nodes.

A high-contrast posterized render of central Tokyo
Colour and palette ops rather than brushes — the same data, pushed hard.
Terminal window
ezu bbox --style crates/ezu/examples/styles/photo-pop.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out pop.png

Style: photo-pop.json

A plain labelled basemap, written by hand rather than translated. Every label layer lowers to a text-labels node, all three meet in one label-placement, and a text-draw per layer paints the winners — so a city name can knock out the road label underneath it, and the decision is the same from whichever tile you approach it. Roads are stroke pairs whose widths are interpolate expressions, so one recipe covers every zoom.

A labelled reference map of central Tokyo
Central Tokyo at z13. The labels are placed per tile, yet read as one sheet — that is the shared collision index working across borders.
Terminal window
ezu bbox --style crates/ezu/examples/styles/atlas.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out atlas.png

Style: atlas.json · Cookbook: labels and icons · Concepts: padding and neighbours

Two drums and a black pass. Area fills print through a halftone screen — a point-grid of circles used as a blend mask — while linework prints solid, the way it does on a real duplicator. Each drum’s features are transformed a couple of pixels out of register, and a closing quantize snaps the whole sheet onto the ink palette plus its overprints, so nothing survives that the press could not mix.

A two-colour risograph print of central Tokyo
Fluorescent pink over blue on cream stock. The dots are a masked point grid, not a texture image.
Terminal window
ezu bbox --style crates/ezu/examples/styles/risograph.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out riso.png
# coarser screen, fatter dots
ezu tile --style crates/ezu/examples/styles/risograph.json \
--tile 13/7276/3225 --param screen-px=9 --param dot-px=3 --out riso.png

Style: risograph.json · Cookbook: halftone and dither

The same DEM tiles as hillshade, read three ways: contour pulls isolines out of the elevation field as real vector features (stroked twice, thin for the interval and heavy for every fifth index line), hillshade shades the relief, and slope feeds a levelscolor-to-alpha chain that darkens only the cliff faces. The index interval is a param, so interval-m and index-every re-cut the contours without touching the recipe.

A topographic map of the Japanese Northern Alps
The Northern Alps around Kamikōchi at z13 — 100 m contours, 500 m index lines, no vector contour source anywhere.
Terminal window
ezu bbox --style crates/ezu/examples/styles/topo.json \
--bbox 137.60,36.20,137.72,36.28 --zoom 13 --out topo.png
# 200 m contours instead
ezu tile --style crates/ezu/examples/styles/topo.json \
--tile 13/7253/3229 --param interval-m=200 --out topo.png

Style: topo.json · Cookbook: hillshade and hypsometric tint

Analysis rather than cartography: density turns the POI layer into a kernel-density ScalarField, color-ramp colours it through a MapLibre heatmap-color expression (ramp-expr), and the same field goes into contour a second time to draw isolines over the heat — including a single heavier line at the 0.75 level. Kernel radius and isoline interval are params.

A heatmap of points of interest across central Tokyo with isolines
Where the shops are, at z13. Heat and isolines are two readings of one field node.
Terminal window
ezu bbox --style crates/ezu/examples/styles/poi-field.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out field.png
# wider kernel, coarser isolines
ezu tile --style crates/ezu/examples/styles/poi-field.json \
--tile 13/7276/3225 --param radius-px=48 --param step=0.2 --out field.png

Style: poi-field.json · Concepts: ports and types

Geometry ops as the whole design. voronoi-fracture breaks the land, water, and park polygons into panes around seed points — the POI layer where it has points, a point-grid where it does not — and boundary + stroke turns every pane edge into leading. Pane colour comes from a world-anchored worley field mapped through an HCL ramp and clipped to the panes, so neighbouring glass differs without any per-cell attribute to key on.

Central Tokyo rendered as a stained-glass window
Panes seeded from POIs, leading from their boundaries, colour from a noise field.
Terminal window
ezu bbox --style crates/ezu/examples/styles/stained-glass.json \
--bbox 139.72,35.66,139.80,35.72 --zoom 13 --out glass.png

Style: stained-glass.json · Nodes: geometry

Not painterly at all: a Protomaps basemap MapLibre style, converted with ezu translate and rendered by ezu, labels included. This is the render ezu-compare pixel-diffs against maplibre-gl-js.

Terminal window
ezu translate https://api.protomaps.com/styles/v5/light/en.json --out recipe.json
ezu tile --style recipe.json --tile 14/14550/6452 --out basemap.png

Guide: from a MapLibre style

The renders on this page are made from other people’s data, and the licences ask for credit:

  • watercolor, pencil-sketch, photo-pop (vector), atlas, risograph, poi-field, stained-glass, the Protomaps basemapOpenStreetMap via Protomaps, © OpenStreetMap contributors.
  • hillshade, topo — elevation from Re:Earth Terrain (Mapterhorn-merged global DEM blended with EGM2008 geoid undulations): Re:Earth Terrain, Mapterhorn, EGM2008 (NGA).
  • atlas letteringOpen Sans by Steve Matteson, under the SIL Open Font License.
  • photo-pop — aerial imagery from GSI Japan, © 国土地理院.
  • Brushes — CC0, by David Revoy.

ezu tracks this for you at render time: a source inherits attribution from its TileJSON or PMTiles metadata, Document::attributions() returns the merged list, and ezu serve exposes it at GET /style/attribution. Whatever your tiles end up in, render it — see serve tiles.

Map renders on this site are made fromOpenStreetMap data viaProtomaps (© OpenStreetMap contributors), elevation from Re:Earth Terrain,Mapterhorn andEGM2008 (NGA), and aerial imagery from GSI Japan(© 国土地理院). The painterly styles use CC0 brushes byDavid Revoy.