🚧 These docs are a work in progress — content is incomplete and may change without notice.
Skip to content

Concepts ​

Glossary of terms used across the Control Measures and TacticalDraw guides.

Core terms ​

Control measure. A tactical military graphic defined by MIL-STD-2525 / APP-6 — Block, Ambush, Fortified Area, Attack-by-Fire, and the rest. The full list is in the catalog.

Graphic. A concrete instance of a control measure on your map: the value { id, kind, controlPoints, options } together with the GeoJSON derived from it. "Control measure" is the catalog entry (the type); a graphic is the thing a user placed.

Render. The GeoJSON FeatureCollection renderControlMeasure produces from a graphic. One graphic generally renders to several features — the parts of the symbol (an arrow's shaft and head, an area's outline and its teeth). Each feature carries a stable id and properties so you can reconcile renders across edits.

Snapshot. A graphic paired with its render at one moment in time — { measure, render }. It's what draw() and edit() resolve to, and what change listeners receive. The measure is a defensive copy, so references stay valid after the session ends.

Points and validity ​

Draw rule. The MIL-STD-2525 / APP-6 rule for how a user's points define a particular measure: which points are free, which are derived, and how an edit preserves the symbol's geometry. Why dragging one vertex of a Block keeps the stem square, and why some measures require points in a specific order. Each measure declares its rule; TacticalDraw drives drawing and editing from it — no per-measure interaction code in host code.

Input contract. The minimum a graphic's points must satisfy: at least the measure's required number of coordinates, each a finite [lon, lat] pair. Checked at render time. Extra points beyond a measure's maximum are ignored.

Validation mode. How rendering reacts when the input contract is violated: silent (the default) returns an empty render, warn logs, throw raises. You set it per render call. It is not part of a control measure's options.

Geometric degeneracy. Points that satisfy the input contract but can't form the shape — two coincident points giving a zero-length baseline, for example. Always yields an empty render silently, regardless of validation mode, because it's a normal transient state during drawing.

Drawing and editing ​

Map adapter. An engine-neutral interface (MapAdapter) for vector rendering, interaction, and viewport math. It speaks GeoJSON and knows nothing about control measures, so the same TacticalDraw code runs on any engine that has an adapter. See Engines.

Engine. One of the supported map libraries — OpenLayers, MapLibre GL JS, or Leaflet — each with its own adapter. You bring one; TacticalDraw stays the same across all three.

Rubber-band guide. The live preview line shown while drawing or editing a variable-length measure: a polyline through the current points with the cursor as the moving tip, plus a closing segment for areas. Runs alongside the measure's own preview; can be disabled per call.

Sizing ​

Some measures have a size dimension not fixed by their points — a FLOT's scallop radius, a fortified line's tooth size, an antitank ditch's tooth height, and the text height of a measure's amplifier labels (labelSize in meters / labelSizePixels). The same concepts govern how every such size behaves.

Size anchor. Whether a control measure's size is fixed to the ground or to the screen. It's a property of the graphic, carried in its persisted options.

  • Ground-anchored — the graphic carries a meter size. It stays fixed on the terrain and grows or shrinks on screen as you zoom, like everything else on the map.
  • Screen-anchored — the graphic carries a pixel size. Its geometry is re-resolved on every view change so it holds a constant on-screen size regardless of zoom.

Baking. Resolving a screen-anchored (pixel) size to a ground-anchored (meter) size once, at the zoom when the draw or edit finishes. The graphic becomes an ordinary meters graphic, indistinguishable from one drawn directly in meters. Baking is the default; staying screen-anchored is the opt-in. The in-flight preview stays screen-anchored and bakes only on commit.

Size input unit. Whether the user types a size in pixels or meters — an authoring choice, independent of the size anchor. Meters always yield a ground anchor. Pixels either bake to meters (the default) or persist as a screen anchor if you opt in; a meter value can't be screen-anchored.

Label size clamp band. The pixel range a ground-anchored label's rendered text may occupy: clamp(labelSize / resolution, min, max), configured per layer via TextStyleOptions.textSizeMinPixels / textSizeMaxPixels (defaults 8–24 px). Within the band the text scales with its graphic; past either edge it pins to the bound, so zooming out never yields unreadable smudges and zooming in never yields screen-covering text. A style-layer concern — not part of the persisted measure. Screen-anchored labels render their constant pixel size, unclamped.

Styling ​

Symbol color. The single color of a control measure. APP-6 / MIL-STD tactical control measures are monocolor: one color paints every part, whether stroked or filled. Defaults to black. Per-channel stroke and fill overrides exist for cases that must diverge (a translucent area fill, for example). See Styling.

Filledness. Whether a part of a symbol is a solid filled shape (an arrowhead) or an outline. Doctrine fixes it — it's the only paint property a generator dictates. A filled part's color is still just the symbol color. Filledness is per part, not inferred from geometry: many area measures (Block, Fortified Area, Attack-by-Fire) are outlined, not filled.