npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@zwaarcontrast/ol-graticule-luftwaffe-planquadrat

v3.0.0

Published

WWII Luftwaffe Planquadrat map reference grids: Gradnetzmeldeverfahren (GNMV) and Jägermeldenetz (JMN), for ol-graticule.

Readme

@zwaarcontrast/ol-graticule-luftwaffe-planquadrat

WWII Luftwaffe Planquadrat map reference grids for @zwaarcontrast/ol-graticule.

Renders both Luftwaffe grid systems used during the Second World War:

  • Gradnetzmeldeverfahren (GNMV), also called Gradnetz or "grid network", in use from before the war until April 1943 and (in a refined form) for the rest of the war. Six hierarchical levels from the 10° Zusatzzahlgebiet down to the ~1 km Arbeitstrapez (post-1943; pre-1943 ≈ 2.3 km).
  • Jägermeldenetz (JMN), the fighter reporting network introduced on 1 May 1943 to support the air defence of the Reich. Replaces the GNMV's 1° Großtrapez with a 5°×10° Jagdtrapez (Nord/Süd halves) and a 20×20 letter-pair Mitteltrapez (AA..UU, no I); shares Kleintrapez, Meldetrapez, and Arbeitstrapez with the post-1943 GNMV.

Cross-service: the Heer used the metric Deutsches Heeresgitter (Gauß-Krüger), often printed alongside GNMV on shared sheets. The Kriegsmarine used the unrelated Marinequadratkarte.

Luftwaffe GNMV ZZG cells (05 Ost, 15 Ost, 25 Ost) over northern Europe

Live demo: https://zwaarcontrast.nl/ol-graticule/ol-graticule-luftwaffe-planquadrat/

Install

npm install @zwaarcontrast/ol-graticule @zwaarcontrast/ol-graticule-luftwaffe-planquadrat ol

Peers: ol ^10, @zwaarcontrast/ol-graticule. No proj4 dependency - all transforms go through OL's built-in 4326 ↔ view-projection conversion.

Usage

import { UniversalGraticule } from '@zwaarcontrast/ol-graticule';
import { LuftwaffeGridSystem } from '@zwaarcontrast/ol-graticule-luftwaffe-planquadrat';

const gridSystem = new LuftwaffeGridSystem({ system: 'gnmv' });
map.addLayer(new UniversalGraticule({ gridSystem }));

The grid draws cell-centered codes (not edge-axis labels) and progressively subdivides as you zoom in.

Options

| Option | Type | Default | What it does | |---|---|---|---| | system | 'gnmv' | 'jmn' | 'gnmv' | Which Luftwaffe grid to render. | | era | 'pre-1943' | 'post-1943' | 'post-1943' | GNMV only. pre-1943 uses the 4-cell Meldetrapez and lo/ro/lu/ru Arbeitstrapez labels. JMN ignores this option (JMN only existed in its post-1943 form). | | maxDepth | 0-5 | 5 | How deep to go: 0 = ZZG only, 5 = full Arbeitstrapez. | | minCellPx | number | 40 | A level becomes the deepest visible only once its cells are at least this big in pixels. | | minLabelPx | number | 40 | Labels for cells smaller than this aren't drawn. | | densificationPoints | number | 50 | Vertices per line for non-affine view projections (e.g. Web Mercator at high latitude). |

Levels and reference format

| Level | Size | GNMV token | JMN token | |---|---|---|---| | Zusatzzahlgebiet (ZZG) | 10° × 10° | 2-3 digits + O/W/SO/SW | same | | Großtrapez | 1° × 1° | 2 digits | (does not exist; replaced by Jagdtrapez + letter MT) | | Jagdtrapez | 5° × 10° | (does not exist) | N or S | | Mitteltrapez | 15' × 30' | 1 digit (1-8, 4×2 layout) | 2 letters AA..UU (no I) | | Kleintrapez | 5' × 10' | 1 digit (1-9) | same | | Meldetrapez | 1'40" × 3'20" (post-1943) 2'30" × 5' (pre-1943) | 1 digit (1-9 or 1-4) | 1 digit (1-9) | | Arbeitstrapez | 33.33" × 1'06.67" (post-1943) 1'15" × 2'30" (pre-1943) | a-i or lo/ro/lu/ru | a-i |

Worked examples

Berlin Reichstag (52.518720° N, 13.376257° E) under post-1943 GNMV:

15   Ost   33   3   9   7    c
ZZG  hemi  GT   MT  KT  MelT AT

ZZG 15 (lon ten-count 1 + lat ten-count 5 for the 10°×10° box at NW corner 59° N, 10° E), Ost (E hemisphere, N hemisphere); Großtrapez 33 (NW corner 53° N, 13° E); Mitteltrapez 3; Kleintrapez 9; Meldetrapez 7; Arbeitstrapez c.

Köln-Butzweilerhof (50°59'28" N, 6°53'42" E) under JMN:

05   Ost   S    NO   3   2     a
ZZG  hemi  JTr  LMT  KT  MelT  AT

ZZG 05, Ost; Jagdtrapez Süd (south half of the 49°-59° N band); Mitteltrapez NO (row N, col O of the 20×20 letter grid inside the 5°×10° Süd half); KT 3, MelT 2, AT a.

Looking up a grid reference for a coordinate

import {
  encodeGnmv,
  encodeJmn,
} from '@zwaarcontrast/ol-graticule-luftwaffe-planquadrat';

encodeGnmv([52.518720, 13.376257]);              // -> "15O33397c"
encodeGnmv([52.518720, 13.376257], 'pre-1943');  // -> "15O33393ru" (depth 5)
encodeGnmv([52.518720, 13.376257], 'post-1943', 1); // -> "15O33"  (cap depth)

encodeJmn([50.991111, 6.895]);                   // -> "05OSNO32a"

Input order is [latitude, longitude]. Returns undefined for points above 89° N.

Reverse: parse a reference back to a coordinate

import {
  parseRef,
  LuftwaffeGridSystem,
} from '@zwaarcontrast/ol-graticule-luftwaffe-planquadrat';
import { ParseError } from '@zwaarcontrast/ol-graticule';

parseRef('15 Ost 33 3 9 7 c');
//   -> { system: 'gnmv',
//        decoded: { canonical: '15O33397c', formatted: '15 Ost 33 3 9 7 c',
//                   bbox: [13.370370..., 52.518519..., 13.388889..., 52.527778...],
//                   center: [52.523148..., 13.379630...],
//                   depth: 5 } }

parseRef('05 Ost S NO 3 2 a');
//   -> { system: 'jmn',
//        decoded: { canonical: '05OSNO32a', ..., depth: 5 } }

// Or, via the GridSystem (returns view-projection coords for the cell centre):
const grid = new LuftwaffeGridSystem({ system: 'jmn' });
try {
  const center = grid.parseCoordinate('05OSNO32a', map.getView().getProjection());
  map.getView().animate({ center });
} catch (err) {
  if (err instanceof ParseError) console.warn(err.reason);
}

parseRef auto-detects the system (JMN is preferred when both grammars accept the input). Lenient input: case-insensitive, whitespace and / separators ignored, umlauts (Süd/Sud/Sued) all accepted, full words (Ost/Süd) and abbreviations (O/SO) both work.

Primary-source validation

The encoding is cross-checked against four wartime primary sources: a NARA Luftwaffe Abschussmeldung (HJ 26 near Katwijk), the Generalstab der Luftwaffe Weltkarte K-34 Sofia (1942), the Deutsche Heereskarte sheet I 35 NW Kreta with its explicit "Zusatzzahl 23 ost" annotation, and a Bundesarchiv RL 12/143 GNMV planning plate. See VALIDATION.md for the worked cross-checks at each level.

Credits and attribution

Reconstructing how a long-disused military reference system actually worked is patient archival research. This package's encoding and decoding rules are entirely derived from the work of others:

  • Ron Birch and the Halifax JB837 researchers at prwg.co.uk have the most thorough public write-up of the GNMV and JMN levels, including the pre/post-1943 distinction and the worked Reichstag example used as a reference test in this package.
  • The Aircrew Remembered article Luftwaffe Grid Reference System for Action Locations documents the Köln-Butzweilerhof worked example used as the JMN reference test, and credits the (now defunct) http://www.stormbirds.com site for the original write-up.
  • Both pages cite earlier work by Andreas Brekken, an archived edition of Flugzeug magazine, and the https://www.gykes.dk site.

If you publish work that uses this package, please cite the prwg.co.uk and aircrewremembered.com pages alongside this implementation.

License

MIT. See LICENSE.