← 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.
Projections and print
Maps that have to look right on paper, in the projection a cartographer would choose.
| Capability | MapLibre GL JS | OnlyMapJS |
|---|---|---|
| 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.
| Capability | MapLibre GL JS | OnlyMapJS |
|---|---|---|
| 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.
| Capability | MapLibre GL JS | OnlyMapJS |
|---|---|---|
| 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.
| Capability | MapLibre GL JS | OnlyMapJS |
|---|---|---|
| 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.
| Capability | MapLibre GL JS | OnlyMapJS |
|---|---|---|
| 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.