Skip to main content

CRS Definitions

@math.gl/crs provides lightweight, proj4-independent TypeScript definitions and syntax codecs for coordinate reference systems. It has no runtime dependencies and is browser-safe.

The Coordinate Reference Systems developer guide explains CRS families, representations, coordinate epochs, axis order, vertical coordinates, transformation boundaries, and cross-library integration in depth.

Installation

npm install @math.gl/crs

Definition model

CRSDefinition accepts either a string serialization or a strict PROJJSON CRS object:

import type {CRSDefinition, PROJJSONCRS} from '@math.gl/crs';

const authorityCode: CRSDefinition = 'EPSG:4326';
const projString: CRSDefinition = '+proj=longlat +datum=WGS84 +no_defs';
const wkt2: CRSDefinition = 'GEOGCRS["WGS 84", /* ... */]';

const projjson: PROJJSONCRS = {
type: 'GeographicCRS',
name: 'WGS 84',
datum: {
name: 'World Geodetic System 1984',
ellipsoid: {
name: 'WGS 84',
semi_major_axis: 6378137,
inverse_flattening: 298.257223563
}
}
};

The string aliases (CRSIdentifier, WKTCRSDefinition, and PROJStringDefinition) document intent but are all structurally string. Call the appropriate parser when syntax needs to be inspected or validated.

PROJJSON and WKT

PROJJSON is maintained by the OSGeo PROJ project. It is not independently an OGC or ISO standard; it is designed as a lossless JSON encoding of OGC WKT2:2019 / ISO 19162:2019 and is referenced by OGC standards.

Strict PROJJSON v0.7 is the canonical semantic object model in @math.gl/crs. The WKT and PROJ ASTs are syntax models: they preserve ordering, duplicates, number lexemes, delimiter choice, and unknown extensions without claiming semantic equivalence or universal PROJJSON conversion.

WKT syntax

parseWKTCRS parses WKT1 and WKT2 serializations, including common GDAL and ESRI extensions, into a discriminated WKTCRSAst. Parsing is tolerant by default. validateWKTCRS can check a WKT1, WKT2:2015, or WKT2:2019 profile, and strict: true makes parsing reject validation issues.

import {encodeWKTCRS, parseWKTCRS, validateWKTCRS} from '@math.gl/crs';

const ast = parseWKTCRS('GEOGCRS["WGS 84",ID["EPSG",4326]]');
const issues = validateWKTCRS(ast, {profile: 'wkt2:2019'});
const compact = encodeWKTCRS(ast);
const pretty = encodeWKTCRS(ast, {format: 'pretty'});

The parser preserves keyword spelling, bracket or parenthesis delimiters, value order, repeated elements, unknown nodes, and the source lexeme for each number. WKTCRSSyntaxError reports a zero-based source offset and one-based line and column.

PROJ string syntax

parsePROJString parses ordinary definitions and pipelines into an ordered PROJStringAst. Duplicate parameters, flags, quoted values, global pipeline parameters, and step separators are preserved. encodePROJString emits canonical leading + signs and normalized whitespace.

import {encodePROJString, parsePROJString} from '@math.gl/crs';

const ast = parsePROJString('+proj=pipeline +ellps=GRS80 +step +proj=unitconvert +xy_in=deg');
const text = encodePROJString(ast);

Shell command-line syntax and PROJ resource or init-file parsing are intentionally outside the scope of this codec.

Spatial-reference descriptors

SpatialReference reports how a dataset's coordinates are defined without claiming that they were transformed. Its discriminated CRS state preserves explicit definitions, specification defaults, explicitly unknown values, and absent metadata.

import {createSpatialReference} from '@math.gl/crs';

const spatialReference = createSpatialReference({
crs: {
state: 'explicit',
definition: 'EPSG:4326',
representation: 'identifier',
provenance: 'metadata'
},
coordinateFrame: 'geographic',
coordinateOrder: ['x', 'y'],
units: ['degree', 'degree']
});

The descriptor can retain alternate source representations and a coordinate epoch. PROJJSON definitions and descriptor-owned arrays are cloned and recursively frozen. See the Spatial Reference API.

API

  • CRSDefinition<T extends PROJJSONCRS = PROJJSONCRS> — a string definition or PROJJSON object.
  • PROJJSONCRS — generated from the official v0.7 schema's #/definitions/crs.
  • PROJJSONCRSType — all top-level PROJJSON CRS type literals.
  • PROJJSONCRSByType<T> — the discriminated subset for one or more top-level types.
  • PROJJSON_SCHEMA_VERSION'0.7'.
  • PROJJSON_SCHEMA_URL — the canonical official schema URL.
  • WKTCRSAst, WKTCRSNode, WKTCRSValue — value-preserving WKT syntax tree types.
  • parseWKTCRS, encodeWKTCRS, validateWKTCRS — WKT syntax codec and profile validation.
  • PROJStringAst, PROJParameter — ordered PROJ syntax tree types.
  • parsePROJString, encodePROJString — ordinary definition and pipeline syntax codec.
  • SpatialReference, CRSReference — immutable discovery descriptors with explicit state, representation, provenance, epoch, frame, order, and units.
  • ReadonlyCRSDefinition, ReadonlyPROJJSONCRS — serialized CRS text or a deeply readonly PROJJSON definition.
  • createSpatialReference — constructs and freezes a descriptor.
  • inferCRSRepresentation — conservatively classifies a definition's runtime syntax.

The official MIT-licensed schema is vendored unchanged and can be imported or resolved through @math.gl/crs/projjson.schema.json. It is the PROJJSON runtime validation source of truth. The package does not add a second Zod schema. It also does not perform coordinate transformations, authority-registry lookup, semantic CRS comparison, or WKT/PROJ-to-PROJJSON conversion.