The finished map sheet — doctrinal, georeferenced, printable.

The IMINT analyst's daily deliverable isn't just a screenshot — it's a standardized map-sheet product with marginalia, classification, a geo-accurate graticule, and (for area coverage) a multi-sheet atlas. Production Cartography extends the WYSIWYG Layout Designer with doctrinal templates (INTREP / IPB / AGM), a geo-accurate neatline graticule, and an atlas-series orchestrator. The RemoteView production-cartography parity — the one residual gap for the imagery-analyst customer.

INTREP · IPB · AGMGeo-accurate neatlineAtlas series WYSIWYG Layout DesignerPDF · PNG · GeoTIFF
Doctrinal templates

The standardized products, out of the box

Four built-in seed layouts in the Layout Designer — each a finished map sheet with the doctrinal marginalia blocks, ready to bind to a captured map frame and print.

  • INTREP Overlay — Intelligence Report map sheet: map frame with geo-accurate graticule, classification banners, title block with DTG + serial number, legend, north arrow, scale bar.
  • IPB Overlay — Intelligence Preparation of the Battlefield: map with a GRG grid-reference overlay, obstacle-belt + AO/AI boundary legends.
  • AGM Map Sheet — Advanced Graphic Memory standard sheet: full-bleed map with 1° neatline, sheet-index locus diagram, elevation-profile box, standard marginalia (sheet number, edition, datum, projection).
  • Strip / Route Map — multi-page linear product (one page per leg) demonstrating the multi-page layout capability.

Each is a fully editable LayoutDocument — duplicate any seed into a user layout and tune the element positions, sizes, and content for your unit's house style.

/api/layouts
# the doctrinal seeds are built-in layouts
GET /api/layouts
→ [{ "id":"intrep-overlay",
     "name":"INTREP Overlay", … },
   { "id":"ipb-overlay", … },
   { "id":"agm-map-sheet", … },
   { "id":"strip-map", … }, …]

# render a finished sheet (PNG/PDF/GeoTIFF)
POST /api/layouts/render
{ "format":"pdf",
  "layout":{ "id":"intrep-overlay", … },
  "dpi":300,
  "elements":{ "map":{
    "mapDataUrl":"data:image/png;…",
    "extent":[-76.5,38.9,-76.4,39.0] } } }

→ application/pdf  (the finished sheet)
Geo-accurate neatline

A graticule that knows where it is

The neatline element reads the bound map frame's captured extent and draws a real lat/lon graticule at the configured density (1° / 30′ / 10′ / 1′) — interior grid lines, edge tick marks, and DD or DMS edge labels with a white halo for legibility over any map. No longer a cosmetic uniform grid; a geo-referenced one.

🌐

Lat/lon graticule

Interior lines + edge ticks at every multiple of the density within the extent. Longitude lines run top→bottom; latitude lines run left→right.

🏷️

DD or DMS labels

Edge values in decimal degrees or degrees-minutes-seconds with hemisphere, drawn with a 4-direction white halo so they read over any basemap.

📐

Bound to the map frame

The neatline overlays a specific mapFrame element by id and reads its captured extent:[w,s,e,n] — the graticule matches the view, not a guess.

MGRS cell labels (server-side MGRS graticule) are the deferred Phase 3; lat/lon is the 90% case and ships now.

Atlas series

Tile one layout across the whole AOI

The atlas orchestrator turns one layout into a multi-sheet series covering an area of interest — the QGIS Atlas analog, for spatial tiling rather than feature iteration.

🗺️

Snap-to-grid sheets

Sheet boundaries snap to whole-degree or standard-fraction lines (the map-sheet convention), so adjacent series align and sheets tile cleanly.

🔢

Self-documenting

Each sheet's seriesIndex element (the locus diagram) shows the series grid with the current sheet highlighted — every sheet knows where it sits in the series.

📄

Multi-format render

Each sheet renders via the unchanged /api/layouts/render path (PDF / PNG / GeoTIFF); the series render returns the per-sheet render set for concatenation.

/api/layouts/{id}/atlas
# tile the AGM sheet across an AOI at 0.25° (~1:50k)
POST /api/layouts/agm-map-sheet/atlas
{ "aoi":[[−76.5,38.9],[−76.0,38.9],[−76.0,39.2],[−76.5,39.2]],
  "sheetSizeDeg":0.25 }

→ { "seriesId":"atlas-a1b2c3d4",
    "cols":3, "rows":2,
    "sheets":[{ "sheetId":"…-sheet-001",
      "sheetNumber":1, "col":1, "row":1,
      "extent":[−76.5,38.75,−76.25,39.0] }, …] }

The map sheet is the deliverable. Print it doctrinally.

Built on the reporting + exploitation stack — the analyst's finished product, in their unit's format.

Get Started