Skip to content

50,000 free calls a month, card-free. Get an API key →

Your deliverable opens in a browser, on your own infrastructure.

@mapmap/points draws lidar and photogrammetry clouds inside the map's own WebGL context, so the cloud composites with the basemap, the terrain and every other layer instead of floating in a canvas over them. It reads your class table as written, so a 40 stays a 40, and it runs against a deployment you host, so looking at a cloud is not a metered event.

Point cloud: Stadt Wien - data.wien.gv.at, CC BY 4.0

A cloud on a real map, in a stack you run.

Everything below is shipped today: the renderer, the wire format, the class model and the self-hosted platform underneath them.

Inside the map

One draw call, composited with the basemap

The cloud is a MapLibre custom layer drawn in the map's own WebGL context: one buffer, one draw call, depth-correct against terrain, 3D buildings and every layer you already render. There is no second canvas over the map, and no second camera to keep in step with the first. Set terrainRelative when your heights are measured from a terrain surface and the layer reconstructs the camera from that surface rather than the z = 0 plane, which is the difference between correct point sizes in hilly country and an eye a hundred metres underground. Above: 3,602,663 points of the Pool of London, Tower Bridge and the City behind it, from the Environment Agency's National LIDAR Programme, on real terrain, at 60 frames a second. Contains Environment Agency data. © Environment Agency and database right. Open Government Licence v3.0.

10 bytes a point

A wire format sized for the network

Three Uint16 positions and four Uint8 bytes of colour, with the class riding in the alpha byte: 10 bytes a point against roughly 48 for the naive float encoding, which is the difference between a 10 MB and a 48 MB million-point corridor before compression. Both blocks reach the GPU untouched, as two typed-array views over the downloaded buffer, with no copy and no per-point loop.

The MapMap lidar viewer over the Pool of London with the cloud coloured by class rather than height: ground pale grey, buildings slate, vegetation green and objects orange, with a Point classes key naming the four in the top-right corner
Sensor-agnostic

Your class bytes stay your class bytes

A survey vendor, a national mapping agency and an ASPRS LAS file number their classes differently, and a renderer with an opinion silently mislabels two of the three. The class table is an input here: pass values, labels and colours, and 40 stays 40 rather than being reindexed to 2. The shader is generated per table. Duplicate bytes, values outside 0 to 255 and tables over 16 classes throw at load rather than rendering points that quietly take a neighbour's colour. Above, the survey's own ASPRS classification drawn as itself: ground, buildings, vegetation and objects, with the key naming the four and the Layers control able to switch any of them off in any colour view.

The MapMap lidar viewer looking straight down on Tower Bridge with the basemap undimmed: the bridge deck, its two towers and the quaysides either side drawn as lidar points that sit exactly on the streets and river edges the basemap draws underneath them
In context

Next to routing, geocoding and isochrones

The cloud lands georeferenced on the same map as the road network, so the platform underneath it can answer questions about that network: route to the site, reverse-geocode a location, draw the reachable area. One deployment, one key, one basemap, rather than a viewer in one tab and a mapping stack in another. Above is the same scene straight down with the basemap at full strength: quaysides, dock edges and the bridge deck land on the ones the map draws.

the whole stack, on the practice's own infrastructure
$ docker compose up -d --build
→ tiles · geocoder · router · guidance · territories
→ 0 external map dependencies
Self-hosted

The client opens your URL, not a vendor's

Docker distribution inside your own network: tiles, geocoding and routing on your infrastructure, and the cloud payload served from your own storage. Nothing meters per view, no client data crosses someone else's platform just to be looked at, and there is an SBOM and a security questionnaire ready for the review.

The MapMap lidar viewer over the Pool of London in height colouring, with the pointer on the cloud and a readout beneath it giving the ground position at 51.504455, -0.075008, a range of 597 metres from the camera and a camera altitude of 211 metres, beside a height key running from 1 to 307 metres
Placed honestly

Check the CRS before you trust the position

A cloud in the wrong place is the most common way a first trial fails. The sidecar's anchor is trusted as lng/lat by design and never silently corrected, so validate_geodata and POST /geodata/validate are shipped endpoints you can call to check a dataset's declared CRS against its coordinates before you place it. Above: the viewer's own readout, which says where the pointer lands on the ground and how far away that is. It measures the ground plane rather than the point under the cursor, and the wording says so.

Known limit

Known limits: this is a renderer, not a platform. There is no level-of-detail or streaming system, so the payload is fetched whole and everything stays resident, which suits corridors and sites rather than a whole county in one layer; past a few million points, split the area into several clouds and swap layers by viewport. There is no COPC or LAZ ingest yet, so clouds are baked to the 10-byte format offline before they are served. There is no reprojection, no measurement, no annotation and no access-controlled share link in the SDK today.

Agent-first

We will put your cloud on the map.

Send us a baked corridor or a site, or tell us what you capture, and our AI agents will stand up a working viewer on MapMap with your class table, your colours and your basemap, running on infrastructure you can point a client at. The same way we build MapMap itself. Bakes are a bespoke engagement rather than a subscription: a few days of professional services covering ingest, classification, georeferencing and the viewer, then the payload is yours to serve.