Skip to main content

The CLI

tile57 (built to zig-out/bin/tile57 by zig build) is the offline command-line tool over the engine: it bakes charts, serves and inspects tiles, renders finished views, and emits the portrayal assets. The S-101 Portrayal Catalogue — rules and assets — is embedded in the binary, so no command needs an on-disk catalogue; --rules <dir> (portrayal) or a positional catalogue path (the asset commands) overrides the embedded copy.

Usage lines keep S-57's own word for a chart: a cell. <cell.000> is one chart's base file (its sequential .001, .002 … updates are discovered automatically); ENC_ROOT is a whole catalogue directory.

Bake and serve

bake

tile57 bake <cell.000 | ENC_ROOT> -o <out-dir> [--rules DIR] [-j N]

Produces the live-composite structure every other output is served from: each chart bakes at its native band scale to its own <out>/tiles/<STEM>.pmtiles (M_COVR coverage embedded in the archive metadata), and the ownership partition is written to <out>/partition.tpart. There is no merged archive — a runtime compositor serves any tile on demand — and re-runs are incremental: an archive already newer than its whole input (.000 + update chain) is skipped.

-j/--workers sets the bake thread count (default min(cores/2, 8)). Each worker holds a whole cell's parse + portray + raster working set, so this is a memory bound rather than a core count.

The ownership partition (partition.tpart) is written alongside the archives and is an internal detail — it is discovered, reused, and regenerated automatically whenever a compositor opens the structure. Nothing consumes it by hand.

compose-tile

tile57 compose-tile <tiles-dir> <z> <x> <y> [--load-partition FILE] [-o out] [--bench N]

Serves ONE composed tile on demand from a live-composite structure — the runtime compositor as a command. --load-partition reuses the baked partition.tpart instead of rebuilding the partition; --bench N times an N×N block of tiles around (x, y).

Render

png / pdf

tile57 png|pdf <cell.000 | bundle.pmtiles> <z> <x> <y> -o <out> [--size N]
tile57 png|pdf <cell.000 | bundle.pmtiles> --view <lon,lat,zoom> --size WxH -o <out>

Render one tile, or a view (any centre, fractional zoom, any pixel size), through the native S-52 pixel path: PNG raster or deterministic vector PDF with real text objects. An S-57 chart renders with the S-101 rules evaluated live; a baked .pmtiles bundle renders by tile replay. --palette day|dusk|night picks the colour scheme, --dq overlays data quality, --scale F multiplies physical symbol size, and the mariner settings flags (--safety, --feet, --no-names, …) are shown in The Rendering Engine.

ascii

tile57 ascii <cell.000 | bundle.pmtiles> --view <lon,lat,zoom> [--size COLSxROWS] [--ansi] [--tui] [--kitty]

The chart in your terminal as a Unicode grid (default size: the terminal). --ansi adds xterm-256 colour, --tui opens an interactive pan/zoom loop, and --kitty paints real S-52 pixels inline on kitty-graphics terminals (Ghostty, Kitty).

Portrayal assets and style

Each of these takes an optional positional catalogue directory; without one it uses the catalogue embedded in the binary.

assets

tile57 assets [portrayal-catalog-dir] -o <out-dir>

Emits every portrayal asset a renderer needs: colortables.json (S-52 token → Day/Dusk/Night hex), linestyles.json, the sprite atlas (sprite.json + sprite.png), and the area-fill pattern atlas (patterns.json + patterns.png).

style

tile57 style [portrayal-catalog-dir] --scheme day|dusk|night -o <out.json>

Emits one concrete MapLibre style.json, with colours resolved from the catalogue (or --colortables FILE). --source-tiles / --pmtiles-url pick the tile source, --sprite / --glyphs enable the symbol and text layers, and --minzoom / --maxzoom bound the source.

sprite / pattern / sprite-mln

tile57 sprite|pattern|sprite-mln [portrayal-catalog-dir] -o <out-dir>

The focused atlas emitters: sprite writes the S-101 symbol atlas, pattern the area-fill pattern atlas, and sprite-mln the MapLibre sprite sheet (every symbol packed into one PNG, each atlas cell centered on its symbol's pivot, plus the JSON index).

Inspect

explore

tile57 explore <cell.000 | ENC_ROOT --view LON,LAT,ZOOM> [--class ACR[,ACR..]] [--object FOID|RCID|INDEX]

The portrayal microscope: dumps, per feature, the raw S-57 (class + attributes), the S-101 portrayal instruction stream (raw and parsed), and the resolved Surface draw calls. Takes a single chart, or an ENC_ROOT with --view LON,LAT,ZOOM (or a …/#v=LON,LAT,ZOOM share URL) to pull just the charts under that viewport. --zoom N picks the resolving tile, --json emits machine-readable output, --no-resolve skips the draw-call pass, and --tui opens a two-pane explorer (--kitty adds inline render thumbnails and a live chart map that frames the selection).

cells / cell / features / catalog

tile57 cells <cell.000 | ENC_ROOT>
tile57 cell <file.000>
tile57 features <cell.000 | ENC_ROOT> <ACR[,ACR...]>
tile57 catalog <CATALOG.031>

The raw S-57 readers (the CLI face of the tile57_enc_* C calls). cells prints per-chart metadata for a chart or a whole catalogue — name, scale, edition, update, issue date, agency, bbox. cell summarises one chart. features extracts the named object classes (e.g. DEPARE,DRGARE) as a GeoJSON FeatureCollection. catalog decodes an exchange-set catalogue into its entries (file, title, bbox).

s101

tile57 s101 <file.000> [--features N]

Inspects a native S-101 (S-100 Part 10a) chart: confirms detection, prints the coordinate factors and record counts, the in-band code-table sizes, a feature-class histogram, and the assembled geometry summary. It then runs the portrayal rules and reports how many features drew, were empty, or errored. Use --features N to also dump the first N features with their attributes. Charts are auto-detected everywhere — png, bake, and the C API read a native S-101 .000 transparently — so this command is for inspection, not a separate load path.

inspect / tiledump

tile57 inspect <file.pmtiles> [z x y]
tile57 tiledump <tile.mlt | tile.mvt> [--geom CLASS [--coords]]

inspect summarises a baked archive — zoom range and tile counts — and, given z x y, one stored tile (-o dumps its raw decompressed bytes). tiledump decodes one raw tile and summarises it: per-layer feature counts by geometry type plus value histograms of the portrayal properties (class, symbol_name, ls). --geom CLASS switches to per-feature geometry detail for one class (--coords lists the coordinates) — for hunting degenerate geometry.

objlcount

tile57 objlcount <file.000> <objl> [prim]

Counts features of one S-57 object-class code (optionally one geometric primitive) — a corpus-scan helper for finding charts that exercise a class.

version / help

tile57 version prints the engine version; tile57 help prints the usage summary. A few extra subcommands (partdbg-png, zoomsizes, audit-holes, audit-pairs) are engine-development diagnostics and may change without notice.