Maps API — Vector Tile Reference

Complete reference for Township Canada vector tile layers. Available grid layers by province, data layers, tile URL patterns, styling guide, and recommended zoom ranges.

The Maps API serves Canadian survey grids and geographic data as Mapbox Vector Tiles (MVT). This reference covers every available tileset, their source layers, tile URL patterns, recommended zoom ranges, and styling values.

For step-by-step integration examples, see the library-specific guides linked at the bottom of this page.

Tile URL pattern

https://maps.townshipcanada.com/{province}/{layer}/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY

Supported provinces: ab, sk, mb, bc, on

Example — Alberta township boundaries:

https://maps.townshipcanada.com/ab/twp/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY

Example — Saskatchewan sections:

https://maps.townshipcanada.com/sk/sec/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY

Data layers use the same base URL without a province prefix:

https://maps.townshipcanada.com/{data_layer}/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY

Example — oil and gas field boundaries:

https://maps.townshipcanada.com/oil_gas_fields/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY

Grid layers by province

DLS grid — Alberta, Saskatchewan, Manitoba, BC Peace River

The Dominion Land Survey (DLS) system covers Alberta, Saskatchewan, Manitoba, and the Peace River region of British Columbia. Available for provinces: ab, sk, mb, bc.

Replace {prov} with the province code in the source-layer column.

URL layersource-layertext-fieldSource zoomLayer zoom
twp{prov}_twp0–146–12
twp-label{prov}_twp_label{descriptor}0–1410–12
sec{prov}_sec9–1412–14
sec-label{prov}_sec_label{section}9–1412–14
qtr{prov}_qtr9–1412–14
qtr-label{prov}_qtr_label{descriptor}9–1412–14
lsd{prov}_lsd9–1414–20
lsd-label{prov}_lsd_label{lsd}9–1414–20

Example — Alberta township boundaries and labels:

map.addSource("ab_twp", {
  type: "vector",
  tiles: ["https://maps.townshipcanada.com/ab/twp/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY"],
  minzoom: 0,
  maxzoom: 14
});

map.addLayer({
  id: "ab_twp",
  type: "line",
  source: "ab_twp",
  "source-layer": "ab_twp",
  minzoom: 6,
  maxzoom: 12,
  paint: { "line-color": "#2d5a47", "line-width": 1.5 }
});

map.addSource("ab_twp_label", {
  type: "vector",
  tiles: ["https://maps.townshipcanada.com/ab/twp-label/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY"],
  minzoom: 0,
  maxzoom: 14
});

map.addLayer({
  id: "ab_twp_label",
  type: "symbol",
  source: "ab_twp_label",
  "source-layer": "ab_twp_label",
  minzoom: 10,
  maxzoom: 12,
  layout: { "text-field": "{descriptor}", "text-size": 14 },
  paint: { "text-color": "#333", "text-halo-color": "#fff", "text-halo-width": 2 }
});

River Lots — Manitoba

Manitoba includes river lot boundaries in addition to the DLS grid. Available for province: mb.

URL layersource-layertext-fieldSource zoomLayer zoom
river-lotsmb_river_lots0–1412–20
river-lots-labelmb_river_lots_label{descriptor}0–1412–20

NTS grid — British Columbia

Most of British Columbia uses the National Topographic System (NTS). NTS grid tiles cover four levels of the map sheet hierarchy. Available for province: bc.

URL layersource-layertext-fieldSource zoomLayer zoom
seriesbc_series0–140–10
series-labelbc_series_label{descriptor}0–147–10
blockbc_block9–1410–13
block-labelbc_block_label{descriptor}9–1410–13
unitbc_unit9–1413–14
unit-labelbc_unit_label{descriptor}9–1413–14
qtr-unitbc_qtr_unit9–1414–20
qtr-unit-labelbc_qtr_unit_label{descriptor}9–1414–20

Geographic Townships — Ontario

Ontario uses geographic townships with concessions and lots rather than DLS or NTS grids. Available for province: on.

URL layersource-layertext-fieldSource zoomLayer zoom
twpon_twp0–146–12
twp-labelon_twp_label{descriptor}0–146–12
conon_con0–1412–14
con-labelon_con_label{descriptor}0–1412–14
loton_lot0–1414–20
lot-labelon_lot_label{descriptor}0–1414–20

Data layers

Data layers cover geographic and industrial features across Canada. All data tilesets use source zoom 0–12 — they do not contain data above zoom 12, so set your source maxzoom accordingly.

The source-layer name matches the tileset name. The label source-layer name matches the label tileset name.

TilesetLabel tilesettext-fieldPlacementDescription
oil_gas_fieldsoil_gas_fields_label{name}pointPetroleum field boundaries
municipal_boundariesmunicipal_boundaries_label{name}pointMunicipal and county borders
parks_and_protected_areasparks_and_protected_areas_label{name}pointNational and provincial parks
water_bodieswater_bodies_label{name}pointLakes and reservoirs
watercourses(same tileset){name}lineRivers and streams
railways(same tileset){name}lineRailway lines
roads(same tileset){name}mlineRoad network
elevation(same tileset){elevation}mlineContour lines

Example — oil and gas field boundaries with labels:

map.addSource("oil_gas_fields", {
  type: "vector",
  tiles: ["https://maps.townshipcanada.com/oil_gas_fields/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY"],
  minzoom: 0,
  maxzoom: 12
});

map.addLayer({
  id: "oil_gas_fields",
  type: "line",
  source: "oil_gas_fields",
  "source-layer": "oil_gas_fields",
  paint: { "line-color": "#b45309", "line-width": 1 }
});

map.addSource("oil_gas_fields_label", {
  type: "vector",
  tiles: [
    "https://maps.townshipcanada.com/oil_gas_fields_label/{z}/{x}/{y}.mvt?api_key=YOUR_API_KEY"
  ],
  minzoom: 0,
  maxzoom: 12
});

map.addLayer({
  id: "oil_gas_fields_label",
  type: "symbol",
  source: "oil_gas_fields_label",
  "source-layer": "oil_gas_fields_label",
  layout: { "text-field": "{name}", "text-size": 12, "symbol-placement": "point" },
  paint: { "text-color": "#b45309", "text-halo-color": "#fff", "text-halo-width": 1.5 }
});

Styling guide

These color values are used throughout the integration examples and match the Township Canada visual style.

Grid boundaries

Grid levelColorLine width
Township boundaries#2d5a47 (forest green)1.5
Section boundaries#4a7c591.0
Quarter section boundaries#6b9e7a0.75
LSD boundaries#6b9e7a0.5

Data layers

LayerColorNotes
Oil & gas fields#b45309 (amber)Line or fill
Municipal boundaries#6366f1 (indigo)Dashed line — line-dasharray: [4, 2]
Parks and protected areas#16a34a (green)Fill with low opacity
Water bodies#2563eb (blue)Fill
Railways#71717a (gray)Line
Roads#94a3b8 (slate)Line

Label text

paint: {
  'text-color': '#1a1a1a',
  'text-halo-color': '#ffffff',
  'text-halo-width': 2
}

Performance tips

Set source maxzoom to 14 for grid tiles. The tiles are generated at zoom 14 and over-zoom cleanly to higher zoom levels. Loading tiles beyond source zoom 14 wastes requests without adding detail.

Set source maxzoom to 12 for data layers. Data layers contain no additional detail above zoom 12. Setting a higher source maxzoom generates unnecessary tile requests.

// Grid tiles — cap source at 14
map.addSource("ab_twp", {
  type: "vector",
  tiles: ["https://maps.townshipcanada.com/ab/twp/{z}/{x}/{y}.mvt?api_key=KEY"],
  minzoom: 0,
  maxzoom: 14 // Not 20
});

// Data layers — cap source at 12
map.addSource("oil_gas_fields", {
  type: "vector",
  tiles: ["https://maps.townshipcanada.com/oil_gas_fields/{z}/{x}/{y}.mvt?api_key=KEY"],
  minzoom: 0,
  maxzoom: 12 // Not 14 or 20
});

Use layer minzoom/maxzoom to control visibility. Add all sources once, then use layer-level zoom constraints to show each grid level at the right scale. This avoids adding and removing sources dynamically as the user zooms.

// Townships visible at zoom 6–12
map.addLayer({ id: 'ab_twp', ..., minzoom: 6, maxzoom: 12 });

// Sections visible at zoom 12–14
map.addLayer({ id: 'ab_sec', ..., minzoom: 12, maxzoom: 14 });

// LSDs visible at zoom 14+
map.addLayer({ id: 'ab_lsd', ..., minzoom: 14, maxzoom: 20 });

Enable tile caching in your mapping library. Mapbox GL JS, MapLibre GL JS, and OpenLayers all cache vector tiles in memory by default. Avoid clearing the map and re-initializing sources on every state change — update layer visibility instead.

Load only the provinces you need. If your application covers only Alberta and Saskatchewan, add tile sources only for ab and sk. Each province has its own tile URL, so you only fetch and render the data you need.


Quick reference

URL segmentValues
{province}ab, sk, mb, bc, on
DLS grid layerstwp, twp-label, sec, sec-label, qtr, qtr-label, lsd, lsd-label
NTS grid layersseries, series-label, block, block-label, unit, unit-label, qtr-unit, qtr-unit-label
MB river lotsriver-lots, river-lots-label
Ontario layerstwp, twp-label, con, con-label, lot, lot-label
Tile formatMVT (Mapbox Vector Tiles)
Grid source maxzoom14
Data source maxzoom12