demo D258
Hex map in React
Snap places to a tidy hex grid so a small region reads as clearly as a large one
type: 'hexmap', lon, lat
This snaps places onto a tidy hex grid so a small region reads as clearly as a large one. It gives every area equal visual weight, so a pattern is not dominated by the physical size of the places on the map.
This is the React version. The grid mounts through the createLatticeGrid adapter, which takes its configuration as ordinary props and hands back the live grid through a ref. The grid below is the same one every other tab runs.
The configuration
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@toclocoinc/lattice-grid@1.71.0/lattice-grid.min.css">
<div id="app"></div>
<script type="module">
import React from 'https://esm.sh/react@18';
import { createRoot } from 'https://esm.sh/react-dom@18/client';
import { createGrid } from 'https://cdn.jsdelivr.net/npm/@toclocoinc/lattice-grid@1.71.0/lattice-grid.esm.min.js';
import { createLatticeReact } from 'https://cdn.jsdelivr.net/npm/@toclocoinc/lattice-grid@1.71.0/modules/react.esm.min.js';
import { createChart } from 'https://cdn.jsdelivr.net/npm/@toclocoinc/lattice-grid@1.71.0/modules/charts.esm.min.js';
import 'https://cdn.jsdelivr.net/npm/@toclocoinc/lattice-grid@1.71.0/modules/chart-hexmap.esm.min.js'; // opt in to the hexmap type
const { LatticeGrid, LatticeChart } = createLatticeReact({ React, createGrid, createChart });
const columns = [
{ field: 'city', title: 'City' },
{ field: 'lon', title: 'Longitude', type: 'number', format: { decimals: 2 } },
{ field: 'lat', title: 'Latitude', type: 'number', format: { decimals: 2 } },
{ field: 'users', title: 'Users (m)', type: 'number', format: { decimals: 1 }, total: 'sum' },
];
const rows = [/* one city a row: city, lon, lat, users */];
function App() {
const [grid, setGrid] = React.useState(null);
return (
<>
{grid && (
<LatticeChart grid={grid} type="hexmap" lon="lon" lat="lat" title="Cities on a hex grid" style={{ height: '340px' }} />
)}
<LatticeGrid
rowKey="id"
columns={columns}
rows={rows}
onGridReady={setGrid}
style={{ height: '320px', marginTop: '14px' }}
/>
</>
);
}
createRoot(document.getElementById('app')).render(<App />);
</script>