H3 Hexagon Density Map
A million pickup points, delivery drops, or cell measurements plotted one by one is a solid blob that tells you nothing. Binned into Uber H3 hexagons, the same data becomes a shape: where demand concentrates, where coverage thins, which corridor carries the volume. Drop in a CSV with latitude and longitude and it does that in one step.
Resolution is a slider, so you can move from city-wide blocks down to street-level cells and watch the pattern hold or dissolve. That is the part a static heatmap cannot answer: whether a hotspot is one real cluster or an artefact of how coarsely you binned it.
The bars stand up, so the map leans back to meet them. Viewed straight down, a bar a hundred metres tall and one two kilometres tall look identical — height only reads at an angle. Drag with the right mouse button to tilt and rotate freely, or set the angle on a slider.
Nothing is uploaded. Location data is among the most sensitive a company holds — customer addresses, courier traces, subscriber positions — and this page has no server to send it to. The browser enforces that, not a promise.
How to use it
- 01
Load the sample
Opens with 50,000 generated points across Jabodetabek — clustered on twenty-five real centres from Sudirman to Cikarang and Bogor, thinned along the actual commuting corridors, and clipped to the true administrative boundary of the thirteen cities and regencies, so no point lands in the Java Sea.
- 02
Drop your CSV
Latitude and longitude columns are detected by name, not by position, so an export you already have usually works untouched. Rows with blank or out-of-range coordinates are counted and skipped rather than silently placed at zero.
- 03
Zoom, and the resolution follows
Hexagon size tracks the map zoom by default: region-wide blocks when you are looking at a province, city-scale cells for siting a warehouse, neighbourhood cells for driver allocation, street-scale cells when you are down at a shopfront. Uncheck "Auto" — or just drag the slider — to pin one resolution and compare scales yourself.
- 04
Tune the view
Elevation changes bar height, tilt changes the camera angle, and the palette switches between a colourblind-safe scale and two display scales. Hover any hexagon for its count and H3 index — the hit test reads what is actually drawn, so it stays correct when a tall bar hides the one behind it.
CSV columns it reads
Only coordinates are needed. Every other column is ignored, so a full export works without being trimmed first.
| Field | Required | Notes |
|---|---|---|
| latitude | Yes | Decimal degrees. Also accepted: lat, y, lattitude, lat_deg. Matched case-insensitively. |
| longitude | Yes | Decimal degrees. Also accepted: lng, lon, long, x, lon_deg. |
| anything else | Optional | Ignored. The tool counts points per hexagon; it does not read attribute columns. |
How it works
H3 does the heavy lifting, the GPU only draws
A million points reduce to a few thousand hexagons before a single pixel is drawn, so the renderer never has a hard job. The usual recipe for this pairs a map engine with deck.gl, which adds 427 kB compressed and exists to draw millions of primitives — a cost with no return once the aggregation has already done its work. MapLibre alone extrudes the hexagons natively, which is what buys the tilt without the second library.
Bar height is square-rooted, not linear
One downtown cell can hold a hundred times what a suburban cell holds. On a linear scale everything except that one bar flattens against the ground, and the map stops being readable. The square root keeps the ordering while leaving the rest of the city visible.
What each resolution is actually for
Resolution 4 gives 1,770 km² cells and 5 gives 253 km² — province scale, the size you want for counting subscribers per region. Resolution 6 and 7 give 36 km² and 5.2 km², which is city and regency scale. Resolution 8 and 9 give 0.74 km² and 0.105 km²: sub-district cells, the right grain for driver allocation or surge zones. Resolution 10 and 11 give 15,000 m² and 2,150 m² — street scale, where a cell is about a block. The panel prints the exact area for whichever step you are on, so you never work from a remembered table.
Millions of rows do not become millions of hexagons
At street resolution a large file can produce nearly one cell per point, and a million extruded polygons would exhaust the tab before anything appeared. So there is a budget: past it, aggregation narrows to what is on screen, and past that the resolution coarsens one step at a time until it fits. Neither is a silent downgrade — the panel says which one happened and why. Cells smaller than a pixel at the current zoom were never visible anyway.
Resolution is a question, not a setting
Slide it and watch whether a hotspot survives. A cluster that stays put from city blocks down to street level is real; one that appears at a single resolution is usually an artefact of the binning. The panel shows the area of one hexagon at each step so the number means something.
Questions
- Is my location data uploaded anywhere?
- No, and the browser enforces that rather than asking you to trust it. This page is served with connect-src 'none' in its Content-Security-Policy, which forbids fetch, XHR, WebSocket and sendBeacon to every destination — including my own server. The 3D map still works because tiles load as images, and image loading is restricted to one host that only accepts {z}/{x}/{y} addresses. Check it in ten seconds without reading a line of code: curl -sI https://lutfilabs.com/lab/h3hex.html | grep -i content-security
- How many rows can it handle?
- A million points aggregate in under three seconds in a normal browser tab, producing about fourteen thousand hexagons at resolution 8. Coordinates are held in flat typed arrays rather than objects, which is what keeps that from becoming a memory problem. Beyond a few million rows the CSV parse itself becomes the slow part, not the aggregation.
- What is an H3 resolution, in plain terms?
- It is the hexagon size. Resolution 5 is roughly a district, 8 is roughly a neighbourhood at 0.7 km², and 10 is roughly a city block. The panel prints the exact area for whichever step you are on, so you never have to remember the table.
- Can I get the aggregated numbers out, not just the picture?
- Yes. "Cells as CSV" exports one row per hexagon with its H3 index, resolution, point count, and centre coordinates — ready to join against your own data in SQL or a notebook. The PNG export is for the slide; the CSV is for the analysis.
- Do I need an account?
- No account, no email, no trial limit. The tool is a static page; there is nothing to sign up to.
Other tools
RF Sector Coverage Map
Turn a cell site CSV into directional sector coverage on a real map — azimuth, beamwidth, and technology, all drawn in your browser.
Drive Test Map
Render a hundred thousand drive test points on a map, coloured by any metric, with thresholds you set yourself.
Network Config Visualizer
Mikrotik, Cisco, Fortinet, Juniper, VyOS, and Huawei configs drawn as one topology — with secrets masked on screen.