NIKA OnlyMapJS Latest release
Discord GitHub Docs

← OnlyMapJS Gallery / Getting started

OnlyMapJS and MapLibre

OnlyMapJS draws its basemaps with MapLibre, so this is not a choice between rivals. MapLibre GL JS renders and styles vector-tile maps. OnlyMapJS adds what a data map needs on top of one, written as HTML.

Not available not in MapLibre or its plugin list Plugin a separate plugin or custom layer Partly / Experimental in MapLibre, with the limit noted

Projections and print

Maps that have to look right on paper, in the projection a cartographer would choose.

CapabilityMapLibre GL JSOnlyMapJS
A map in a real projection, using ordinary web tiles ExperimentalSince 6.15, addProjection registers a planar CRS, but every tile source must already be cut in that projection's grid. Tiles are not reprojected. crs="EPSG:5070". Standard web tiles, OpenFreeMap's vector basemaps and shaded relief are reprojected on the GPU. The projection switches live.
Data stored in a local grid (eastings and northings) Not availableGeoJSON must be longitude and latitude. Convert it yourself. Read from a shapefile .prj or a FlatGeobuf or GeoParquet header, or declared with crs on the layer.
Vector SVG export with editable labels PluginExperimental in maplibre-gl-export. It exports a raster image by default. snapshot({ format: "svg" }): paths stay paths, and labels are real text, following their line.
Print layouts measured in millimetres Not available <om-cartograph> sheets with legends, scale bars, graticules and north arrows, and <om-atlas> for one page per feature.
Print finishes on the rendered map Not available <om-effect preset="vintage">: grain, halftone, engraving, edge and tint looks, sized in millimetres.
Geometry generalised at draw time PartlyContour lines from a DEM through maplibre-contour. GeoJSON is simplified only for tiling. <om-transform>: simplify, smooth, buffer, dot density and contours.
Class breaks computed from the data Not availableYou supply the breaks to step or interpolate. classify-scale="jenks" (or quantile, equal interval) with a named colour ramp and a legend made for you.

Terrain and bathymetry

A seafloor or a survey of your own, not just the global elevation tiles.

CapabilityMapLibre GL JSOnlyMapJS
Several elevation datasets on one map Not availableTerrain takes a single DEM source. Rank <om-terrain> sources: a survey wins inside its extent, and a global grid fills the rest and shows through its gaps.
Gaps and datum differences between datasets Not available nodata turns empty cells into holes, and vertical-offset corrects a datum step. onlymapjs inspect-terrain measures both for you.
Your own GeoTIFF DEM as terrain tiles Not available onlymapjs dem-tiles survey.tif writes the tiles and prints the line to paste.
A camera that holds a set distance above the seabed PartlyThe view centre can stay on the terrain, and the camera is kept above the surface. There is no clearance setting. camera-clearance="15" holds the eye that many metres up, and getCamera() reads its depth.

Data

Point the map at the file you have.

CapabilityMapLibre GL JSOnlyMapJS
Formats read without conversion PluginPlugins exist for CSV, KML, GPX, FlatGeobuf and Cloud-Optimized GeoTIFF. None are listed for Shapefile, GeoArrow or Zarr. data="…" reads CSV, Shapefile, KML, GPX, FlatGeobuf, GeoParquet, Arrow and GeoArrow, and CityJSON. Rasters come from Cloud-Optimized GeoTIFF and Zarr.
Live feeds PartlyupdateData merges changes by id. You write the WebSocket or polling code. data="wss://…" key="id" upserts and reconnects. refresh="5s" polls and keeps the last good data through an outage.

3D and data visualization

deck.gl's layers, without wiring deck.gl to the map yourself.

CapabilityMapLibre GL JSOnlyMapJS
Hexagon and grid aggregation, arcs, animated trips PluginThrough a deck.gl overlay that you set up. Built in: OnlyMapJS is built on deck.gl, with 41 layer types.
glTF models, 3D Tiles and point clouds PluginThrough three.js or babylon.js custom layers, or maplibre-gl-lidar. ScenegraphLayer, Tile3DLayer (Google Photorealistic 3D Tiles included) and PointCloudLayer.
BIM: IFC files with per-element picking Not available BIMLayer parses IFC in the browser. Pick a wall or a window, and isolate, hide or ghost elements. Coarse clash detection is included.
A 3D clip box through every layer Not available clip-box-min and clip-box-max cut the whole scene, with a widget to move the box.

Authoring, interface and testing

What it takes to ship the page around the map.

CapabilityMapLibre GL JSOnlyMapJS
A whole map, written as HTML Not availableThe style is declarative JSON, but the map needs JavaScript. <om-map>, <om-layer> and <om-widget> elements. Edit an attribute and the map updates.
Legends, filter and time sliders, charts, measure and draw PluginCore controls are navigation, scale, attribution, geolocate, fullscreen, terrain and globe. The rest are separate plugins. Built-in widgets, including a legend generated from the layer's own styling.
Guided story tours with a player Not available <om-story> steps on a timeline, with play, pause and scrub.
Undo and redo of map edits Not available Built in, recorded from the page itself. Cmd or Ctrl-Z works.
A validator that says how to fix the page PartlyThe style validator reports errors, without fixes. OmMap.validate() reports errors and warnings, each with a fix.
Tests without a browser or GPU Not availableSince 6.0 MapLibre requires WebGL2. mountForTest() runs your page in vitest or jest, clicks included.

Compared with MapLibre GL JS 6.16.0 on 26 October 2026, using MapLibre's documentation, style specification, changelog and plugins page. MapLibre moves quickly: custom projections arrived in 6.15.0, eight days earlier. Corrections are welcome. MapLibre is a project of the MapLibre Organization. This comparison is independent and is not endorsed by or affiliated with MapLibre.