← Ocean Routing

🗺️ Chart Tiling API

One tiling service behind the HoweNav web map. It serves several chart layers as XYZ tiles — some rendered here (CM93, BSB), some proxied & cached from official government chart services (NOAA, CHS ENC, Kartverket Norway, Traficom Finland) and EMODnet bathymetry, plus external base/overlay layers (OSM, CHS NONNA). Pick a layer tab for its capabilities and endpoint; Log and Admin cover traffic and operations.

XYZ tiles Web Mercator (EPSG:3857) on-demand + disk-cached zoom 2–16

Defaults to /tiles on this origin (no CORS / mixed-content). Only use the separate tiles domain if its scheme matches this page.

BSB / KAP raster charts

Scanned raster nautical charts (NOAA / Nobeltec / OpenCPN .KAP) decoded here with a pure-Python reader (RLE + palette, validated pixel-perfect against GDAL) and reprojected from their native georeference to Web-Mercator on the fly.

Type
Raster (rendered here from uploaded charts)
Format
256×256 PNG, transparent outside coverage
Zoom
3 – 16
Source
Your uploaded BSB/KAP sets
Caching
Rendered on demand, then disk-cached
GET/tiles/bsb/{z}/{x}/{y}.png
Raster tile from the uploaded BSB/KAP charts. Use directly as a Leaflet / MapLibre tile layer.
GET/tiles/bsb/coverage.json
Indexed charts: {count, errors, charts:[{name,num,scale,width,height,bbox}]}.

Upload BSB / KAP sets

Drop several archives — they queue, stream to the server, unzip into /charts-bsb, and accumulate (Inside Coast.zip, North Coast.zip, …).

🌊
Drag & drop your BSB .zip chart sets here
or click to choose · multiple files OK · streams & unzips into /charts-bsb

Uploaded BSB sets

Loading…

CHS — Canadian Hydrographic Service 2 layer types

Two independent Canadian chart layers. ENC charts are proxied & cached through this server; NONNA depths load directly from the CHS GeoServer in the browser (not proxied here, so they don't appear in this server's Log / Admin metrics).

① CHS ENC charts proxied here

Official Electronic Navigational Charts, rendered with S-52 symbology by the CHS MaritimeChartService and proxied by this server: each tile is turned into an EPSG:3857 export request, then disk-cached so the shared government service is hit at most once per tile.

Type
Vector ENC rendered to raster by CHS, proxied + cached here
Format
256×256 PNG, transparent
Zoom
5 – 16
Source
CHS ENC_MaritimeChartService (egisp.dfo-mpo.gc.ca)
Licence
Open Government Licence – Canada
Attribution
Contains information licensed under the Open Government Licence – Canada. Not for navigation.
GET/tiles/enc/ca/{z}/{x}/{y}.png
Official CHS ENC chart tile (S-52). Rendered upstream, proxied & disk-cached here.

② CHS NONNA-10 depths direct to source

High-resolution bathymetry (NONNA-10), served straight from the CHS GeoServer WMTS to the browser (the GeoServer sends no CORS headers for canvas reads, so the map loads it with crossOrigin disabled). Non-navigational reference.

Type
Raster bathymetry (external WMTS, not proxied here)
Zoom
6 – 16
Source
nonna-geoserver.data.chs-shc.ca · gridset EPSG:900913
Attribution
Bathymetry © Canadian Hydrographic Service (NONNA) — non-navigational
GEThttps://nonna-geoserver.data.chs-shc.ca/geoserver/gwc/service/wmts?…&LAYER=nonna:NONNA 10&TILEMATRIXSET=EPSG:900913
Loaded by the web map directly (bypasses this tiling server).
Not for navigation. Both CHS layers are reference only — carry official CHS charts for navigation.

NOAA ENC charts

Official U.S. Electronic Navigational Charts rendered with traditional paper-chart symbology by NOAA's MaritimeChartService, proxied by this server the same way as CHS ENC: tile → EPSG:3857 export → disk cache.

Type
Vector ENC rendered to raster by NOAA, proxied + cached here
Format
256×256 PNG, transparent
Zoom
5 – 16
Source
NOAA NOAAChartDisplay MaritimeChartService (gis.charttools.noaa.gov)
Licence
U.S. public domain (CC0-1.0)
Attribution
Chart data: NOAA Office of Coast Survey (public domain). Not for navigation.
GET/tiles/enc/us/{z}/{x}/{y}.png
Official NOAA ENC chart tile (paper-chart style). Rendered upstream, proxied & disk-cached here.
Not for navigation. NOAA's display/GIS services do not meet USCG chart-carriage requirements.

Europe — Norway, Finland, EMODnet 3 sources

Official Nordic chart services plus Europe-wide bathymetry, proxied & disk-cached by this server exactly like the CHS / NOAA ENC layers: each XYZ tile is fetched upstream at most once. Charts cover Norway (incl. Svalbard) and Finland (coast + lakes); depths cover every European sea — Baltic, North Sea, Atlantic, Mediterranean, Black Sea.

① Kartverket charts — Norway proxied here

The Norwegian Hydrographic Service's complete raster chart portfolio (overview, coastal, main and harbour charts, plus Svalbard) from Kartverket's Web-Mercator WMTS cache, passed through tile-for-tile.

Type
Raster charts (official WMTS, proxied + cached here)
Format
256×256 PNG, transparent outside coverage
Zoom
5 – 16 (upstream 0 – 18)
Source
cache.kartverket.no · layer sjokartraster · gridset webmercator
Licence
CC BY 4.0
Attribution
Chart data © Kartverket. Not for navigation.
GET/tiles/enc/no/{z}/{x}/{y}.png
Official Norwegian raster chart tile. Proxied & disk-cached here.

② Traficom charts — Finland proxied + reprojected here

Traficom's public nautical chart series. The upstream WMTS is a tile cache in EPSG:3395 World Mercator (no Web-Mercator gridset), so this server fetches the 3395 tiles covering each requested tile at the next-finer level, mosaics them and warps them vertically into EPSG:3857 — the two Mercators share the easting formula, so only northings move. Chart series are stacked by zoom: general 1:250 000 charts zoomed out, coastal + leisure chart series (which also cover the lakes) mid-zoom, harbour charts on top zoomed in.

Type
Raster charts (official WMTS, mosaicked + warped + cached here)
Format
256×256 PNG, transparent outside coverage
Zoom
5 – 16
Source
julkinen.traficom.fi/rasteripalvelu WMTS · gridset EPSG:3395_FTA
Licence
CC BY 4.0 (open data; the view service is not for navigation)
Attribution
Chart data © Traficom. Not for navigation.
GET/tiles/enc/fi/{z}/{x}/{y}.png
Official Finnish chart tile, reprojected from World Mercator. Proxied & disk-cached here.

③ EMODnet Bathymetry — Europe proxied here

The EMODnet Digital Terrain Model (≈115 m grid) rendered as colour-graded depth, water only (land is transparent so it overlays OSM). Covers all European seas including the Mediterranean and the Baltic. Non-navigational reference.

Type
Raster bathymetry (WMTS, proxied + cached here)
Zoom
3 – 15
Source
tiles.emodnet-bathymetry.eu · latest/mean_multicolour · gridset web_mercator
Licence
Free to use with attribution
Attribution
Bathymetry © EMODnet Bathymetry Consortium — non-navigational
GET/tiles/enc/emodnet/{z}/{x}/{y}.png
EMODnet depth tile for European waters. Proxied & disk-cached here.
Not for navigation. All three are reference layers — carry official charts for navigation.

CM93 charts

C-MAP's proprietary, obfuscated vector format — no GDAL/QGIS driver exists. This service decodes it directly (ported from OpenCPN's GPL cm93.cpp): de-obfuscation, header, vector edges, soundings and feature records → WGS84 geometry, classified via CM93OBJ.DIC → S-57. Renders land, coastline, depth contours/areas, soundings, navaids and hazards.

Type
Vector, decoded & rendered here (raster + GeoJSON)
Format
PNG (raster) · GeoJSON FeatureCollection (vector)
Zoom
2 – 16
Source
Your uploaded CM93 library
Caching
Raster on-demand; vector precomputed + on-demand
GET/tiles/raster/{z}/{x}/{y}.png
256×256 PNG XYZ tile, transparent background. Rendered on demand and cached.
GET/tiles/vector/{z}/{x}/{y}.geojson
FeatureCollection of chart features intersecting the tile (properties: kind, scale, name). Precomputed where available, else on-demand.
GET/tiles/coverage.json
CM93 library summary: total cells, count per scale, cell size (degrees) per scale.

Upload CM93 library

Drop your CM93 zip (e.g. CM93 2012.zip, ~1.24 GB). It streams to the server, unzips into /charts, and re-indexes.

⬆️
Drag & drop your CM93 .zip here
or click to choose · streams & unzips into /charts

Needs a writable /charts volume and free disk for the zip + ~1.6 GB extracted.

Uploaded files

Loading…

Decode status. Not yet parsed: attribute values (depth labels, light characteristics) and depth-graduated water shading.

OpenStreetMap base

The default base layer under every chart preset. Standard OSM raster tiles, loaded by the web map directly from the OSM tile CDN — not proxied through this server, so OSM traffic does not appear in the Log / Admin metrics.

Type
Raster base map (external, direct to source)
Zoom
0 – 19
Source
tile.openstreetmap.org
Attribution
© OpenStreetMap contributors
GEThttps://tile.openstreetmap.org/{z}/{x}/{y}.png
Loaded by the web map directly. Respect the OSM tile usage policy.

Tile access log

Recent tile requests served by this server (proxied layers only: CM93 raster/vector, BSB, NOAA/CHS ENC, Norway/Finland charts, EMODnet). Direct-to-source layers (OSM, CHS NONNA) are not logged here.

—

—

Metrics

Request volume over trailing windows, for tiles served by this server. Cached = served straight from disk. Uncached = a cache miss that had to render (CM93/BSB) or fetch from the original source (NOAA/CHS ENC).

24 hours
—
cached —uncached —
7 days
—
cached —uncached —
30 days
—
cached —uncached —
365 days
—
cached —uncached —

Precompute an area

Render & cache every tile for a bounding box across a zoom range, so the map is instant later (and, for ENC layers, so the shared government service is warmed politely once). Pre-filled for Victoria (SW) → Squamish (N) → Granite Falls, Indian Arm (E).

—

Operations reference

POST/tiles/cache/clear?kind=raster,vector,bsb
Delete cached tiles so they re-render / re-fetch. Token-guarded if UPLOAD_TOKEN is set.
GET/tiles/metrics
Windowed request counts (24h / 7d / 30d / 365d) split cached / uncached. Bucketed by UTC calendar day.
GET/tiles/health
Liveness → {"ok":true,"root_exists":true,…}.
Path parameters & performance notes
ParamTypeRangeMeaning
zint2 – 16zoom level
xint0 … 2z−1tile column (west→east)
yint0 … 2z−1tile row (north→south, XYZ origin top-left)

CM93/BSB rendering is CPU-bound (numpy + Pillow under the GIL): warm the cache with Precompute, and scale worker processes (WORKERS) rather than threads. ENC tiles are network-bound on the government service, so the disk cache is what keeps this service a polite consumer — precompute an area once rather than hammering it live.